参考:https://gearyyoung.gitbooks.io/cmake-api/content/cmake/CMake%E8%AF%AD%E6%B3%95.html
罗列几个我自己会用到的:
add_definitions
为源文件的编译添加由-D引入的define flag。
add_definitions(-DFOO -DBAR ...)
在编译器的命令行上,为当前路径以及下层路径的源文件加入一些define flag。这个命令可以用来引入任何flag,但是它的原意是用来引入预处理器的定义。那些以-D或/D开头的、看起来像预处理器定义的flag,会被自动加到当前路径的COMPILE_DEFINITIONS属性中。为了后向兼容,非简单值(non-trival,指的是什么?——译注)的定义会被留在flags组(flags set)里,而不会被转换。关于在特定的域以及配置中增加预处理器的定义,参考路径、目标以及源文件的COMPILE_DEFINITIONS属性来获取更多的细节。
——注:原来在gcc命令中的-D参数,在cmake里就是用add_definitions实现了,用来定义一些宏等
add_executable
使用给定的源文件,为工程引入一个可执行文件。
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
引入一个名为<name>
的可执行目标,该目标会由调用该命令时在源文件列表中指定的源文件来构建。<name>
对应于逻辑目标名字,并且在工程范围内必须是全局唯一的。被构建的可执行目标的实际文件名将根据具体的本地平台创建出来(比如<name>.exe
或者仅仅是<name>
)。
默认情况下,可执行文件将会在构建树的路径下被创建,对应于该命令被调用的源文件树的路径。如果要改变这个位置,查看RUNTIME_OUTPUT_DIRECTORY
目标属性的相关文档。如果要改变最终文件名的<name>
部分,查看OUTPUT_NAME
目标属性的相关文档。
——注:指定要编译输出的可执行文件,例如编一个a.exe
add_library
使用指定的源文件向工程中添加一个库。
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
添加一个名为<name>
的库文件,该库文件将会根据调用的命令里列出的源文件来创建。<name>
对应于逻辑目标名称,而且在一个工程的全局域内必须是唯一的。待构建的库文件的实际文件名根据对应平台的命名约定来构造(比如lib<name>.a
或者<name>.lib
)。指定STATIC
,SHARED
,或者MODULE
参数用来指定要创建的库的类型。STATIC
库是目标文件的归档文件,在链接其它目标的时候使用。SHARED
库会被动态链接,在运行时被加载。MODULE
库是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-
系列的函数动态链接。如果没有类型被显式指定,这个选项将会根据变量BUILD_SHARED_LIBS
的当前值是否为真决定是STATIC
还是SHARED
。
默认状态下,库文件将会在于源文件目录树的构建目录树的位置被创建,该命令也会在这里被调用。查阅ARCHIVE_OUTPUT_DIRECTORY
,LIBRARY_OUTPUT_DIRECTORY
,和RUNTIME_OUTPUT_DIRECTORY
这三个目标属性的文档来改变这一位置。查阅OUTPUT_NAME
目标属性的文档来改变最终文件名的<name>
部分。
——注:如果要编的不是可执行文件,而是一个lib库,例如so, dll等,那就用add_library
add_subdirectory
为构建添加一个子路径。
add_subdirectory(source_dir [binary_dir]
[EXCLUDE_FROM_ALL])
这条命令的作用是为构建添加一个子路径。source_dir选项指定了CMakeLists.txt源文件和代码文件的位置。如果source_dir是一个相对路径,那么source_dir选项会被解释为相对于当前的目录,但是它也可以是一个绝对路径。binary_dir选项指定了输出文件的路径。如果binary_dir是相对路径,它将会被解释为相对于当前输出路径,但是它也可以是一个绝对路径。如果没有指定binary_dir,binary_dir的值将会是没有做任何相对路径展开的source_dir,这也是通常的用法。在source_dir指定路径下的CMakeLists.txt将会在当前输入文件的处理过程执行到该命令之前,立即被CMake处理。
——注:添加子路径,则子路径如何编译,就不用在当前CMakeLists.txt中描述了,而是在子目录里的CMakeLists.txt中描述。这样的CMakeLists.txt更好维护,上层目录的CMakeLists.txt不用关注下层目录中的细节
aux_source_directory
查找在某个路径下的所有源文件。
aux_source_directory(<dir> <variable>)
搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中。该命令主要用在那些使用显式模板实例化的工程上。模板实例化文件可以存储在Templates子目录下,然后可以使用这条命令自动收集起来;这样可以避免手工罗列所有的实例。
使用该命令来避免为一个库或可执行目标写源文件的清单,是非常具有吸引力的。但是如果该命令貌似可以发挥作用,那么CMake就不需要生成一个感知新的源文件何时被加进来的构建系统了(也就是说,新文件的加入,并不会导致CMakeLists.txt过时,从而不能引起CMake重新运行。——译注)。正常情况下,生成的构建系统能够感知它何时需要重新运行CMake,因为需要修改CMakeLists.txt来引入一个新的源文件。当源文件仅仅是加到了该路径下,但是没有修改这个CMakeLists.txt文件,使用者只能手动重新运行CMake来产生一个包含这个新文件的构建系统。
——注:add_executable或add_library需要指定源文件列表,而aux_source_directory可以获取指定目录的源文件列表
configure_file
将一份文件拷贝到另一个位置并修改它的内容。
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
将文件<input>
拷贝到<output>
然后替换文件内容中引用到的变量值。如果<input>
是相对路径,它被评估的基础路径是当前源码路径。<input>
必须是一个文件,而不是个路径。如果<output>
是一个相对路径,它被评估的基础路径是当前二进制文件路径。如果<output>
是一个已有的路径,那么输入文件将会以它原来的名字放到那个路径下。
该命令替换掉在输入文件中,以${VAR}
格式或@VAR@
格式引用的任意变量,如同它们的值是由CMake确定的一样。 如果一个变量还未定义,它会被替换为空。如果指定了COPYONLY
选项,那么变量就不会展开。如果指定了ESCAPE_QUOTES
选项,那么所有被替换的变量将会按照C语言的规则被转义。该文件将会以CMake变量的当前值被配置。如果指定了@ONLY
选项,只有@VAR@
格式的变量会被替换而${VAR}
格式的变量则会被忽略。这对于配置使用${VAR}
格式的脚本文件比较有用。任何类似于#cmakedefine VAR
的定义语句将会被替换为#define VAR
或者/* #undef VAR */
,视CMake中对VAR变量的设置而定。任何类似于#cmakedefine01 VAR
的定义语句将会被替换为#define VAR 1
或#define VAR 0
,视VAR被评估为TRUE或FALSE而定。
(configure_file的作用是让普通文件也能使用CMake中的变量。——译注)
——注:通过configure_file可以实现很多有用的功能。比如在cmakefile中可以获取到git分支名、commit号和当前时间,通过configure_file注入到源代码中,编出来的.exe或.so里就有这些信息了。
execute_process
执行一个或更多个子进程。
link_directories
指定连接器查找库的路径。
link_directories(directory1 directory2 ...)
指定连接器搜索库文件时的路径。该命令仅仅能用在那些在它被调用后才生成的目标上。由于历史上的原因,为该命令指定的相对路径将会不加改变地传递给连接器(不像许多其他CMake命令那样解释为相对于当前源路径的相对路径。)
message
为用户显示一条消息。
set_target_properties
设置目标的一些属性来改变它们构建的方式。
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
target_link_libraries
将给定的库链接到一个目标上。
target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)