cmake 词法和语法

《你所不知的OSG》第一章:CMake初步(2) - OpenSceneGraph教程专区 - OpenSceneGraph中国讨论区-有您OSG在中国才更好 - Powered by Discuz!
词法和语法

在开始本节的学习之前,我们先总结一下之前所了解到的CMake基本词法和命令。

CMake命令通常使用如下的格式:

1. COMMAND( ARG1 ARG2 … )

复制代码
命令关键字之后使用括号来包含所有的参数;各个参数之间使用空格或者换行符分隔;而参数通常有以下几种形式:

变量,以${MY_VAIRABLE}的形式表达,其储存类型为字符串类型,但是可以根据具体命令的要求自动转换为布尔型、整型或者浮点类型。变量可以出现在字符串中,也可以实现“内省”。变量有用户自定义和系统内置两种,用户自定义变量使用SET命令设置;而系统变量由系统自动赋值,例如${PROJECT_SOURCE_DIR}。

枚举量,例如ADD_LIBRARY可以设置要生成的链接库为SHARED或者STATIC,还可以设置为MODULE(插件,可动态调用,但不作为其他工程的依赖),除此之外的赋值都是不能被识别的。

值,也就是任意的字符串内容,它可以用来指示要编译的源代码文件名,也可以表达一段文字提示信息,或者表达特定的功能。值可以使用引号进行标识,多数情况下也可以不用。

前文中我们已经了解到的命令列举如下,此外这里还简要地介绍了另一些可能在各类CMake工程中遇到的命令及其语法格式。CMake部分命令的语法歌是十分复杂,这里仅仅介绍它的某一种实现形式,建议读者阅读CMake的帮助文档以获取更多信息。

括号中为该命令的一个或多个参数项,其中使用“[…]”包含的项表示可忽略项,使用“…|…”分隔的项表示只能选择其中一项。

ADD_CUSTOM_COMMAND(
TARGET name
PRE_BUILD|PRE_LINK|POST_BUILD
COMMAND cmd1 [COMMAND cmd2 …] ):
为目标工程name添加一个或多个新的自定义的编译规则cmd1,cmd2等,执行时机可以选择编译前,链接前或者编译后。它的作用相当于Visual Studio工程的“Custom Build Step”属性。

ADD_CUSTOM_TARGET( name COMMAND cmd1 [COMMAND cmd2 …] ):
添加一个名为name的编译目标,并指定一个或多个自定义的命令cmd1,cmd2等。注意ADD_CUSTOM_COMMAND与这个命令的区别:前者是针对一个已有的子工程进行自定义编译规则的设置;后者则是建立一个新的自定义的目标工程,例如一个专用于将已生成文件拷贝到指定文件夹的INSTALL工程;以及与之作用截然相反的UNINSTALL工程。

ADD_DEFINITIONS( -DMACRO1 –DMACRO2 … ):
添加-D预编译宏定义,可以一次添加多个。

ADD_EXECUTABLE( name [WIN32]
source1 source2 … ):
指定一个名为name的可执行程序工程,其源文件为source1,source2等,此外还可以追加一个枚举量WIN32,表示此程序为Win32程序,使用WinMain作为程序入口。

ADD_LIBRARY( name [STATIC|SHARED|MODULE]
source1 source2 … ):
指定一个名为name的链接库工程,其源文件为source1,source2等,此外还可以指示该工程的生成结果为静态库(STATIC),动态库(SHARED)还是模块(MODULE)。

ADD_SUBDIRECTORY( dir ):
指示下一级CMake脚本所在位置位于dir子目录。

CMAKE_MINIMUM_REQUIRED( VERSION major[.minor[.patch]] ):
指示当前脚本所需的CMake版本,不能低于版本号major.minor.patch。

CONFIGURE_FILE( infile outfile ):
将文件infile复制到outfile的位置,同时执行其中变量的自动配置和更替,即,将infile中所有形同“${VAR}”和“@VAR@”的变量替换为对应的内容,并拷贝到outfile中,而这个新生成的outfile文件也可以在之后的脚本代码中得以使用。

