CMD#2 :add_custom_target
添加一个目标,它没有输出;这样它就老是会被构建。
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
[SOURCES src1 [src2...]])
用Name选项给定的名字添加一个目标,这个目标会引起给定的那些命令。这个目标没有输出文件,而且老是被认为是过期的,即便那些命令试图去建立一个与该目标同名的文件。使用ADD_CUSTOM_COMMAND命令能够生成一个带有依赖性的文件。默认状况下,没有目标会依赖于自定义目标。使用ADD_DEPENDENCIES命令能够添加依赖于该目标或者被该目标依赖的目标。若是指定了ALL选项,这代表这个目标应该被添加到默认的构建目标中,这样它每次都会被构建(命令的名字不能是ALL)。命令和选项是可选的;若是它们没有被指定,将会产生一个空目标。若是设定了WORKING_DIRECTORY参数,该命令会在它指定的路径下执行。若是指定了COMMENT选项,后跟的参数将会在构件的时候,在命令执行以前,被显示出来。DEPENDS选项后面列出来的依赖目标能够引用add_custom_command命令在相同路径下(CMakeLists.txt)生成的输出和文件。
若是指定了VERBATIM选项,全部传递到该命令的选项将会被合适地转义;这样,该命令调用的构建工具会接收到未经改变的参数。注意,CMake语言处理器会在add_custom_target命令在看到这些参数以前对它们进行一层转义。推荐使用该参数,由于它保证了正确的行为。当未指定该参数时,转义的行为依赖于平台,由于CMake没有针对于特定工具中特殊字符的保护措施。
SOURCES选项指定了会被包含到自定义目标中的附加的源文件。指定的源文件将会被添加到IDE的工程文件中,方便在没有构建规则的状况下可以编辑。
CMD#3 :add_definitions
为源文件的编译添加由-D引入的define flag。
add_definitions(-DFOO -DBAR ...)
在编译器的命令行上,为当前路径以及下层路径的源文件加入一些define flag。这个命令能够用来引入任何flag,可是它的原意是用来引入预处理器的定义。那些以-D或/D开头的、看起来像预处理器定义的flag,会被自动加到当前路径的COMPILE_DEFINITIONS属性中。为了后向兼容,非简单值(non-trival,指的是什么?——译注)的定义会被留在flags组(flags set)里,而不会被转换。关于在特定的域以及配置中增长预处理器的定义,参考路径、目标以及源文件的COMPILE_DEFINITIONS属性来获取更多的细节。
CMD#4
为顶层目标引入一个依赖关系。 :
add_dependencies
add_dependencies(target-name depend-target1
depend-target2 ...)
让一个顶层目标依赖于其余的顶层目标。一个顶层目标是由命令ADD_EXECUTABLE,ADD_LIBRARY,或者ADD_CUSTOM_TARGET产生的目标。为这些命令的输出引入依赖性能够保证某个目标在其余的目标以前被构建。查看ADD_CUSTOM_TARGET和ADD_CUSTOM_COMMAND命令的DEPENDS选项,能够了解如何根据自定义规则引入文件级的依赖性。查看SET_SOURCE_FILES_PROPERTIES命令的OBJECT_DEPENDS选项,能够了解如何为目标文件引入文件级的依赖性。
CMD#5
使用给定的源文件,为工程引入一个可执行文件。 :
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目标属性的相关文档。
若是指定了MACOSX_BUNDLE选项,对应的属性会附加在建立的目标上。查看MACOSX_BUNDLE目标属性的文档能够找到更多的细节。
若是指定了EXCLUDE_FROM_ALL选项,对应的属性将会设置在被建立的目标上。查看EXCLUDE_FROM_ALL目标属性的文档能够找到更多的细节。
使用下述格式,add_executable命令也能够用来建立导入的(IMPORTED)可执行目标:
add_executable(<name> IMPORTED)
一个导入的可执行目标引用了一个位于工程以外的可执行文件。该格式不会生成构建这个目标的规则。该目标名字的做用域在它被建立的路径以及底层路径有效。它能够像在该工程内的其余任意目标同样被引用。导入可执行文件为相似于add_custom_command之类的命令引用它提供了便利。
关于导入的可执行文件的细节能够经过设置以IMPORTED_开头的属性来指定。这类属性中最重要的是IMPORTED_LOCATION(以及它对应于具体配置的版本IMPORTED_LOCATION_<CONFIG>);该属性指定了执行文件主文件在磁盘上的位置。查看IMPORTED_*属性的文档来得到更多信息。
CMD#6
使用指定的源文件向工程中添加一个库。 :
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>部分。
若是指定了EXCLUDE_FROM_ALL属性,对应的一些属性会在目标被建立时被设置。查阅EXCLUDE_FROM_ALL的文档来获取该属性的细节。
使用下述格式,add_library命令也能够用来建立导入的库目标:
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)
导入的库目标是引用了在工程外的一个库文件的目标。没有生成构建这个库的规则。这个目标名字的做用域在它被建立的路径及如下有效。他能够向任何在该工程内构建的目标同样被引用。导入库为相似于target_link_libraries命令中引用它提供了便利。关于导入库细节能够经过指定那些以IMPORTED_的属性设置来指定。其中最重要的属性是IMPORTED_LOCATION(以及它的具体配置版本,IMPORTED_LOCATION_<CONFIG>),它指定了主库文件在磁盘上的位置。查阅IMPORTED_*属性的文档获取更多的信息。
CMD#7
为构建添加一个子路径。 :
add_subdirectory
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这条命令的做用是为构建添加一个子路径,告诉cmake去子目录寻找新的CMakeList.txt 子文件。source_dir选项指定了CMakeLists.txt源文件和代码文件的位置。若是source_dir是一个相对路径,那么source_dir选项会被解释为相对于当前的目录,可是它也能够是一个绝对路径。binary_dir选项指定了输出文件的路径。若是binary_dir是相对路径,它将会被解释为相对于当前输出路径,可是它也能够是一个绝对路径。若是没有指定binary_dir,binary_dir的值将会是没有作任何相对路径展开的source_dir,这也是一般的用法。在source_dir指定路径下的CMakeLists.txt将会在当前输入文件的处理过程执行到该命令以前,当即被CMake处理。
若是指定了EXCLUDE_FROM_ALL选项,在子路径下的目标默认不会被包含到父路径的ALL目标里,而且也会被排除在IDE工程文件以外。用户必须显式构建在子路径下的目标,好比一些示范性的例子工程就是这样。典型地,子路径应该包含它本身的project()命令调用,这样会在子路径下产生一份完整的构建系统(好比VS IDE的solution文件)。注意,目标间的依赖性要高于这种排除行为。若是一个被父工程构建的目标依赖于在这个子路径下的目标,被依赖的目标会被包含到父工程的构建系统中,以知足依赖性的要求。
以指定的参数为工程添加一个测试。CMD#8
add_test :
add_test(testname Exename arg1 arg2 ... )
若是已经运行过了ENABLE_TESTING命令,这个命令将为当前路径添加一个测试目标。若是ENABLE_TESTING尚未运行过,该命令啥事都不作。测试是由测试子系统运行的,它会以指定的参数执行Exename文件。Exename或者是由该工程构建的可执行文件,也能够是系统上自带的任意可执行文件(好比tclsh)。该测试会在CMakeList.txt文件的当前工做路径下运行,这个路径与二进制树上的路相对应。
add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
COMMAND <command> [arg1 [arg2 ...]])
若是COMMAND选项指定了一个可执行目标(用add_executable建立),它会自动被在构建时建立的可执行文件所替换。若是指定了CONFIGURATIONS选项,那么该测试只有在列出的某一个配置下才会运行。
在COMMAND选项后的参数可使用“生成器表达式”,它的语法是"$<...>"。这些表达式会在构建系统生成期间,以及构建配置的专有信息的产生期间被评估。合法的表达式是:
$<CONFIGURATION> = 配置名称
$<TARGET_FILE:tgt> = 主要的二进制文件(.exe, .so.1.2, .a)
$<TARGET_LINKER_FILE:tgt> = 用于连接的文件(.a, .lib, .so)
$<TARGET_SONAME_FILE:tgt> = 带有.so.的文件(.so.3)
其中,"tgt"是目标的名称。目标文件表达式TARGET_FILE生成了一个完整的路径,可是它的_DIR和_NAME版本能够生成目录以及文件名部分:
$<TARGET_FILE_DIR:tgt>/$<TARGET_FILE_NAME:tgt>
$<TARGET_LINKER_FILE_DIR:tgt>/$<TARGET_LINKER_FILE_NAME:tgt>
$<TARGET_SONAME_FILE_DIR:tgt>/$<TARGET_SONAME_FILE_NAME:tgt>
用例:
1 add_test(NAME mytest 2 COMMAND testDriver --config $<CONFIGURATION> 3 --exe $<TARGET_FILE:myexe>)
这段代码建立了一个名为mytest的测试,它执行的命令是testDriver工具,传递的参数包括配置名,以及由目标生成的可执行文件myexe的完整路径。
CMD#9
查找在某个路径下的全部源文件。 :
aux_source_directory
aux_source_directory(<dir> <variable>)
搜集全部在指定路径下的源文件的文件名,将输出结果列表储存在指定的<variable>变量中。该命令主要用在那些使用显式模板实例化的工程上。模板实例化文件能够存储在Templates子目录下,而后可使用这条命令自动收集起来;这样能够避免手工罗列全部的实例。
使用该命令来避免为一个库或可执行目标写源文件的清单,是很是具备吸引力的。可是若是该命令貌似能够发挥做用,那么CMake就不须要生成一个感知新的源文件什么时候被加进来的构建系统了(也就是说,新文件的加入,并不会致使CMakeLists.txt过期,从而不能引发CMake从新运行。——译注)。正常状况下,生成的构建系统可以感知它什么时候须要从新运行CMake,由于须要修改CMakeLists.txt来引入一个新的源文件。当源文件仅仅是加到了该路径下,可是没有修改这个CMakeLists.txt文件,使用者只能手动从新运行CMake来产生一个包含这个新文件的构建系统。
CMD#10
从一个包围该命令的foreach或while循环中跳出。 :
break
break()
从包围它的foreach循环或while循环中跳出。
CMD#11
获取构建该工程的命令行。 :
build_command
build_command(<variable>
[CONFIGURATION <config>]
[PROJECT_NAME <projname>]
[TARGET <target>])
把给定的变量<variable>设置成一个字符串,其中包含使用由变量CMAKE_GENERATOR肯定的项目构建工具,去构建某一个工程的某一个目标配置的命令行。
对于多配置生成器,若是忽略CONFIGURATION选项,CMake将会选择一个合理的默认值;而对于单配置生成器,该选项会被忽略。
若是PROJECT_NAME选项被忽略,获得的命令行用来构建当前构建树上的顶层工程。
若是TARGET选项被忽略,获得的命令行能够用来构建全部目标,比较高效的用法是构建目标all或者ALL_BUILD。
build_command(<cachevariable> <makecommand>)
不推荐使用以上的这种格式,但对于后相兼容仍是有用的。只要能够,就要使用第一种格式。
这种格式将变量<cachevariable>设置为一个字符串,其中包含从构建树的根目录,用<makecommand>指定的构建工具构建这个工程的命令。<makecommand>应该是指向msdev,devenv,nmake,make或者是一种最终用户指定的构建工具的完整路径。
CMD#12
设置一个工程所须要的最低CMake版本。 :
cmake_minimum_required
cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]]
[FATAL_ERROR])
若是CMake的当前版本低于指定的版本,它会中止处理工程文件,并报告错误。当指定的版本高于2.4时,它会隐含调用:
cmake_policy(VERSION major[.minor[.patch[.tweak]]])
从而将cmale的策略版本级别设置为指定的版本。当指定的版本是2.4或更低时,这条命令隐含调用:
cmake_policy(VERSION 2.4)
这将会启用对于CMake 2.4及更低版本的兼容性。
FATAL_ERROR选项是能够接受的,可是CMake 2.6及更高的版本会忽略它。若是它被指定,那么CMake 2.4及更低版本将会以错误了结而非仅仅给出个警告。
CMD#13
管理CMake的策略设置。 :
cmake_policy
随着CMake的演变,有时为了搞定bug或改善现有特点的实现方法,改变现有的行为是必须的。CMake的策略机制是在新的CMake版本带来行为上的改变时,用来帮助保持现有项目的构建的一种设计。每一个新的策略(行为改变)被赋予一个"CMP<NNNN>"格式的识别符,其中"<NNNN>"是一个整数索引。每一个策略相关的文档都会描述“旧行为”和“新行为”,以及引入该策略的缘由。工程能够设置各类策略来选择指望的行为。当CMake须要了解要用哪一种行为的时候,它会检查由工程指定的一种设置。若是没有可用的设置,工程假定使用“旧行为”,而且会给出警告要求你设置工程的策略。
cmake_policy是用来设置“新行为”或“旧行为”的命令。若是支持单独设置策略,咱们鼓励各项目根据CMake的版原本设置策略。
cmake_policy(VERSION major.minor[.patch[.tweak]])
上述命令指定当前的CMakeLists.txt是为给定版本的CMake书写的。全部在指定的版本或更早的版本中引入的策略会被设置为使用“新行为”。全部在指定的版本以后引入的策略将会变为无效(unset)。该命令有效地为一个指定的CMake版本请求优先采用的行为,而且告知更新的CMake版本给出关于它们新策略的警告。命令中指定的策略版本必须至少是2.4,不然命令会报告一个错误。为了获得支持早于2.4版本的兼容性特性,查阅策略CMP0001的相关文档。
cmake_policy(SET CMP<NNNN> NEW)
cmake_policy(SET CMP<NNNN> OLD)
对于某种给定的策略,该命令要求CMake使用新的或者旧的行为。对于一个指定的策略,那些依赖于旧行为的工程,经过设置策略的状态为OLD,能够禁止策略的警告。或者,用户可让工程采用新行为,而且设置策略的状态为NEW。
cmake_policy(GET CMP<NNNN> <variable>)
该命令检查一个给定的策略是否设置为旧行为或新行为。若是策略被设置,输出的变量值会是“OLD”或“NEW”,不然为空。
CMake将策略设置保存在一个栈结构中,所以,cmake_policy命令产生的改变仅仅影响在栈顶端的元素。在策略栈中的一个新条目由各子路径自动管理,以此保护它的父路径及同层路径的策略设置。CMake也管理经过include()和find_package()命令加载的脚本中新加入的条目,除非调用时指定了NO_POLICY_SCOPE选项(另外可参考CMP0011)。cmake_policy命令提供了一种管理策略栈中自定义条目的接口:
cmake_policy(PUSH)
cmake_policy(POP)
每一个PUSH必须有一个配对的POP来去掉撤销改变。这对于临时改变策略设置比较有用。
函数和宏会在它们被建立的时候记录策略设置,而且在它们被调用的时候使用记录前的策略。若是函数或者宏实现设置了策略,这个变化会经过调用者(caller)一直上传,自动传递到嵌套的最近的策略栈条目。
CMD#14
将一份文件拷贝到另外一个位置并修改它的内容。 :
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中的变量。——译注)
CMD#15
为构建测试程序建立一个测试驱动器和源码列表。 :
create_test_sourcelist
create_test_sourcelist(sourceListName driverName
test1 test2 test3
EXTRA_INCLUDE include.h
FUNCTION function)
测试驱动器是一个将不少小的测试代码链接为一个单一的可执行文件的程序。这在为了缩减总的需用空间而用不少大的库文件去构建静态可执行文件的时候,特别有用。构建测试驱动所须要的源文件列表会在变量sourceListName中。DriverName变量是测试驱动器的名字。其它的参数还包括一个测试源代码文件的清单,中间能够用分号隔开。每一个测试源码文件中应该有一个与去掉扩展名的文件名同名的函数(好比foo.cxx 文件里应该有int foo(int, char*[]);)(和main的函数签名同样——译注)。DriverName能够在命令行中按名字调用这些测试中的每个。若是指定了EXTRA_INCLUDE,那么它后面的参数(即include.h——译注)会被包含到生成的文件里。若是指定了FUNCTION选项,那么它后面的参数(即function——译注)会被认为是一个函数名,传递给它的参数是一个指向argc的指针和argv。这个选项能够用来为每一个测试函数添加额外的命令行参数处理过程。CMake变量CMAKE_TESTDRIVER_BEFORE_TESTMAIN用来设置在调用测试的main函数以前调用的代码。
CMD#16 :
define_property
定义并描述(Document)自定义属性。
define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
TEST | VARIABLE | CACHED_VARIABLE>
PROPERTY <name> [INHERITED]
BRIEF_DOCS <brief-doc> [docs...]
FULL_DOCS <full-doc> [docs...])
在一个域(scope)中定义一个能够用set_property和get_property命令访问的属性。这个命令对于把文档和能够经过get_property命令获得的属性名称关联起来很是有用。第一个参数肯定了这个属性可使用的范围。它必须是下列值中的一个:
GLOBAL = 与全局命名空间相关联
DIRECTORY = 与某一个目录相关联
TARGET = 与一个目标相关联
SOURCE = 与一个源文件相关联
TEST = 与一个以add_test命名的测试相关联
VARIABLE = 描述(document)一个CMake语言变量
CACHED_VARIABLE = 描述(document)一个CMake语言缓存变量
注意,与set_property和get_property不相同,不须要给出实际的做用域;只有做用域的类型才是重要的。PROPERTY选项必须有,它后面紧跟要定义的属性名。若是指定了INHERITED选项,那么若是get_property命令所请求的属性在该做用域中未设置,它会沿着链条向更高的做用域去搜索。DIRECTORY域向上是GLOBAL。TARGET,SOURCE和TEST向上是DIRECTORY。
BRIEF_DOCS和FULL_DOCS选项后面的参数是和属性相关联的字符串,分别做为变量的简单描述和完整描述。在使用get_property命令时,对应的选项能够获取这些描述信息。
CMD#17
:
else 开始一个if语句块的else部分。
else(expression)
参见if命令。
CMD#18
if 块的 elseif 部分。 :
elseif 开始
elseif(expression)
参见if命令。
CMD#19
(CXX/C/Fortran/等) :
enable_language 支持某种语言
enable_language(languageName [OPTIONAL] )
该命令打开了CMake对参数中指定的语言的支持。这与project命令相同,可是不会建立任何project命令会产生的额外变量。能够选用的语言的类型有CXX,C,Fortran等。若是指定了OPTIONAL选项,用CMAKE_<languageName>_COMPILER_WORKS变量来判断该语言是否被成功支持。
CMD#20 :
enable_testing
打开当前及如下目录中的测试功能。
enable_testing()
为当前及其下级目录打开测试功能。也可参见add_test命令。注意,ctest须要在构建跟目录下找到一个测试文件。所以,这个命令应该在源文件目录的根目录下。
CMD#21
结束foreach语句块中的一系列命令。 :
endforeach
endforeach(expression)
参见FOREACH命令。
CMD#22
结束一个function语句块中的一系列命令。 :
endfunction
endfunction(expression)
参见function命令。
CMD#23
结束一个if语句块中的一系列命令。 :
endif
endif(expression)
参见if命令。
CMD#24
结束一个macro语句块中的一系列命令。 :
endmacro
endmacro(expression)
参见macro命令。
CMD#25
结束一个while语句块中的一系列命令。 :
endwhile
endwhile(expression)
参见while命令。
CMD#26
执行一个或更多个子进程。 :
execute_process
execute_process(COMMAND <cmd1> [args1...]]
[COMMAND <cmd2> [args2...] [...]]
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE])
运行一条或多条命令,使得前一条命令的标准输出以管道的方式成为下一条命令的标准输入。全部进程公用一个单独的标准错误管道。若是指定了WORKING_DIRECTORY选项,后面的路径选项将会设置为子进程的当前工做路径。若是指定了TIMEOUT选项,若是子进程没有在指定的秒数(容许分数)里完成,子进程会自动终止。若是指定了RESULT_VARIABLE选项,该变量将保存为正在运行的进程的结果;它能够是最后一个子进程的整数返回代码,也能够是一个描述错误状态的字符串。若是指定了OUTPUT_VARIABLE或者ERROR_VARIABLE,后面的变量将会被分别设置为标准输出和标准错误管道的值。若是两个管道都是用了相同的变量,它们的输出将会按产生的顺序被合并。若是指定了INPUT_FILE,OUTPUT_FILE 或 ERROR_FILE选项,其后的文件将会分别被附加到第一个进程的标准输入、最后一个进程的标准输出,或者全部进程的标准错误管道上。若是指定了OUTPUT_QUIET后者ERROR_QUIET选项,那么标准输出或标准错误的结果将会被静静的忽略掉。若是为同一个管道指定了多于一个的OUTPUT_*或ERROR_* 选项,优先级是没有指定的。若是没有指定OUTPUT_*或者ERROR_*选项,输出将会与CMake进程自身对应的管道共享。
execute_process命令是exec_program命令的一个较新的功能更增强大的版本。可是为了兼容性的缘由,旧的exec_program命令还会继续保留。
CMD#27
从构建树中导出目标供外部使用。 :
export
export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>]
[APPEND] FILE <filename>)
建立一个名为<filename>的文件,它能够被外部工程包含进去,从而外部工程能够从当前工程的构建树中导入目标。这对于交叉编译那些能够运行在宿主平台的的utility可执行文件,而后将它们导入到另一个编译成目标平台代码的工程中的情形,特别有用。若是指定了NAMESPACE选项,<namespace>字符串将会被扩展到输出文件中的全部目标的名字中。若是指定了APPEND选项,生成的代码将会续接在文件以后,而不是覆盖它。若是一个库目标被包含在export中,可是链接成它的目标没有被包含,行为没有指定。
由该命令建立的文件是与指定的构建树一致的,而且绝对不该该被安装。要从一个安装树上导出目标,参见install(EXPORT)命令。
export(PACKAGE <name>)
在CMake的用户包注册表中,为<name>包(package)存储当前的构建目录。这将有助于依赖于它的工程从当前工程的构建树中查找并使用包而不须要用户的介入。注意,该命令在包注册表中建立的条目,仅仅在与跟构建树一块儿运行的包配置文件(<name>Config.cmake)一块儿使用时才会起做用。
CMD#28 :
file
文件操做命令
file(WRITE filename "message to write"... )
file(APPEND filename "message to write"... )
file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])
file(STRINGS filename variable [LIMIT_COUNT num]
[LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes]
[LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes]
[NEWLINE_CONSUME] [REGEX regex]
[NO_HEX_CONVERSION])
file(GLOB variable [RELATIVE path] [globbing expressions]...)
file(GLOB_RECURSE variable [RELATIVE path]
[FOLLOW_SYMLINKS] [globbing expressions]...)
file(RENAME <oldname> <newname>)
file(REMOVE [file1 ...])
file(REMOVE_RECURSE [file1 ...])
file(MAKE_DIRECTORY [directory1 directory2 ...])
file(RELATIVE_PATH variable directory file)
file(TO_CMAKE_PATH path result)
file(TO_NATIVE_PATH path result)
file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log]
[EXPECTED_MD5 sum] [SHOW_PROGRESS])
WRITE选项将会写一条消息到名为filename的文件中。若是文件已经存在,该命令会覆盖已有的文件;若是文件不存在,它将建立该文件。
APPEND选项和WRITE选项同样,将会写一条消息到名为filename的文件中,只是该消息会附加到文件末尾。
READ选项将会读一个文件中的内容并将其存储在变量里。读文件的位置从offset开始,最多读numBytes个字节。若是指定了HEX参数,二进制代码将会转换为十六进制表达方式,并存储在变量里。
STRINGS将会从一个文件中将一个ASCII字符串的list解析出来,而后存储在variable变量中。文件中的二进制数据会被忽略。回车换行符会被忽略。它也能够用在Intel的Hex和Motorola的S-记录文件;读取它们时,它们会被自动转换为二进制格式。可使用NO_HEX_CONVERSION选项禁止这项功能。LIMIT_COUNT选项设定了返回的字符串的最大数量。LIMIT_INPUT设置了从输入文件中读取的最大字节数。LIMIT_OUTPUT设置了在输出变量中存储的最大字节数。LENGTH_MINIMUM设置了要返回的字符串的最小长度;小于该长度的字符串会被忽略。LENGTH_MAXIMUM设置了返回字符串的最大长度;更长的字符串会被分割成不长于最大长度的字符串。NEWLINE_CONSUME选项容许新行被包含到字符串中,而不是终止它们。REGEX选项指定了一个待返回的字符串必须知足的正则表达式。典型的使用方式是:
file(STRINGS myfile.txt myfile)
该命令在变量myfile中存储了一个list,该list中每一个项是输入文件中的一行文本。
GLOB选项将会为全部匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。文件名查询表达式与正则表达式相似,只不过更加简单。若是为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径。文件名查询表达式的例子有:
*.cxx - 匹配全部扩展名为cxx的文件。
*.vt? - 匹配全部扩展名是vta,...,vtz的文件。
f[3-5].txt - 匹配文件f3.txt, f4.txt, f5.txt。
GLOB_RECURSE选项将会生成一个相似于一般的GLOB选项的list,只是它会寻访全部那些匹配目录的子路径并同时匹配查询表达式的文件。做为符号连接的子路径只有在给定FOLLOW_SYMLINKS选项或者cmake策略CMP0009被设置为NEW时,才会被寻访到。参见cmake --help-policy CMP0009 查询跟多有用的信息。
使用递归查询的例子有:
/dir/*.py - 匹配全部在/dir及其子目录下的python文件。
MAKE_DIRECTORY选项将会建立指定的目录,若是它们的父目录不存在时,一样也会建立。(相似于mkdir命令——译注)
RENAME选项对同一个文件系统下的一个文件或目录重命名。(相似于mv命令——译注)
REMOVE选项将会删除指定的文件,包括在子路径下的文件。(相似于rm命令——译注)
REMOVE_RECURSE选项会删除给定的文件以及目录,包括非空目录。(相似于rm -r 命令——译注)
RELATIVE_PATH选项会肯定从direcroty参数到指定文件的相对路径。
TO_CMAKE_PATH选项会把path转换为一个以unix的 / 开头的cmake风格的路径。输入能够是一个单一的路径,也能够是一个系统路径,好比"$ENV{PATH}"。注意,在调用TO_CMAKE_PATH的ENV周围的双引号只能有一个参数(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。quotes和后面的takes让人后纠结,这句话翻译可能有误。欢迎指正——译注)。
TO_NATIVE_PATH选项与TO_CMAKE_PATH选项很类似,可是它会把cmake风格的路径转换为本地路径风格:windows下用\,而unix下用/。
DOWNLOAD 将给定的URL下载到指定的文件中。若是指定了LOG var选项,下载日志将会被输出到var中。若是指定了STATUS var选项,下载操做的状态会被输出到var中。该状态返回值是一个长度为2的list。list的第一个元素是操做的数字返回值,第二个返回值是错误的字符串值。错误信息若是是数字0,操做中没有发生错误。若是指定了TIMEOUT time选项,在time秒以后,操做会超时退出;time应该是整数。若是指定了EXPECTED_MD5 sum选项,下载操做会认证下载的文件的实际MD5和是否与指望值匹配。若是不匹配,操做将返回一个错误。若是指定了SHOW_PROGRESS选项,进度信息会以状态信息的形式被打印出来,直到操做完成。
file命令还提供了COPY和INSTALL两种格式:
file(<COPY|INSTALL> files... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
COPY版本把文件、目录以及符号链接拷贝到一个目标文件夹。相对输入路径的评估是基于当前的源代码目录进行的,相对目标路径的评估是基于当前的构建目录进行的。复制过程将保留输入文件的时间戳;而且若是目标路径处存在同名同时间戳的文件,复制命令会把它优化掉。赋值过程将保留输入文件的访问权限,除非显式指定权限或指定NO_SOURCE_PERMISSIONS选项(默认是USE_SOURCE_PERMISSIONS)。参见install(DIRECTORY)命令中关于权限(permissions),PATTERN,REGEX和EXCLUDE选项的文档。
INSTALL版本与COPY版本只有十分微小的差异:它会打印状态信息,而且默认使用NO_SOURCE_PERMISSIONS选项。install命令生成的安装脚本使用这个版本(它会使用一些没有在文档中涉及的内部使用的选项。)
CMD#29
查找一个文件的完整路径。 :
find_file
find_file(<VAR> name1 [path1 path2 ...])
这是该命令的精简格式,对于大多数场合它都足够了。它与命令find_file(<VAR> name1 [PATHS path1 path2 ...])是等价的。
find_file(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
这条命令用来查找指定文件的完整路径。一个名字是<VAR>的缓存条目(参见CMakeCache.txt的介绍——译注)变量会被建立,用来存储该命令的结果。若是发现了文件的一个完整路径,该结果会被存储到该变量里而且搜索过程不会再重复,除非该变量被清除。若是什么都没发现,搜索的结果将会是<VAR>-NOTFOUND;而且在下一次以相同的变量调用find_file时,该搜索会从新尝试。被搜索的文件的文件名由NAMES选项后的名字列表指定。附加的其余搜索位置能够在PATHS选项以后指定。若是ENV var在HINTS或PATHS段中出现,环境变量var将会被读取而后被转换为一个系统级环境变量,并存储在一个cmake风格的路径list中。好比,使用ENV PATH将会将系统的path变量列出来。在DOC以后的变量将会用于cache中的文档字符串(documentation string)。PATH_SUFFIXES指定了在每一个搜索路径下的须要搜索的子路径。
若是指定了NO_DEFAULT_PATH选项,那么在搜索时不会附加其它路径。若是没有指定NO_DEFAULT_PATH选项,搜索过程以下:
一、在cmake特有的cache变量中指定的搜索路径搜索。这些路径用于在命令行里用-DVAR=value被设置。若是使用了NO_CMAKE_PATH选项,该路径会被跳过。(此句翻译可能有误——译注。)搜索路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的路径<prefix>,<prefix>/include
变量:CMAKE_INCLUDE_PATH
变量:CMAKE_FRAMEWORK_PATH
二、在cmake特定的环境变量中指定的搜索路径搜索。该路径会在用户的shell配置中被设置。若是指定了NO_CMAKE_ENVIRONMENT_PATH选项,该路径会被跳过。搜索路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的路径<prefix>,<prefix>/include
变量:CMAKE_INCLUDE_PATH
变量:CMAKE_FRAMEWORK_PATH
三、由HINTS选项指定的搜索路径。这些路径是由系统内省(introspection)时计算出来的路径,好比已经发现的其余项的位置所提供的痕迹。硬编码的参考路径应该使用PATHS选项指定。(HINTS与PATHS有何不一样?比后者的优先级高?有疑问。——译注)
四、搜索标准的系统环境变量。若是指定NO_SYSTEM_ENVIRONMENT_PATH选项,搜索路径将跳过其后的参数。搜索路径包括环境变量PATH个INCLUDE。
五、查找在当前系统的平台文件中定义的cmake变量。若是指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。其余的搜索路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的路径<prefix>,<prefix>/include
变量:CMAKE_SYSTEM_INCLUDE_PATH
变量:CMAKE_SYSTEM_FRAMEWORK_PATH
六、搜索由PATHS选项指定的路径或者在命令的简写版本中指定的路径。这通常是一些硬编码的参考路径。在Darwin后者支持OS X框架的系统上,cmake变量CMAKE_FIND_FRAMWORK能够设置为空或者下述值之一:
"FIRST" - 在标准库或者头文件以前先查找框架。对于Darwin系统,这是默认的。
"LAST" - 在标准库或头文件以后再查找框架。
"ONLY" - 只查找框架。
"NEVER" - 从不查找框架。
在Darwin或者支持OS X Application Bundles的系统上,cmake变量CMAKE_FIND_APPBUNDLE能够被设置为空,或者下列值之一:
"FIRST" - 在标准程序以前查找application bundles,这也是Darwin系统的默认选项。
"LAST" - 在标准程序以后查找application bundlesTry。
"ONLY" - 只查找application bundles。
"NEVER" - 从不查找application bundles。
CMake的变量CMAKE_FIND_ROOT_PATH指定了一个或多个在全部其它搜索路径以前的搜索路径。该选项颇有效地将给定位置下的整个搜索路径的最优先路径进行了从新指定。默认状况下,它是空的。当交叉编译一个指向目标环境下的根目录中的目标时,CMake也会搜索那些路径;该变量这时显得很是有用。默认状况下,首先会搜索在CMAKE_FIND_ROOT_PATH变量中列出的路径,而后才是非根路径。设置CMAKE_FIND_ROOT_PATH_MODE_INCLUDE变量能够调整该默认行为。该行为能够在每次调用时被手动覆盖。经过使用CMAKE_FIND_ROOT_PATH_BOTH变量,搜索顺序将会是上述的那样。若是使用了NO_CMAKE_FIND_ROOT_PATH变量,那么CMAKE_FIND_ROOT_PATH将不会被用到。若是使用了ONLY_CMAKE_FIND_ROOT_PATH变量,那么只有CMAKE_FIND_ROOT_PATH中的路径(即re-rooted目录——译注)会被搜索。
通常状况下,默认的搜索顺序是从最具体的路径到最不具体的路径。只要用NO_*选项屡次调用该命令,工程就能够覆盖该顺序。
find_file(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_file(<VAR> NAMES name)
只要这些调用中的一个成功了,返回变量就会被设置并存储在cache中;而后该命令就不会再继续查找了。
CMD#30
查找一个库文件 :
find_library
find_library(<VAR> name1 [path1 path2 ...])
这是该命令的简写版本,在大多数场合下都已经够用了。它与命令find_library(<VAR> name1 [PATHS path1 path2 ...])等价。
find_library(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
该命令用来查找一个库文件。一个名为<VAR>的cache条目会被建立来存储该命令的结果。若是找到了该库文件,那么结果会存储在该变量里,而且搜索过程将再也不重复,除非该变量被清空。若是没有找到,结果变量将会是<VAR>-NOTFOUND,而且在下次使用相同变量调用find_library命令时,搜索过程会再次尝试。在NAMES参数后列出的文件名是要被搜索的库名。附加的搜索位置在PATHS参数后指定。若是再HINTS或者PATHS字段中设置了ENV变量var,环境变量var将会被读取并从系统环境变量转换为一个cmake风格的路径list。例如,指定ENV PATH是获取系统path变量并将其转换为cmake的list的一种方式。在DOC以后的参数用来做为cache中的注释字符串。PATH_SUFFIXES选项指定了每一个搜索路径下待搜索的子路径。
若是指定了NO_DEFAULT_PATH选项,那么搜索的过程当中不会有其余的附加路径。若是没有指定该选项,搜索过程以下:
一、搜索cmake特有的cache变量指定的路径。这些变量是在用cmake命令行时,经过-DVAR=value指定的变量。若是指定了NO_CMAKE_PATH选项,这些路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
二、搜索cmake特有的环境变量指定的路径。这些变量是用户的shell配置中设置的变量。若是指定了NO_CMAKE_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/lib
CMAKE_LIBRARY_PATH
CMAKE_FRAMEWORK_PATH
三、搜索由HINTS选项指定的路径。这些路径是系统内省(introspection)估算出的路径,好比由另外一个已经发现的库文件的地址提供的参考信息。硬编码的推荐路径应该经过PATHS选项指定。
四、查找标准的系统环境变量。若是指定了NO_SYSTEM_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:
PATH
LIB
五、查找在为当前系统的平台文件中定义的cmake变量。若是指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路径<prefix>/lib
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
六、搜索PATHS选项或者精简版命令指定的路径。这些一般是硬编码的推荐搜索路径。
在Darwin或者支持OS X 框架的系统上,cmake变量CMAKE_FIND_FRAMEWORK能够用来设置为空,或者下述值之一:
"FIRST" - 在标准库或头文件以前查找框架。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找框架。
"ONLY" - 仅仅查找框架。
"NEVER" - 从不查找框架。
在Darwin或者支持OS X Application Bundles的系统,cmake变量CMAKE_FIND_APPBUNDLE能够被设置为空或者下面这些值中的一个:
"FIRST" - 在标准库或头文件以前查找application bundles。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找application bundles。
"ONLY" - 仅仅查找application bundles。
"NEVER" - 从不查找application bundles。
CMake变量CMAKE_FIND_ROOT_PATH指定了一个或者多个优先于其余搜索路径的搜索路径。该变量可以有效地从新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时,该变量十分有用:用该变量指向目标环境的根目录,而后CMake将会在那里查找。默认状况下,在CMAKE_FIND_ROOT_PATH中列出的路径会首先被搜索,而后是“非根”路径。该默认规则能够经过设置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出调整。在每次调用该命令以前,均可以经过设置这个变量来手动覆盖默认行为。若是使用了NO_CMAKE_FIND_ROOT_PATH变量,那么只有重定位的路径会被搜索。
默认的搜索顺序的设计逻辑是按照使用时从最具体到最不具体。经过屡次调用find_library命令以及NO_*选项,能够覆盖工程的这个默认顺序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要这些调用中的一个成功返回,结果变量就会被设置而且被存储到cache中;这样随后的调用都不会再行搜索。若是那找到的库是一个框架,VAR将会被设置为指向框架“<完整路径>/A.framework” 的完整路径。当一个指向框架的完整路径被用做一个库文件,CMake将使用-framework A,以及-F<完整路径>这两个选项将框架链接到目标上。
CMD#31
:
find_package 为外部工程加载设置。
find_package(<package> [version] [EXACT] [QUIET]
[[REQUIRED|COMPONENTS] [components...]]
[NO_POLICY_SCOPE])
查找并加载外来工程的设置。该命令会设置<package>_FOUND变量,用来指示要找的包是否被找到了。若是这个包被找到了,与它相关的信息能够经过包自身记载的变量中获得。QUIET选项将会禁掉包没有被发现时的警告信息。REQUIRED选项表示若是报没有找到的话,cmake的过程会终止,并输出警告信息。在REQUIRED选项以后,或者若是没有指定REQUIRED选项可是指定了COMPONENTS选项,在它们的后面能够列出一些与包相关的部件清单(components list)。[version]参数须要一个版本号,它是正在查找的包应该兼容的版本号(格式是major[.minor[.patch[.tweak]]])。EXACT选项要求该版本号必须精确匹配。若是在find-module内部对该命令的递归调用没有给定[version]参数,那么[version]和EXACT选项会自动地从外部调用前向继承。对版本的支持目前只存在于包和包之间(详见下文)。
用户代码整体上应该使用上述的简单调用格式查询须要的包。本命令文档的剩余部分则详述了find_package的完整命令格式以及具体的查询过程。指望经过该命令查找并提供包的项目维护人员,咱们鼓励你能继续读下去。
该命令在搜索包时有两种模式:“模块”模式和“配置”模式。当该命令是经过上述的精简格式调用的时候,合用的就是模块模式。在该模式下,CMake搜索全部名为Find<package>.cmake的文件,这些文件的路径由变量由安装CMake时指定的CMAKE_MODULE_PATH变量指定。若是查找到了该文件,它会被CMake读取并被处理。该模式对查找包,检查版本以及生成任何别的必须信息负责。许多查找模块(find-module)仅仅提供了有限的,甚至根本就没有对版本化的支持;具体信息查看该模块的文档。若是没有找到任何模块,该命令会进入配置模式继续执行。
完整的配置模式下的命令格式是:
find_package(<package> [version] [EXACT] [QUIET]
[[REQUIRED|COMPONENTS] [components...]] [NO_MODULE]
[NO_POLICY_SCOPE]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_PACKAGE_REGISTRY]
[NO_CMAKE_BUILDS_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])
NO_MODULE能够用来明确地跳过模块模式。它也隐含指定了不使用在精简格式中使用的那些选项。
配置模式试图查找一个由待查找的包提供的配置文件的位置。包含该文件的路径会被存储在一个名为<package>_DIR的cache条目里。默认状况下,该命令搜索名为<package>的包。若是指定了NAMES选项,那么其后的names参数会取代<package>的角色。该命令会为每一个在names中的name搜索名为<name>Config.cmake或者<name全小写>-config.cmake的文件。经过使用CONFIGS选项能够改变可能的配置文件的名字。如下描述搜索的过程。若是找到了配置文件,它将会被CMake读取并处理。因为该文件是由包自身提供的,它已经知道包中内容的位置。配置文件的完整地址存储在cmake的变量<package>_CONFIG中。
全部CMake要处理的配置文件将会搜索该包的安装信息,而且将该安装匹配的适当版本号(appropriate version)存储在cmake变量<package>_CONSIDERED_CONFIGS中,与之相关的版本号(associated version)将被存储在<package>_CONSIDERED_VERSIONS中。
若是没有找到包配置文件,CMake将会生成一个错误描述文件,用来描述该问题——除非指定了QUIET选项。若是指定了REQUIRED选项,而且没有找到该包,将会报致命错误,而后配置步骤终止执行。若是设置了<package>_DIR变量被设置了,可是它没有包含配置文件信息,那么CMake将会直接无视它,而后从新开始查找。
若是给定了[version]参数,那么配置模式仅仅会查找那些在命令中请求的版本(格式是major[.minor[.patch[.tweak]]])与包请求的版本互相兼容的那些版本的包。若是指定了EXACT选项,一个包只有在它请求的版本与[version]提供的版本精确匹配时才能被找到。CMake不会对版本数的含义作任何的转换。包版本号由包自带的版本文件来检查。对于一个备选的包配置文件<config-file>.cmake,对应的版本文件的位置紧挨着它,而且名字或者是<config-file>-version.cmake或者是<config-file>Version.cmake。若是没有这个版本文件,那么配置文件就会认为不兼容任何请求的版本。当找到一个版本文件以后,它会被加载而后用来检查(find_package)请求的版本号。版本文件在一个下述变量被定义的嵌套域中被加载:
PACKAGE_FIND_NAME = <package>名字。
PACKAGE_FIND_VERSION = 请求的完整版本字符串
PACKAGE_FIND_VERSION_MAJOR = 若是被请求了,那么它是major版本号,不然是0。
PACKAGE_FIND_VERSION_MINOR = 若是被请求了,那么它是minor版本号,不然是0。
PACKAGE_FIND_VERSION_PATCH = 若是被请求了,那么它是patch版本号,不然是0。
PACKAGE_FIND_VERSION_TWEAK = 若是被请求了,那么它是tweak版本号,不然是0。
PACKAGE_FIND_VERSION_COUNT = 版本号包含几部分,0到4。
版本文件会检查自身是否知足请求的版本号,而后设置了下面这些变量:
PACKAGE_VERSION = 提供的完整的版本字符串。
PACKAGE_VERSION_EXACT = 若是版本号精确匹配,返回true。
PACKAGE_VERSION_COMPATIBLE = 若是版本号相兼容,返回true。
PACKAGE_VERSION_UNSUITABLE = 若是不适合任何版本,返回true。
下面这些变量将会被find_package命令检查,用以肯定配置文件是否提供了可接受的版本。在find_package命令返回后,这些变量就不可用了。若是版本可接受,下述的变量会被设置:
<package>_VERSION = 提供的完整的版本字符串。
<package>_VERSION_MAJOR = 若是被请求了,那么它是major版本号,不然是0。
<package>_VERSION_MINOR = 若是被请求了,那么它是minor版本号,不然是0。
<package>_VERSION_PATCH = 若是被请求了,那么它是patch版本号,不然是0。
<package>_VERSION_TWEAK = 若是被请求了,那么它是tweak版本号,不然是0。
<package>_VERSION_COUNT = 版本号包含几部分,0到4。
而后,对应的包配置文件才会被加载。当多个包配置文件均可用时,而且这些包的版本文件都与请求的版本兼容,选择哪一个包将会是不肯定的。不该该假设cmake会选择最高版本或者是最低版本。(以上的若干段是对find_package中版本匹配步骤的描述,并不须要用户干预——译注。)
配置模式提供了一种高级接口和搜索步骤的接口。这些被提供的接口的大部分是为了完整性的要求,以及在模块模式下,包被find-module加载时供内部使用。大多数用户仅仅应该调用:
find_package(<package> [major[.minor]] [EXACT] [REQUIRED|QUIET])
来查找包。鼓励那些须要提供CMake包配置文件的包维护人员应该命名这些文件并安装它们,这样下述的整个过程将会找到它们而不须要使用附加的选项。
CMake为包构造了一组可能的安装前缀。在每一个前缀下,若干个目录会被搜索,用来查找配置文件。下述的表格展现了待搜索的路径。每一个条目都是专门为Windows(W),UNIX(U)或者Apple(A)约定的安装树指定的。
<prefix>/ (W)
<prefix>/(cmake|CMake)/ (W)
<prefix>/<name>*/ (W)
<prefix>/<name>*/(cmake|CMake)/ (W)
<prefix>/(share|lib)/cmake/<name>*/ (U)
<prefix>/(share|lib)/<name>*/ (U)
<prefix>/(share|lib)/<name>*/(cmake|CMake)/ (U)
在支持OS X平台和Application Bundles的系统上,包含配置文件的框架或者bundles会在下述的路径中被搜索:
<prefix>/<name>.framework/Resources/ (A)
<prefix>/<name>.framework/Resources/CMake/ (A)
<prefix>/<name>.framework/Versions/*/Resources/ (A)
<prefix>/<name>.framework/Versions/*/Resources/CMake/ (A)
<prefix>/<name>.app/Contents/Resources/ (A)
<prefix>/<name>.app/Contents/Resources/CMake/ (A)
在全部上述状况下,<name>是区分大小写的,而且对应于在<package>或者由NAMES给定的任何一个名字。
这些路径集用来与那些在各自的安装树上提供了配置文件的工程协做。上述路径中被标记为(W)的是专门为Windows上的安装设置的,其中的<prefix>部分多是一个应用程序的顶层安装路径。那些被标记为(U)的是专门为UNIX平台上的安装设置的,其中的<prefix>被多个包共用。这仅仅是个约定,所以,全部(W)和(U)路径在全部平台上都仍然会被搜索。那些被标记为(A)的路径是专门为Apple平台上的安装设置的。CMake变量CMAKE_FIND_FRAMEWORK和CMAKE_FIND_APPBUNDLE肯定了偏好的顺序,以下所示:
安装前缀是经过如下步骤被构建出来的。若是指定了NO_DEFAULT_PATH选项,全部NO_*选项都会被激活。
一、搜索在cmake特有的cache变量中指定的搜索路径。这些变量是为了在命令行中用-DVAR=value选项指定而设计的。经过指定NO_CMAKE_PATH选项能够跳过该搜索路径。搜索路径还包括:
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
二、搜索cmake特有的环境变量。这些变量是为了在用户的shell配置中进行配置而设计的。经过指定NO_CMAKE_ENVIRONMENT_PATH选项能够跳过该路径。搜索的路径包括:
<package>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
三、搜索HINTS选项指定的路径。这些路径应该是由操做系统内省时计算产生的,好比由其它已经找到的项的位置而提供的线索。硬编码的参考路径应该在PATHS选项中指定。
四、搜索标准的系统环境变量。若是指定了NO_SYSTEM_ENVIRONMENT_PATH选项,这些路径会被跳过。以"/bin"或"/sbin"结尾的路径条目会被自动转换为它们的父路径。搜索的路径包括:
PATH
五、搜索在CMake GUI中最新配置过的工程的构建树。能够经过设置NO_CMAKE_BUILDS_PATH选项来跳过这些路径。这是为了在用户正在依次构建多个相互依赖的工程时而准备的。
六、搜索存储在CMake用户包注册表中的路径。经过设置NO_CMAKE_PACKAGE_REGISTRY选项能够跳过这些路径。当CMake嗲用export(PACKAGE<name>)配置一个工程时,这些路径会被存储在注册表中。参见export(PACKAGE)命令的文档阅读更多细节。
七、搜索在当前系统的平台文件中定义的cmake变量。能够用NO_CMAKE_SYSTEM_PATH选项跳过这些路径。
CMAKE_SYSTEM_PREFIX_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH
八、搜索由PATHS选项指定的路径。这些路径通常是硬编码的参考路径。
在Darwin或者支持OS X 框架的系统上,cmake变量CMAKE_FIND_FRAMEWORK能够用来设置为空,或者下述值之一:
"FIRST" - 在标准库或头文件以前查找框架。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找框架。
"ONLY" - 仅仅查找框架。
"NEVER" - 从不查找框架。
在Darwin或者支持OS X Application Bundles的系统,cmake变量CMAKE_FIND_APPBUNDLE能够被设置为空或者下面这些值中的一个:
"FIRST" - 在标准库或头文件以前查找application bundles。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找application bundles。
"ONLY" - 仅仅查找application bundles。
"NEVER" - 从不查找application bundles。
CMake变量CMAKE_FIND_ROOT_PATH指定了一个或者多个优先于其余搜索路径的搜索路径。该变量可以有效地从新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时,该变量十分有用:用该变量指向目标环境的根目录,而后CMake将会在那里查找。默认状况下,在CMAKE_FIND_ROOT_PATH中列出的路径会首先被搜索,而后是“非根”路径。该默认规则能够经过设置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出调整。在每次调用该命令以前,均可以经过设置这个变量来手动覆盖默认行为。若是使用了NO_CMAKE_FIND_ROOT_PATH变量,那么只有重定位的路径会被搜索。
默认的搜索顺序的设计逻辑是按照使用时从最具体到最不具体。经过屡次调用find_library命令以及NO_*选项,能够覆盖工程的这个默认顺序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要这些调用中的一个成功返回,结果变量就会被设置而且被存储到cache中;这样随后的调用都不会再行搜索。若是那找到的库是一个框架,VAR将会被设置为指向框架“<完整路径>/A.framework” 的完整路径。当一个指向框架的完整路径被用做一个库文件,CMake将使用-framework A,以及-F<完整路径>这两个选项将框架链接到目标上。
参见cmake_policy()命令的文档中关于NO_POLICY_SCOPE选项讨论。
CMD#32
搜索包含某个文件的路径 :
find_path
find_path(<VAR> name1 [path1 path2 ...])
在多数状况下,使用上述的精简命令格式就足够了。它与命令find_path(<VAR> name1 [PATHS path1 path2 ...])等价。
find_path(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
该命令用于给定名字文件所在的路径。一条名为<VAR>的cache条目会被建立,并存储该命令的执行结果。若是在某个路径下发现了该文件,该结果会被存储到该变量中;除非该变量被清除,该次搜索不会继续进行。若是没有找到,存储的结果将会是<VAR>-NOTFOUND,而且当下一次以相同的变量名调用find_path命令时,该命令会再一次尝试搜索该文件。须要搜索的文件名经过在NAMES选项后面的列出来的参数来肯定。附加的搜索位置能够在PATHS选项以后指定。若是在PATHS或者HINTS命令中还指定了ENV var选项,环境变量var将会被读取并从一个系统环境变量转换为一个cmake风格的路径list。好比,ENV PATH是列出系统path变量的一种方法。参数DOC将用来做为该变量在cache中的注释。PATH_SUFFIXES指定了在每一个搜索路径下的附加子路径。
若是指定了NO_DEFAULT_PATH选项,那么没有其它附加的路径会被加到搜索过程当中。若是并未指定NO_DEFAULT_PATH选项,搜索的过程以下:
一、搜索cmake专有的cache变量中的路径。这种用法是为了在命令行中用选项-DVAR=value指定搜索路径。若是指定了NO_CMAKE_PATH选项,该路径会被跳过。搜索路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的<prefix>/,路径<prefix>/include
CMAKE_INCLUDE_PATH
CMAKE_FRAMEWORK_PATH
二、搜索cmake专有的环境变量中指定的路径。这种用法是为了在用户的shell配置中设置指定的搜索路径。若是指定了NO_CMAKE_ENVIRONMENT_PATH选项,该路径会被跳过。搜索路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的<prefix>/,路径<prefix>/include
CMAKE_INCLUDE_PATH
CMAKE_FRAMEWORK_PATH
三、搜索由HINTS选项指定的路径。这些路径应该是由系统内省时计算得出的路径,好比由其它已经发现的项目提供的线索。硬编码的参考路径应该在PATHS选项中指定。
四、搜索标准的系统环境变量。经过指定选项NO_SYSTEM_ENVIRONMENT_PATH能够跳过搜索环境变量。搜索的路径还包括:
PATH
INCLUDE
五、查找在为当前系统的平台文件中定义的cmake变量。若是指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路径<prefix>/include
CMAKE_SYSTEM_LIBRARY_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
六、搜索PATHS选项或者精简版命令指定的路径。这些一般是硬编码的推荐搜索路径。
在Darwin或者支持OS X 框架的系统上,cmake变量CMAKE_FIND_FRAMEWORK能够用来设置为空,或者下述值之一:
"FIRST" - 在标准库或头文件以前查找框架。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找框架。
"ONLY" - 仅仅查找框架。
"NEVER" - 从不查找框架。
在Darwin或者支持OS X Application Bundles的系统,cmake变量CMAKE_FIND_APPBUNDLE能够被设置为空或者下面这些值中的一个:
"FIRST" - 在标准库或头文件以前查找application bundles。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找application bundles。
"ONLY" - 仅仅查找application bundles。
"NEVER" - 从不查找application bundles。
CMake变量CMAKE_FIND_ROOT_PATH指定了一个或者多个优先于其余搜索路径的搜索路径。该变量可以有效地从新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时,该变量十分有用:用该变量指向目标环境的根目录,而后CMake将会在那里查找。默认状况下,在CMAKE_FIND_ROOT_PATH中列出的路径会首先被搜索,而后是“非根”路径。该默认规则能够经过设置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出调整。在每次调用该命令以前,均可以经过设置这个变量来手动覆盖默认行为。若是使用了NO_CMAKE_FIND_ROOT_PATH变量,那么只有重定位的路径会被搜索。
默认的搜索顺序的设计逻辑是按照使用时从最具体到最不具体的路径。经过屡次调用find_path命令以及NO_*选项,能够覆盖工程的这个默认顺序:
find_path(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_path(<VAR> NAMES name)
只要这些调用中的一个成功返回,结果变量就会被设置而且被存储到cache中;这样随后的调用都不会再行搜索。在搜索框架时,若是以A/b.h的格式指定文件,那么该框架搜索过程会搜索A.framework/Headers/b.h。若是找到了该路径,它将会被设置为框架的路径。CMake将把它转换为正确的-F选项来包含该文件。
CMD#33
查找可执行程序 :
find_program
find_program(<VAR> name1 [path1 path2 ...])
这是该命令的精简格式,它在大多数场合下都够用了。命令find_program(<VAR> name1 [PATHS path1 path2 ...])是它的等价形式。
find_program(
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
该命令用于查找程序。一个名为<VAR>的cache条目会被建立用来存储该命令的结果。若是该程序被找到了,结果会存储在该变量中,搜索过程将不会再重复,除非该变量被清除。若是没有找到,结果将会是<VAR>-NOTFOUND,而且下次以相同的变量调用该命令时,还会作搜索的尝试。被搜索的程序的名字由NAMES选项后列出的参数指定。附加的搜索位置能够在PATHS参数后指定。若是在HINTS或者PATHS选项后有ENV var参数,环境变量var将会被读取并从系统环境变量转换为cmake风格的路径list。好比ENV PATH是一种列出全部系统path变量的方法。DOC后的参数将会被用做cache中的注释字符串。PATH_SUFFIXES指定了在每一个搜索路径下要检查的附加子路径。
若是指定了NO_DEFAULT_PATH选项,那么搜索的过程当中不会有其余的附加路径。若是没有指定该选项,搜索过程以下:
一、搜索cmake特有的cache变量指定的路径。这些变量是在用cmake命令行时,经过-DVAR=value指定的变量。若是指定了NO_CMAKE_PATH选项,这些路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/[s]bin
CMAKE_PROGRAM_PATH
CMAKE_APPBUNDLE_PATH
二、搜索cmake特有的环境变量指定的路径。这些变量是用户的shell配置中设置的变量。若是指定了NO_CMAKE_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/[s]bin
CMAKE_PROGRAM_PATH
CMAKE_APPBUNDLE_PATH
三、搜索由HINTS选项指定的路径。这些路径是系统内省(introspection)估算出的路径,好比由另外一个已经发现的程序的地址提供的参考信息。硬编码的推荐路径应该经过PATHS选项指定。
四、查找标准的系统环境变量。若是指定了NO_SYSTEM_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:
PATH
五、查找在为当前系统的平台文件中定义的cmake变量。若是指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。搜索的路径还包括:
对于每一个在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路径<prefix>/[s]bin
CMAKE_SYSTEM_PROGRAM_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH
六、搜索PATHS选项或者精简版命令指定的路径。这些一般是硬编码的推荐搜索路径。
在Darwin或者支持OS X 框架的系统上,cmake变量CMAKE_FIND_FRAMEWORK能够设置为空,或者下述值之一:
"FIRST" - 在标准库或头文件以前查找框架。在Darwin系统上这是默认选项。
"LAST" - 在标准库或头文件以后查找框架。
"ONLY" - 仅仅查找框架。
"NEVER" - 从不查找框架。
在Darwin或者支持OS X Application Bundles的系统,cmake变量CMAKE_FIND_APPBUNDLE能够被设置为空或者下面这些值中的一个:
"FIRST" - 在标准程序以前查找application bundles。在Darwin系统上这是默认选项。
"LAST" - 在标准程序以后查找application bundles。
"ONLY" - 仅仅查找application bundles。
"NEVER" - 从不查找application bundles。
CMake变量CMAKE_FIND_ROOT_PATH指定了一个或者多个优先于其余搜索路径的搜索路径。该变量可以有效地从新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时,该变量十分有用:用该变量指向目标环境的根目录,而后CMake将会在那里查找。默认状况下,在CMAKE_FIND_ROOT_PATH中列出的路径会首先被搜索,而后是“非根”路径。该默认规则能够经过设置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY作出调整。在每次调用该命令以前,均可以经过设置这个变量来手动覆盖默认行为。若是使用了NO_CMAKE_FIND_ROOT_PATH变量,那么只有重定位的路径会被搜索。
默认的搜索顺序的设计逻辑是按照使用时从最具体到最不具体。经过屡次以NO_*选项调用find_program命令,能够覆盖工程的这个默认顺序:
find_library(<VAR> NAMES name PATHS paths... NO_DEFAULT_PATH)
find_library(<VAR> NAMES name)
只要这些调用中的一个成功返回,结果变量就会被设置而且被存储到cache中;这样随后的调用都不会再行搜索。
CMD#34
建立FLTK用户界面包装器。 :
fltk_wrap_ui
fltk_wrap_ui(resultingLibraryName source1
source2 ... sourceN )
为全部列出的.fl和.fld文件生成.h和.cxx文件。这些生成的.h和.cxx文件将会加到变量resultingLibraryName_FLTK_UI_SRCS中,它也会加到你的库中。
CMD#35
对一个list中的每个变量执行一组命令。 :
foreach
foreach(loop_var arg1 arg2 ...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endforeach(loop_var)
全部的foreach和与之匹配的endforeach命令之间的命令会被记录下来而不会被调用。等到遇到endforeach命令时,先前被记录下来的命令列表中的每条命令都会为list中的每一个变量调用一遍。在每次迭代中,循环变量${loop_var}将会被设置为list中的当前变量值。
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
foreach命令也能够遍历一我的为生成的数据区间。遍历的方式有三种:
*若是指定了一个数字,区间是[0, total]。
*若是指定了两个数字,区间将会是第一个数字到第二个数字。
*第三个数字是从第一个数字遍历到第二个数字时的步长。
foreach(loop_var IN [LISTS [list1 [...]]]
[ITEMS [item1 [...]]])
该命令的含义是:精确遍历一个项组成的list。LISTS选项后面是须要被遍历的list变量的名字,包括空元素(一个空字符串是一个零长度list)。ITEMS选项结束了list参数的解析,而后在迭代中引入全部在其后出现的项。(猜想是用list1中的项item1,依次类推,为循环变量赋值。——译注)
CMD#36
开始记录一个函数,为之后以命令的方式调用它作准备。 :
function
function(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endfunction(<name>)
定义一个名为<name>的函数,它以arg1 arg2 arg3 (...)为参数。在function以后,对应的endfunction以前列出的命令,在函数被调用以前,是不会被调用的。当函数被调用时,在函数中记录的那些命令首先会用传进去的参数替换掉形参(${arg1});而后跟正常命令同样去调用这些命令。除了形参,你还能够引用这些变量:ARGC为传递给函数的变量个数,ARGV0 ARGV1 ARGV2 ...表示传到函数中的实参值。这些变量为编写可选参数函数提供了便利。此外,ARGV保留了一个该函数全部实参的list,ARGN保留了函数形参列表之后的全部参数列表。
参见cmake_policy()命令文档中function内部策略行为的相关行为。
CMD#37
获取一个CMake实例的属性。 :
get_cmake_property
get_cmake_property(VAR property)
从指定的CMake实例中获取属性。属性的值存储在变量VAR中。若是属性不存在,CMake会报错。一些会被支持的属性包括:VATIABLES,COMMANDS,MACROS以及COMPONENTS。
CMD#38
获取DIRECTORY域中的某种属性。 :
get_directory_property
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
在指定的变量中存储路径(directory)域中的某种属性。若是该属性没有被定义,将会返回空字符串。DIRECTORY参数指定了要取出的属性值的另外一个路径。指定的路径必须已经被CMake遍历过了。
get_directory_property(<variable> [DIRECTORY <dir>]
DEFINITION <var-name>)
该命令从一个路径中获取一个变量的定义。这种格式在从另外一个路径中获取变量的定义时比较有用。
CMD#39
获得一个完整文件名中的特定部分。 :
get_filename_component
get_filename_component(<VAR> FileName
PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
[CACHE])
将变量<VAR>设置为路径(PATH),文件名(NAME),文件扩展名(EXT),去掉扩展名的文件名(NAME_WE),完整路径(ABSOLUTE),或者全部符号连接被解析出的完整路径(REALPATH)。注意,路径会被转换为Unix的反斜杠(/),而且没有结尾的反斜杠。该命令已经考虑了最长的文件扩展名。若是指定了CACHE选项,获得的变量会被加到cache中。
get_filename_component(<VAR> FileName
PROGRAM [PROGRAM_ARGS <ARG_VAR>]
[CACHE])
在FileName中的程序将会在系统搜索路径中被查找,或者是一个完整路径。若是与PRPGRAM一块儿给定了PROGRAM_ARGS选项,那么任何在Filename字符串中出现的命令行中选项将会从程序名中分割出来并存储在变量<ARG_VAR>中。这能够用来从一个命令行字符串中分离程序名及其选项。
CMD#40
:
get_property 获取一个属性值
get_property(<variable>
<GLOBAL |
DIRECTORY [dir] |
TARGET <target> |
SOURCE <source> |
TEST <test> |
CACHE <entry> |
VARIABLE>
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
获取在某个域中一个对象的某种属性值。第一个参数指定了存储属性值的变量。第二个参数肯定了获取该属性的域。域的选项仅限于:
- GLOBAL 域是惟一的,它不接受域名字。
- DIRECTORY域默认为当前目录,可是其余的路径(已经被CMake处理过)能够以相对路径或完整路径的方式跟在该域后面。
- TARGET域后面必须跟有一个已有的目标名。
- SOURCE域后面必须跟有一个源文件名。
- TEST域后面必须跟有一个已有的测试。
- CACHE域后面必须跟有一个cache条目。
- VARIABLE域是惟一的,它不接受域名字。
PROPERTY选项是必须的,它后面紧跟要获取的属性名。若是该属性没有被设置,该命令将返回空值。若是给定了SET选项,那么返回值会被设置为一个布尔值,用来指示该属性是否被设置过。若是给定了DEFINED选项,那么返回值会被设置为一个布尔值,用来指示该属性是否被相似于define_property的命令定义过。若是指定了BRIEF_DOCS或者FULL_DOCS选项,那么该变量将会被设置为被查询属性的文档的字符串。若是被请求的属性的文档没有被定义,将返回NOTFOUND。
CMD#41
为一个源文件获取一种属性值。 :
get_source_file_property
get_source_file_property(VAR file property)
从一个源文件中获取某种属性值。这个属性值存储在变量VAR中。若是该属性没有被找到,VAR会被设置为NOTFOUND。使用set_source_files_proterties命令来设置属性值。源文件属性一般用来控制文件如何被构建。一个一定存在的属性是LOCATION。
CMD#42
:
get_target_property 从一个目标中获取一个属性值。
get_target_property(VAR target property)
从一个目标中获取属性值。属性的值会被存储在变量VAR中。若是该属性没有被发现,VAR会被设置为NOTFOUND。使用set_target_properties命令来设置属性值。属性值通常用于控制如何去构建一个目标,可是有些属性用来查询目标的信息。该命令能够获取当前已经被构建好的任意目标的属性。该目标不必定存在于当前的CMakeLists.txt文件中。
CMD#43
获取一个测试的属性。 :
get_test_property
get_test_property(test VAR property)
从指定的测试中获取某种属性。属性值会被存储到变量VAR中。若是没有找到该属性,CMake将会报错。你可使用命令cmake --help-property-list来获取标准属性的清单。
CMD#44
条件执行一组命令。 :
if
if(expression)
# then section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
elseif(expression2)
# elseif section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
else(expression)
# else section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endif(expression)
评估给定的表达式。若是结果是true,在THEN段的命令就会被调用。不然,在ELSE区段的命令会被调用。ELSEIF和ELSE区段是可选的 。能够有多个ELSEIF子句。注意,在else和elseif子句中的表达式也是可选的。判断条件能够用长表达式,而且表达式有约定的优先级顺序。括号中的表达式会首先被调用;而后是一元运算符,好比EXISTS,COMMAND以及DEFINED;而后是EQUAL,LESS,GREATER,STRLESS,STRGREATER,STREQUAL,MATCHES;而后是NOT运算符,最后是AND,OR运算符。几种可能的表达式是:
if(<常量>)
若是<常量>是1,ON,YES,TRUE,Y或者非0数值,那么表达式为真;若是<常量>是0,OFF,NO,FALSE,N,IGNORE,"",或者以'-NOTFOUND'为后缀,那么表达式为假。这些布尔常量值是大小写无关的。
if(<变量>)
若是<变量>的值不是一个false常量,表达式为真。
if(NOT <表达式>)
若是<表达式>的值是false的话,真个表达式为真。
if(<表达式1> AND <表达式2>)
若是两个表达式都为真,整个表达式为真。
if(<表达式1> OR <表达式2>)
只要有一个表达式为真,整个表达式为真。
if(COMMAND command-name)
若是给出的名字是一个能够被调用的命令,宏,或者函数的话,整个表达式的值为真。
if(POLICY policy-id)
若是给出的名字是一个已有的策略(格式是CMP<NNNN>),表达式为真。
if(TARGET 目标名)
若是给出的名字是一个已有的构建目标或导入目标的话,表达式为真。
if(EXISTS 文件名)
if(EXISTS 路径名)
若是给出的文件名或路径名存在,表达式为真。该命令只对完整路径有效。
if(file1 IS_NEWER_THAN file2)
若是file1比file2更新或者其中的一个文件不存在,那么表达式为真。该命令只对完整路径有效。
if(IS_DIRECTORY directory-name)
若是给定的名字是一个路径,表达式返回真。该命令只对完整路径有效。
if(IS_SYMLINK file-name)
若是给定的名字十一个符号连接的话,表达式返回真。该命令只对完整路径有效。
if(IS_ABSOLUTE path)
若是给定的路径是一个绝对路径的话,表达式返回真。
if(variable MATCHES regex)
if(string MATCHES regex)
若是给定的字串或变量值域给定的正则表达式匹配的话,表达式返回真。
if(variable LESS number)
if(string LESS number)
if(variable GREATER number)
if(string GREATER number)
if(variable EQUAL number)
if(string EQUAL number)
若是给定的字串或变量值是一个有效的数字而且不等号或等号知足的话,表达式返回真。
if(variable STRLESS string)
if(string STRLESS string)
if(variable STRGREATER string)
if(string STRGREATER string)
if(variable STREQUAL string)
if(string STREQUAL string)
若是给定的字串或变量值依字典序小于(或者大于,或者等于)右边给出的字串或变量值的话,表达式返回真。
if(version1 VERSION_LESS version2)
if(version1 VERSION_EQUAL version2)
if(version1 VERSION_GREATER version2)
对版本号的各部分依次比较(版本号格式是major[.minor[.patch[.tweak]]])version1和version2的大小。
if(DEFINED variable)
若是给定的变量被定义了的话,该表达式为真。若是变量被设置了,它的值是真是假都无所谓。
if((expression) AND (expression OR (expression)))
在小括号内的表达式会首先被计算,而后才按照先前介绍的运算来计算。有内嵌的括号时,最里的括号会做为包含它们的表达式的计算过程的一部分。IF语句在CMake的历史上出现的至关早,它拥有一些须要特殊介绍的便捷特性。IF表达式只有在其中有一个单一的保留值的时候,才会精简操做(即不作变量展开——译注);这些保留值包括:若是是大小写无关的 ON,1, YES,TRUE,Y,它返回真;若是是OFF,0,NO,FALSE,N,NOTFOUND,*-NOTFOUND,IGNORE,它返回假。这种特性很是合理,它为新做者提供了一种不须要精确匹配true或者false的便利性。这些值会被当作变量处理,即便它们没有使用${}语法的时候,也会被解引用。这意味着,若是你写下了这样的语句:
if (boobah)
CMake将会把它当作你写了
if (${boobah})
来处理。相似地,若是你写了
if (fubar AND sol)
CMake将会便捷地把它解释为
if ("${fubar}" AND "${sol}")
上述两例的后者确实是正确的书写方式,可是前者也是可行的。if语句中只有某些操做有这种特殊的变量处理方式。这些特殊的语句包括:
- 对于MATCHES运算符,待匹配的左边的参数首先被检查,用来确认它是不是一个已经定义的变量;若是是,该变量的值会被使用,不然就会用它的原始值。
- 若是MATCHES运算符没有左边的参数,它返回false,但不产生错误。
- LESS,GREATER,EQUAL运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是被定义的变量;若是是,使用它们被定义的值,不然使用它们的原始值。
- STRLESS,STRGREATER,STREQUAL运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是被定义的变量;若是是,使用它们被定义的值,不然使用它们的原始值。
- VERSIONLESS,VERSIONGREATER,VERSIONEQUAL运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是被定义的变量;若是是,使用它们被定义的值,不然使用它们的原始值。
- NOT运算符右边的参数会被测试用来肯定它是不是布尔常量,若是是,就用这个常量;不然它会被当作一个变量而后被解引用。
- AND和OR运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是布尔常量;若是是,就用这个常量,不然它们会被当作变量而后被解引用