FIND_LIBRARY( ${var}
NAMES name1 [name2 …]
PATHS path1 [path2 …]
PATH_SUFFIXES suffix1 [suffix2 …] ):
搜索一个外部的链接库文件,并将结果的全路径保存到var变量中。要搜索的链接库文件名字可能是name1,name2等;搜索路径为path1,path2等;此外还可以指定路径的后缀词为suffix1,suffix2等。因此,系统将尝试在path1/suffix1,path1/suffix2,path2/suffix1,path2/suffix2这些目录中搜索名为name1或name2的链接库文件,并将结果(路径和文件名)保存到var中。

FIND_PACKAGE( name ):
在指定的模块目录中搜索一个名为Find<name>.cmake(例如,FindOSG.cmake)的CMake脚本模块文件,执行其中的内容,以图搜索到指定的外部依赖库头文件和库文件位置。<br><br>FIND_PATH( ${var}<br> NAMES name1 [name2 …]<br> PATHS path1 [path2 …]<br> PATH_SUFFIXES suffix1 [suffix2 …] ):<br>搜索一个包含name1,name2等文件的目录,并将此路径(不包含文件名)保存到var变量中,搜索路径为path1,path2等;此外还可以指定路径的后缀词为suffix1,suffix2等。通常可以使用此命令来确认外部头文件的依赖路径。<br><br>FIND_PROGRAM( ${var}<br> NAMES name1 [name2 …]<br> PATHS path1 [path2 …]<br> PATH_SUFFIXES suffix1 [suffix2 …] ):<br>搜索一个外部的可执行程序,并将结果的全路径保存到var变量中。要搜索的程序名字可能是name1,name2等;搜索路径为path1,path2等;此外还可以指定路径的后缀词为suffix1,suffix2等。<br><br>INCLUDE( file ):<br>在当前文件中包含另一个CMake脚本文件的内容。<br><br>INCLUDE_DIRECTORIES( dir1 dir2 … ):<br>指定编译器搜索头文件的依赖路径,可以添加多个。<br><br>INSTALL( TARGETS proj1 proj2<br> RUNTIME DESTINATION runtime_dir<br> LIBRARY DESTINATION library_dir<br> ARCHIVE DESTINATION archive_dir):<br>这只是此命令的一种语法格式,安装目标工程proj1,proj2等到指定的文件夹。其中,可执行文件安装到RUNTIME DESTINATION指定的runtime_dir目录;动态链接库安装到LIBRARY DESTINATION指定的library_dir目录;静态链接库安装到ARCHIVE DESTINATION指定的archive_dir目录。如果需要安装头文件或者数据文件,则通常使用INSTALL( FILES … DESTINATION … )的形式。<br><br>LINK_DIRECTORIES( dir1 dir2 … ):<br>设置外部依赖库的搜索路径。<br><br>MESSAGE( [SEND_ERROR|STATUS|FATAL_ERROR] “text” … ):<br>在控制台或者对话框输出一行或多行调试信息文本text,枚举量用于控制信息的类型(错误,状态显示,致命错误)。<br><br>OPTION( ${var} “text” value ):<br>向用户提供一个可选项,提示信息为text,初始值为value,并将最终的结果传递到var变量中。在CMake-GUI中它将以配置选项的方式出现。<br><br>PROJECT( name ):<br>设置整个工程的名称为name。<br><br>SET( variable value<br> [CACHE FILEPATH|PATH|STRING|BOOL “text”] ):<br>定义一个用户自定义变量variable,取值为value。此外还可以使用CACHE关键字,允许用户在CMake-GUI中修改变量的值,修改方式包括文件对话框(FILEPATH),目录对话框(PATH),编辑框(STRING)或者复选框(BOOL),并使用text作为提示信息。<br><br>SET_TARGET_PROPERTIES( name PROPERTIES prop value ):<br>设置名为name的工程的属性,这里主要可选的prop属性包括PROJECT_LABEL, DEBUG_POSTFIX,OUTPUT_NAME等等,value为设置值。<br><br>TARGET_LINK_LIBRARIES( name<br> lib1 lib2 …<br> [debug|optimized] lib1 lib2 … ):<br>指定工程name所用的依赖库,并可以使用debug和optimized关键字分别指定DEBUG与RELEASE版本所用的一个或多个依赖库。</name>


你可能感兴趣的:(cache,脚本)