cmake手册

cmake手册

部分转载自:http://www.cnblogs.com/coderfenghc/tag/cmake/

CMake2.8.3 主索引

  • 命令名称
  • 用法
  • 描述
  • 命令选项
  • 生成器
  • 命令
  • 属性
  • 全局域属性
  • 目录属性
  • 目标属性
  • 测试属性
  • 源代码属性
  • Cache Entries属性
  • 兼容性命令
  • CMake 标准模块
  • CMake策略
  • 变量
  • 改变行为的变量
  • 描述系统的变量
  • 语言变量
  • 控制构建的变量
  • 提供信息的变量
  • 版权
  • 其余参考资料

命令名称前端

     cmake - 跨平台Makefile生成工具。python

用法

  cmake [选项] <源码路径>linux

  cmake [选项] <现有构建路径>正则表达式

描述

  cmake可执行程序是CMake的命令行界面。它能够用脚本对工程进行配置。工程配置设置能够在命令行中使用-D选项指定。使用-i选项,cmake将经过提示交互式地完成该设置。shell

  CMake是一个跨平台的构建系统生成工具。它使用平台无关的CMake清单文件CMakeLists.txt,指定工程的构建过程;源码树的每一个路径下都有这个文件。CMake产生一个适用于具体平台的构建系统,用户使用这个系统构建本身的工程。express

选项编程

 

-C <initial-cache>: 预加载一个脚本填充缓存文件。
  当cmake在一个空的构建树上第一次运行时,它会建立一个CMakeCache.txt文件,而后向其中写入可定制的项目设置数据。-C选项能够用来指定一个文件,在第一次解析这个工程的cmake清单文件时,从这个文件加载缓存的条目(cache entries)信息。被加载的缓存条目比项目默认的值有更高的优先权。参数中给定的那个文件应该是一个CMake脚本,其中包含有使用CACHE选项的SET命令;而不是一个缓存格式的文件。windows

-D <var>:<type>=<value>: 建立一个CMake的缓存条目。数组

  当cmake第一次运行于一个空的构建数时,它会建立一个CMakeCache.txt文件,而且使用可定制的工程设置来填充这个文件。这个选项能够用来指定优先级高于工程的默认值的工程设置值。这个参数能够被重复屡次,用来填充所须要数量的缓存条目(cache entries)。缓存

-U <globbing_expr>: 从CMake的缓存文件中删除一条匹配的条目。
  该选项能够用来删除CMakeCache.txt文件中的一或多个变量。文件名匹配表达式(globbing expression)支持通配符*和?的使用。该选项能够重复屡次以删除指望数量的缓存条目。使用它时要当心,你可能所以让本身的CMakeCache.txt罢工。

-G <generator-name>: 指定一个makefile生成工具。

  在具体的平台上,CMake能够支持多个原生的构建系统。makefile生成工具的职责是生成特定的构建系统。可能的生成工具的名称将在生成工具一节给出。

-Wno-dev: 抑制开发者警告。

  抑制那些为CMakeLists.txt文件的做者准备的警告信息。

-Wdev: 使能开发者警告信息输出功能。

  容许那些为CMakeLists.txt文件的做者准备的警告信息。

-E: CMake命令行模式。
  为了真正作到与平台无关,CMake提供了一系列能够用于全部系统上的的命令。以-E参数运行CMake会帮助你得到这些命令的用法。可使用的命令有:chdir, copy, copy_if_different copy_directory, compare_files, echo, echo_append, environment, make_directory, md5sum, remove_directory, remove, tar, time, touch, touch_nocreate, write_regv, delete_regv, comspec, create_symlink。

-i: 以向导模式运行CMake。

  向导模式是在没有GUI时,交互式地运行cmake的模式。cmake会弹出一系列的提示,要求用户回答关于工程配置的一行问题。这些答复会被用来设置cmake的缓存值。

-L[A][H]: 列出缓存的变量中的非高级的变量。
  -L选项会列出缓存变量会运行CMake,并列出全部CMake的内有被标记为INTERNAL或者ADVANCED的缓存变量。这会显示当前的CMake配置信息,而后你能够用-D选项改变这些选项。修改一些变量可能会引发更多的变量被建立出来。若是指定了A选项,那么命令也会显示高级变量。若是指定了H选项,那么命令会显示每一个变量的帮助信息。

生成器

  在CMake 2.8.3平台上,CMake支持下列生成器:

    • Borland Makefiles: 生成Borland makefile。
    • MSYS Makefiles: 生成MSYS makefile。

      生成的makefile用use /bin/sh做为它的shell。在运行CMake的机器上须要安装msys。

    • MinGW Makefiles: 生成供mingw32-make使用的make file。

      生成的makefile使用cmd.exe做为它的shell。生成它们不须要msys或者unix shell。

    • NMake Makefiles: 生成NMake makefile。
    • NMake Makefiles JOM: 生成JOM makefile。
    • Unix Makefiles: 生成标准的UNIX makefile。

      在构建树上生成分层的UNIX makefile。任何标准的UNIX风格的make程序均可以经过默认的make目标构建工程。生成的makefile也提供了install目标。

    • Visual Studio 10: 生成Visual Studio 10 工程文件。
    • Visual Studio 10 Win64: 生成Visual Studio 10 Win64 工程文件。
    • Visual Studio 6: 生成Visual Studio 6 工程文件。
    • Visual Studio 7: 生成Visual Studio .NET 2002 工程文件。
    • Visual Studio 7 .NET 2003: 生成Visual Studio .NET 2003工程文件。
    • Visual Studio 8 2005: 生成Visual Studio .NET 2005 工程文件。
    • Visual Studio 8 2005 Win64: 生成Visual Studio .NET 2005 Win64工程文件。
    • Visual Studio 9 2008: 生成Visual Studio 9 2008 工程文件。
    • Visual Studio 9 2008 Win64: 生成Visual Studio 9 2008 Win64工程文件。
    • Watcom WMake: 生成Watcom WMake makefiles。
    • CodeBlocks - MinGW Makefiles: 生成CodeBlock工程文件。

      在顶层目录以及每层子目录下为CodeBlocks生成工程文件,生成的CMakeList.txt的特色是都包含一个PROJECT()调用。除此以外还会在构建树上生成一套层次性的makefile。经过默认的make目标,正确的make程序能够构建这个工程。makefile还提供了install目标。

    • CodeBlocks - NMake Makefiles: 生成CodeBlocks工程文件。

      在顶层目录以及每层子目录下为CodeBlocks生成工程文件,生成的CMakeList.txt的特色是都包含一个PROJECT()调用。除此以外还会在构建树上生成一套层次性的makefile。经过默认的make目标,正确的make程序能够构建这个工程。makefile还提供了install目标。

    • CodeBlocks - Unix Makefiles: 生成CodeBlocks工程文件。

      在顶层目录以及每层子目录下为CodeBlocks生成工程文件,生成的CMakeList.txt的特色是都包含一个PROJECT()调用。除此以外还会在构建树上生成一套层次性的makefile。经过默认的make目标,正确的make程序能够构建这个工程。makefile还提供了install目标。

    • Eclipse CDT4 - MinGW Makefiles: 生成Eclipse CDT 4.0 工程文件。

      在顶层目录下为Eclipse生成工程文件。在运行源码外构建时,一个链接到顶层源码路径的资源文件会被建立。除此以外还会在构建树上生成一套层次性的makefile。经过默认的make目标,正确的make程序能够构建这个工程。makefile还提供了install目标。

    • Eclipse CDT4 - NMake Makefiles: 生成Eclipse CDT 4.0 工程文件。

      在顶层目录下为Eclipse生成工程文件。在运行源码外构建时,一个链接到顶层源码路径的资源文件会被建立。除此以外还会在构建树上生成一套层次性的makefile。经过默认的make目标,正确的make程序能够构建这个工程。makefile还提供了install目标。

    • Eclipse CDT4 - Unix Makefiles: 生成Eclipse CDT 4.0 工程文件。

      在顶层目录下为Eclipse生成工程文件。在运行源码外构建时,一个链接到顶层源码路径的资源文件会被建立。除此以外还会在构建树上生成一套层次性的makefile。经过默认的make目标,正确的make程序能够构建这个工程。makefile还提供了install目标。

 

命令

 

CMD#1 :add_custom_command    为生成的构建系统添加一条自定义的构建规则。
  add_custom_command命令有两种主要的功能;第一种是为了生成输出文件,添加一条自定义命令。

  add_custom_command(OUTPUT output1 [output2 ...]
                     COMMAND command1 [ARGS] [args1...]
                     [COMMAND command2 [ARGS] [args2...] ...]
                     [MAIN_DEPENDENCY depend]
                     [DEPENDS [depends...]]
                     [IMPLICIT_DEPENDS <lang1> depend1 ...]
                     [WORKING_DIRECTORY dir]
                     [COMMENT comment] [VERBATIM] [APPEND])

  这种命令格式定义了一条生成指定的文件(文件组)的生成命令。在相同路径下建立的目标(CMakeLists.txt文件)——任何自定义命令的输出都做为它的源文件——被设置了一条规则:在构建的时候,使用指定的命令来生成这些文件。若是一个输出文件名是相对路径,它将被解释成相对于构建树路径的相对路径,而且与当前源码路径是对应的。注意,MAIN_DEPENDENCY彻底是可选的,它用来向visual studio建议在何处中止自定义命令。对于各类类型的makefile而言,这条命令建立了一个格式以下的新目标:

  OUTPUT: MAIN_DEPENDENCY DEPENDS
    COMMAND

  若是指定了多于一条的命令,它们会按顺序执行。ARGS参数是可选的,它的存在是为了保持向后兼容,之后会被忽略掉。

  第二种格式为一个目标——好比一个库文件或者可执行文件——添加一条自定义命令。这种格式能够用于目标构建前或构建后的一些操做。这条命令会成为目标的一部分,而且只有目标被构建时才会执行。若是目标已经构建了,该目标将不会执行。

  add_custom_command(TARGET target
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM])

  这条命令定义了一个与指定目标的构建过程相关的新命令。新命令在什么时候执行,由下述的选项决定:

  PRE_BUILD  - 在全部其它的依赖以前执行;
PRE_LINK - 在全部其它的依赖以后执行;
POST_BUILD - 在目标被构建以后执行;

  注意,只有Visual Studio 7或更高的版本才支持PRE_BUILD。对于其余的生成器,PRE_BUILD会被当作PRE_LINK来对待。

  若是指定了WORKING_DIRECTORY选项,这条命令会在给定的路径下执行。若是设置了COMMENT选项,后跟的参数会在构建时、以构建信息的形式、在命令执行以前显示出来。若是指定了APPEND选项,COMMAND以及DEPENDS选项的值会附加到第一个输出文件的自定义命令上。在此以前,必须有一次以相同的输出文件做为参数的对该命令的调用。在当前版本下,若是指定了APPEND选项,COMMENT, WORKING_DIRECTORY和MAIN_DEPENDENCY选项会被忽略掉,不过将来有可能会用到。

  若是指定了VERBATIM选项,全部该命令的参数将会合适地被转义,以便构建工具可以以原汁原味的参数去调用那些构建命令。注意,在add_custom_command能看到这些参数以前,CMake语言处理器会对这些参数作一层转义处理。推荐使用VERBATIM参数,由于它可以保证正确的行为。当VERBATIM未指定时,CMake的行为依赖于平台,由于CMake没有针对某一种工具的特殊字符采起保护措施。

  若是自定义命令的输出并非实际的磁盘文件,应该使用SET_SOURCE_FILES_PROPERTIES命令将该输出的属性标记为SYMBOLIC。

  IMPLICIT_DEPENDS选项请求扫描一个输入文件的隐含依赖关系。给定的语言参数(文中的lang1—译注)指定了应该使用哪一种编程语言的依赖扫描器。目前为止,仅支持C和CXX语言扫描器。扫描中发现的依赖文件将会在编译时添加到自定义命令中。注意,IMPLICIT_DEPENDS选项目前仅仅直至Makefile生成器,其它的生成器会忽略之。

  若是COMMAND选项指定了一个可执行目标(由ADD_EXECUTABLE命令建立的目标),在构建时,它会自动被可执行文件的位置所替换。并且,一个目标级的依赖性将会被添加进去,这样这个可执行目标将会在全部依赖于该自定义命令的结果的目标以前被构建。不过,任什么时候候重编译这个可执行文件,这种特性并不会引入一个会引发自定义命令从新运行的文件级依赖。

  DEPENDS选项指定了该命令依赖的文件。若是依赖的对象是同一目录(CMakeLists.txt文件)下另一个自定义命令的输出,CMake会自动将其它自定义命令带到这个命令中来。若是DEPENDS指定了任何类型的目标(由ADD_*命令建立),一个目标级的依赖性将会被建立,以保证该目标在任何其它目标使用这个自定义命令的输出以前,该目标已经被建立了。并且,若是该目标是可执行文件或库文件,一个文件级依赖将会被建立,用来引起自定义命令在目标被重编译时的从新运行。

 

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 :break    从一个包围该命令的foreach或while循环中跳出。

  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_minimum_required    设置一个工程所须要的最低CMake版本。

  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_policy    管理CMake的策略设置。
  随着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 :elseif    开始 if 块的 elseif 部分。

  elseif(expression)

     参见if命令。

 

CMD#19 :enable_language     支持某种语言(CXX/C/Fortran/等)

  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 :endforeach     结束foreach语句块中的一系列命令。

  endforeach(expression)

  参见FOREACH命令。

 

CMD#22 :endfunction    结束一个function语句块中的一系列命令。

  endfunction(expression)

  参见function命令。

 

CMD#23 :endif    结束一个if语句块中的一系列命令。

  endif(expression)

  参见if命令。

 

CMD#24 :endmacro    结束一个macro语句块中的一系列命令。

  endmacro(expression)

  参见macro命令。

 

CMD#25 :endwhile    结束一个while语句块中的一系列命令。

  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_wrap_ui   建立FLTK用户界面包装器。

  fltk_wrap_ui(resultingLibraryName source1
source2 ... sourceN )

  为全部列出的.fl和.fld文件生成.h和.cxx文件。这些生成的.h和.cxx文件将会加到变量resultingLibraryName_FLTK_UI_SRCS中,它也会加到你的库中。

 

CMD#35 :foreach    对一个list中的每个变量执行一组命令。

  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 :get_cmake_property    获取一个CMake实例的属性。

  get_cmake_property(VAR property)

  从指定的CMake实例中获取属性。属性的值存储在变量VAR中。若是属性不存在,CMake会报错。一些会被支持的属性包括:VATIABLES,COMMANDS,MACROS以及COMPONENTS。

 

CMD#38 :get_directory_property    获取DIRECTORY域中的某种属性。

  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语句中只有某些操做有这种特殊的变量处理方式。这些特殊的语句包括:

  1. 对于MATCHES运算符,待匹配的左边的参数首先被检查,用来确认它是不是一个已经定义的变量;若是是,该变量的值会被使用,不然就会用它的原始值。
  2. 若是MATCHES运算符没有左边的参数,它返回false,但不产生错误。 
  3. LESS,GREATER,EQUAL运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是被定义的变量;若是是,使用它们被定义的值,不然使用它们的原始值。
  4. STRLESS,STRGREATER,STREQUAL运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是被定义的变量;若是是,使用它们被定义的值,不然使用它们的原始值。
  5. VERSIONLESS,VERSIONGREATER,VERSIONEQUAL运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是被定义的变量;若是是,使用它们被定义的值,不然使用它们的原始值。
  6. NOT运算符右边的参数会被测试用来肯定它是不是布尔常量,若是是,就用这个常量;不然它会被当作一个变量而后被解引用。
  7. AND和OR运算符的左边的参数和右边的参数会被独立测试,用来确认它们是不是布尔常量;若是是,就用这个常量,不然它们会被当作变量而后被解引用

 

CMD#45 :include   从给定的文件中读取CMake的列表文件。

  include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
[NO_POLICY_SCOPE])

  从给定的文件中读取CMake的清单文件代码。在清单文件中的命令会被当即处理,就像它们是写在这条include命令展开的地方同样。若是指定了OPTIONAL选项,那么若是被包含文件不存在的话,不会报错。若是指定了RESULT_VARIABLE选项,那么var或者会被设置为被包含文件的完整路径,或者是NOTFOUND,表示没有找到该文件。

  若是指定的是一个模块(module)而不是一个文件,查找的对象会变成路径CMAKE_MODULE_PATH下的文件<modulename>.camke。

  参考cmake_policy()命令文档中关于NO_POLICY_SCOPE选项的讨论。

 

CMD#46 :include_directories     为构建树添加包含路径。

  include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

  将给定的路径添加到编译器搜索包含文件(.h文件)的路径列表中。缺省状况下,该路径会被附加在当前路径列表的后面。这种缺省行为能够经过设置CMAKE_include_directories_BEFORE变量为ON被改变。经过将该变量改变为BEFORE或AFTER,你能够在追加和附加在前端这两种方式中选择,而不用理会缺省设置。若是指定了SYSTEM选项,编译器将会认为该路径是某种平台上的系统包含路径。

 

CMD#47 :include_external_msproject     在一个workspace中包含一个外部的Microsoft工程。      

  include_external_msproject(projectname location dep1 dep2 ...)

  在生成的workspace文件中包含一个外部的Microsoft工程。它会建立一个名为[projectname]的目标。这个目标能够用在add_dependencies命令中让其余工程依赖于这个外部工程。当前版本下,该命令在UNIX平台上不会作任何事情。

 

CMD#48 :include_regular_expression     设置用于依赖性检查的正则表达式。

  include_regular_expression(regex_match [regex_complain])

  设置依赖性检查的正则表达式。这有匹配正则表达式regex_match的文件会成为依赖性跟踪的对象。只有匹配regex_complain的文件,在找不到它们的时候才会给出警告(标准头文件不会被搜索)。正则表达式的默认值是:

    regex_match    = "^.*$" (匹配全部文件)
   regex_complain = "^$" (仅匹配空字符串)

CMD#49 :install   指定在安装时要运行的规则。
  该命令为一个工程生成安装规则。在某一源文件路径中,调用这条命令所指定的规则会在安装时按顺序执行。在不一样路径之间的顺序未定义。

  该命令有诸多版本。其中的一些版本定义了文件以及目标的安装属性。这多个版本的公共属性都有所涉及,可是只有在指定它们的版本中,这些属性才是合法的(下面的DESTIONATION到OPTIONAL的选项列表是公共属性。——译注)。

  DESTINATION选项指定了一个文件会安装到磁盘的哪一个路径下。若果给出的是全路径(以反斜杠或者驱动器名开头),它会被直接使用。若是给出的是相对路径,它会被解释为相对于CMAKE_INSTALL_PREFIX的值的相对路径。

  PERMISSIONS选项制定了安装文件须要的权限。合法的权限有:OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,SETUID和SETGID。对于在某些特定的平台上没有意义的权限,在这些平台上会忽略这些选项。

  CONFIGURATIONS选项指定了该安装规则将会加诸之上的一系列的构建配置(Debug,Release,等等)。

  COMPONENT选项指定了该安装规则相关的一个安装部件的名字,好比“runtime”或“development”。对于那些指定安装部件的安装过程来讲,在安装时只有与给定的部件名相关的安装规则会被执行。对于完整安装,全部部件都会被安装。

  RENAME选项为一个可能不一样于原始文件的已经安装的文件指定另外一个名字。重命名只有在该命令正在安装一个单一文件时才被容许(猜想是为了防止文件名冲突时覆盖掉旧文件。——译注)。

  OPTIONAL选项表示要安装的文件不存在不会致使错误。

  TARGETS版本的install命令

  install(TARGETS targets... [EXPORT <export-name>]
[[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP]
] [...])

  TARGETS格式的install命令规定了安装工程中的目标(targets)的规则。有5中能够被安装的目标文件:ARCHIVE,LIBRARY,RUNTIME,FRAMEWORK,和BUNDLE。除了被标记为MACOSX_BUNDLE属性的可执行文件被当作OS X上的BUNDLE目标外,其余的可执行文件都被当作RUNTIME目标。静态连接的库文件老是被当作ARCHIVE目标。模块库老是被当作LIBRARY目标。对于动态库不是DLL格式的平台来讲,动态库会被当作LIBRARY目标来对待,被标记为FRAMEWORK的动态库是例外,它们被当作OS X上的FRAMEWORK目标。对于DLL平台而言,动态库的DLL部分被当作一个RUNTIME目标而对应的导出库被当作是一个ARCHIVE目标。全部基于Windows的系统,包括Cygwin,都是DLL平台。ARCHIVE,LIBRARY,RUNTIME和FRAMEWORK参数改变了后续属性会加诸之上的目标的类型。若是只给出了一种类型,那么只有那种类型的目标会被安装(这样一般只会安装一个DLL或者一个导出库。)

  PRIVATE_HEADER,PUBLIC_HEADER,和RESOURCE选项的功能是,在非苹果平台上,将后续的属性应用在待安装的一个FRAMEWORK共享库目标的相关文件上。这些选项定义的规则在苹果系统上会被忽略掉,由于相关的文件将会被安装到framework文件夹内的合适位置。参见PRIVATE_HEADER,PUBLIC_HEADER和RESOURCE目标属性中更为详细的解释。

  能够指定NAMELINK_ONLY或者NAMELINK_SKIP选项做为LIBRARY选项。在一些平台上,版本化的共享库有一个符号连接,好比lib<name>.so -> lib<name>.so.1,其中“lib<name>.so.1”是so库文件名(soname)而“lib<name>.so”是一个符号连接,当指定“-l<name>”选项时,连接器将会查找这个符号连接。若是一个库目标已经被安装,NAMELINK_ONLY选项表示仅仅安装符号连接;而NAME_SKIP选项则表示仅仅安装库文件而不是符号连接。当两种选项都没有给出时,动态库的两个部分都会被安装。在那些版本化的共享库没有符号连接或者库没有被版本化的平台,选项NAMELINK_SKIP安装这个库,而NAMELINK_ONLY选项什么都不会安装。参见VERSION和SOVERSION目标属性,获取关于建立版本化共享库的更多细节。

  在该命令的TARGETS版本的一次调用中,能够一次性指定一个或多个属性组。一个目标也能够被屡次安装到不一样的位置。假设有三个目标myExe,mySharedLib和myStaticLib,下面的代码

    install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)

将会把myExe安装到<prefix>/bin目录下,把myStaticLib安装到<prefix>/lib/static目录下。在非-DLL平台上,mySharedLib将会被安装到<prefix>/lib和/some/full/path下。在DLL平台上,mySharedLib DLL将会被安装到<prefix>/bin和/some/full/path路径下,它的导出库会被安装到<prefix>/lib/static和/some/full/path路径下。

  EXPORT选项将已经安装的目标文件和一个名为<export-name>的导出文件关联起来。它必须出如今全部RUNTIME,LIBRARY或者ARCHIVE选项以前。为了实际安装导出文件自己(export file),调用install(EXPORT)。参见下述install命令EXPORT版本的文档获取更多的细节。

  将EXCLUDE_FROM_ALL设置为true时,安装一个目标会形成未定义的行为。

  FILES版本的install命令

  install(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])

  FILES版本的install命令指定了为一个工程安装文件的规则。在命令中,以相对路径方式给出的文件名是相对于当前源代码路径而言的。以这个版本安装的文件,若是没有指定PERMISSIONS选项,默认会具备OWNER_WRITE,OWNER_READ,GROUP_READ,和WORLD_READ的权限。

  PROGRAMS版本的install命令

  install(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])

  PROGRAMS版本与FILES版本同样,只在默认权限上有所不一样:它还包括了OWNER_EXECUTE,GROUP_EXECUTE和WORLD_EXECUTE选项。INSTALL的这个版本用来安装不是目标的程序,好比shell脚本。使用TARGETS格式安装该工程内部构建的目标。

  DIRECTORY版本的install命令

  install(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS] [OPTIONAL]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>] [FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])

  INSTALL的DIRECTORY版本将一个或者多个路径下的内容安装到指定的目标地址下。目录结构会原封不动地(verbatim)拷贝到目标地址。每一个路径名的最后一部分会追加到目标路径下,可是结尾反斜杠(trailing slash)能够用来避免这一点,由于这样最后一部分就是空的。给定的相对路径名被解释成相对于当前源路径的路径。若是没有指定输入目录名字,目标目录会被建立,可是不会安装任何东西。FILE_PERMISSIONS和DIRECTORY_PERMISSIONS选项指定了赋予目标路径和目标文件的权限。若是指定了USE_SOURCE_PERMISSIONS选项,但没有指定FILE_PERMISSIONS选项,文件权限将沿袭源目录结构的权限,并且这个路径会被赋予PAROGRAMS版本中指定的默认权限。

  经过使用PATTERN或REGEX选项能够对路径安装作出细粒度的控制。这些用于匹配的选项指定了一个查询模式或正则表达式来匹配输入路径内的路径或文件。它们能够用来将特定的选项(见下文)加诸于遇到的文件和路径的一个子集上。每一个输入文件或路径的完整路径(反斜杠/开头的路径)将用来匹配该表达式。PATTERN仅仅用来匹配彻底文件名:匹配该模式的全路径的那部分必须出如今文件名的结尾,而且必须以一个反斜杠开始。

  正则表达式会用来匹配一个彻底路径的任何部分,可是它也可使用'/'和'$'模仿PATTERN的行为。默认状况下,全部文件和路径无论是否匹配都会被安装。能够在第一个匹配选项以前指定FILE_MATCHING选项,这样就能禁止安装那些不与任何表达式匹配的文件。好比,代码

  install(DIRECTORY src/ DESTINATION include/myproj
FILES_MATCHING PATTERN "*.h")

将会精确匹配并安装从源码树上获得的头文件。

  有些选项后面能够跟在PATTERN或者REGEX表达式的后面,这样这些选项只能加诸于匹配PATTERN/REGEX的文件或路径上。EXCLUDE选项将会指示安装过程跳过那些匹配的文件或者路径。PERMISSIONS选项能够覆盖那些匹配PATTERN/REGEX的文件的权限设定。例如,代码

  install(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)

会将icons路径安装到share/myproject/icons下,同时把scripts目录安装到share/myproj路径下。icons将具有默认的文件权限,scripts将会被给与指定的权限,可是全部CVS路径排除在外。

  SCRIPT和CODE版本的install命令

  install([[SCRIPT <file>] [CODE <code>]] [...])

  SCRIPT格式将会在安装期调用给定的脚本文件。若是脚本文件名是一个相对路径,它会被解释为相对于当前的源路径。CODE格式将会在安装期调用给定的CMake代码。code被指定为一个双引号括起来的单独的参数。例如,代码

  install(CODE "MESSAGE(\"Sample install message.\")")

会在安装时打印一条消息。

 

  EXPORT版本的install命令

  install(EXPORT <export-name> DESTINATION <dir>
[NAMESPACE <namespace>] [FILE <name>.cmake]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>])

  EXPORT格式的install命令生成并安装一个包含将安装过程的安装树导入到另外一个工程中的CMake文件。Target格式的安装过程与上文说起的使用EXPORT选项的install(TARGET ...)格式的命令中的EXPORT <export-name>选项是相关的。NAMESPACE选项会在它们被写入到导入文件时加到目标名字以前。缺省时,生成的文件就是<export-name>.cmake;可是FILE选项能够用来指定不一样于次的文件名。FILE选项后面的参数必须是一“.cmake”为扩展名的文件。若是指定了CONFIGURATIONS选项,那么只有那些具名的配置中的一个被安装时,这个文件才会被安装。并且,生成的导入文件只能涉及到匹配的目标配置版本。若是指定了一个COMPONENT选项,而且<component>与那个<export-name>相关的目标指定的部件不匹配,那么行为是未定义的。若是一个库目标被包含在export之中,可是与之关联的库却没有背包含,那么结果是未指定的。

  EXPORT格式能够协助外部工程使用当前工程构建出来并安装的目标。例如,代码

  install(TARGETS myexe EXPORT myproj DESTINATION bin)
install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)

将会把可执行文件myexe安装到<prefix>/bin下,而且将导入它的代码写到文件"<prefix>/lib/myproj/myproj.cmake"中。一个外部工程能够用include命令加载这个文件,而且能够在安装树上使用导入的目标名mp_myexe(前缀_目标名——译注)引用myexe可执行文件,如同这个目标是它自身的构建树的内置目标同样。

  注意:这个命令会取代INSTALL_TARGETS命令以及PRE_INSTALL_SCRIPT和POST_INSTALL_SCRIPT两个目标属性。它也能够取代FILES格式的INSTALL_FILES命令和INSTALL_PROGRAMS命令。由INSTALL命令生成的安装规则相对于那些由INSTALL_TARGETS,INSTALL_FILES和INSTALL_PROGRAMS命令生成的安装规则处理顺序是未定义的。

 

CMD#50 :link_directories     指定链接器查找库的路径。

  link_directories(directory1 directory2 ...)

  指定链接器搜索库文件时的路径。该命令仅仅能用在那些在它被调用后才生成的目标上。因为历史上的缘由,为该命令指定的相对路径将会不加改变地传递给链接器(不像许多其余CMake命令那样解释为相对于当前源路径的相对路径。)

 

CMD#51 :list     列表操做命令。

    list(LENGTH <list> <output variable>)
  list(GET <list> <element index> [<element index> ...] <output variable>)
  list(APPEND <list> <element> [<element> ...])
  list(FIND <list> <value> <output variable>)
  list(INSERT <list> <element_index> <element> [<element> ...])
  list(REMOVE_ITEM <list> <value> [<value> ...])
  list(REMOVE_AT <list> <index> [<index> ...])
  list(REMOVE_DUPLICATES <list>)
  list(REVERSE <list>)
  list(SORT <list>)

  使用LENGTH选项时,该命令会返回给定list的长度。

  使用GET选项时,该命令返回list中全部被index索引的元素构成的list。

  使用APPEND选项时,该命令将会在该list以后追加若干元素。

  使用FIND选项时,该命令将返回list中指定的元素的索引;若果未找到,返回-1。

  使用INSERT选项时,该命令将在list中指定的位置插入若干元素。

  使用REMOVE_AT和REMOVE_ITEM选项将会从list中删除一些元素。它们之间的区别是:REMOVE_ITEM删除的是指定的项,而REMOVE_AT删除的是在指定索引处的项。

  使用REMOVE_DUPLICATES选项时,该命令将删除list中的重复项。

  使用REVERSE选项时,该命令将把list的内容就地先后倒换。

  使用SORT选项时,该命令将按字母序对list总的内容就地排序。

  注意:在CMake中,一个list是一个由封号;分割的一组字符串。使用set命令能够建立一个list。例如,set(var a b c d e)命令将会建立一个list:a;b;c;d;e;而set(var "a b c d e")命令建立的只是一个字符串,或者说是只有一个项的list。

  当使用指定索引的命令格式时,若是<element index>是大于等于0的数,<element index>是从list第一个项开始的序号,list的第一项的索引是0。若是<element index>小于等于-1,这个索引是从结尾开始的逆向索引,其中-1表示的是list的最后一项。当使用负数索引时,注意它们不是从0开始!-0与0等价,它指向list的第一个成员。

 

CMD#52 :load_cache     从另外一个工程的CMake cache中加载值。

    load_cache(pathToCacheFile READ_WITH_PREFIX
prefix entry1...)

  该命令读取指定的cache文件,并将以请求的前缀为其前缀的那些cache文件中的entry(ies)保存到变量中。这个格式仅仅读取值,可是不在本地工程的cache中建立entry(ies)。

    load_cache(pathToCacheFile [EXCLUDE entry1...]
[:_INTERNALS entry1...])

  从另外一个cache文件中加载值并像内部entry(ies)那样,将它们存储到本地工程的cache中。这条命令对于一个依赖于另外一个不一样构建树上的另外一个工程的工程比较有用。EXCLUDE选项给出了那些须要排除在外的entry(ies)的一个list。INCLUDE_INTERNALS选项给出了须要包含的entry(ies)的内部entry(ies)的一个list。一般状况下,不须要引入内部entry(ies)。强烈不推荐使用该命令的这种格式,可是它能够被用来维持向后兼容性。

 

CMD#53 :load_command   将一条命令加载到一个运行中的CMake。

    load_command(COMMAND_NAME <loc1> [loc2 ...])

  该命令将在给定的路径下查找名字为cmCOMMAND_NAME的一个库。若是找到了,它将会以模块的方式被加载,而后该命令将会被添加到可用的CMake命令集中。一般,TRY_COMPILE选项被用在这个命令以前来编译这个模块。若是该命令被成功加载,一个名为CMAKE_LOADED_COMMAND_<COMMAND_NAME>的变量将会被设置为这个加载模块的完整路径。不然,这个变量就不会被设置。

 

CMD#54 :macro      为后续以命令方式调用而开始记录一组宏。

    macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
  endmacro(<name>)

  定义一个名为<name>的宏,它以arg1 arg2 arg3 (...)为参数。在macro命令以后,在与之配对的endmacro命令以前出现的命令,只有在宏被调用的时候才会被调用。当被调用的时候,这些被记录的命令首先以传进来的实参替换掉形参(如${arg1}),而后像正常的命令那样执行。除了形参以外,你还能够引用变量${ARGC},它表示传递到宏里的参数的数量;${ARG0}, ${ARG1}, ${ARG2} ...等等则是传进来的实参值。这些变量使得建立带可选参数的宏变得很便捷。此外,变量${ARGV}保留了全部传递到宏里的全部参数组成的一个list,变量${ARGN}保留了在最后一个形参以后的参数组成的一个list。注意:传递到宏内部的参数和值,好比ARGN不是CMake一般意义下的变量;它们只是字符串替换,这一点很是像C预处理器对C语言宏的处理过程。若是你想要用真正的CMake变量,你应该查看一下function命令的说明。

  关于在macro内部的策略的行为,参见cmake_policy()命令的相关文档。

 

CMD#55 :mark_as_advanced    将CMake 的缓存变量标记为高级。

    mark_as_advanced([CLEAR|FORCE] VAR VAR2 VAR...)

  将缓存的变量标记为高级变量。其中,高级变量指的是那些在cmake GUI中,只有当“显示高级选项”被打开时才会被显示的变量。若是CLEAR是第一个选项,参数中的高级变量将变回非高级变量。若是FORCE是第一个选项,参数中的变量会被提高为高级变量。若是二者都未出现,新的变量会被标记为高级变量;若是这个变量已是高级/非高级状态的话,它将会维持原状。

  该命令在脚本中无效。

 

CMD#56 :math     数学表达式。

    math(EXPR <output variable> <math expression>)

  EXPR计算数学表达式而后经过output变量返回计算结果。数学表达式的一个例子是"5*(10+13)"。该命令支持的运算符包括:+ - * / % ^ ~ << >> ;它们的含义与C语言中的彻底一致。

 

CMD#57 :message     为用户显示一条消息。

    message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]
"message to display" ...)

  能够用下述可选的关键字指定消息的类型:

      (无)           = 重要消息;
    STATUS = 非重要消息;
    WARNING = CMake 警告, 会继续执行;
    AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
    SEND_ERROR = CMake 错误, 继续执行,可是会跳过生成的步骤;
    FATAL_ERROR = CMake 错误, 终止全部处理过程;

  CMake的命令行工具会在stdout上显示STATUS消息,在stderr上显示其余全部消息。CMake的GUI会在它的log区域显示全部消息。交互式的对话框(ccmake和CMakeSetup)将会在状态行上一次显示一条STATUS消息,而其余格式的消息会出如今交互式的弹出式对话框中。

  CMake警告和错误消息的文本显示使用的是一种简单的标记语言。文本没有缩进,超过长度的行会回卷,段落之间以新行作为分隔符。

 

CMD#58 :set    变量赋值

  常规变量赋值    set(<variable> <value>... [PARENT_SCOPE])

  在当前函数和当前目录做用域下,给变量赋值

  cache赋值    set(<variable> <value>... CACHE <type> <docstring> [FORCE])

   环境变量赋值  set(ENV{<variable>} <value>...)

 

CMD#59 :option    提供编译选项

  option(<option_variable> "help string describing option" [initial value])

  initial value为ON和OFF。若是编译选项未能给initial value赋初值,则默认为OFF。若是改变initial value的值,须要清理CMakeCache.txt后从新生成

 

 CMD#60 :source_group   定义IDE中的文件树目录

  source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>]) 

  <name>:IDE中的目录名称

  FILES:指定目录的文件名,后缀名一致的文件可用*.txt格式代替,常与FILE命令一块儿使用,如

    FILE(GLOB SRC_LIST ${PROJECT_BINARY_DIR}/*.cpp)

    SOURCE_GROUP("IDE目录名" FILES ${SRC_LIST})

  REGULAR_EXPRESSION:正则表达式文件名

变量

  CMake变量按功能分有主要有四种不一样的类型:1.) 提供信息的变量[共53个];2.) 改变行为的变量[共23个];3.) 描述系统的变量[共24个];4.)控制构建过程的变量[共22个]。此外还有一些变量因编译使用的语言不一样而不一样,将它们归为第五类[共29个]。  因为变量比较多,这里只给出变量的大概描述;具体做用可以使用cmake --help-variable variable_name命令查看。    

1、提供信息的变量

  VAR#1-1 : CMAKE_AR  静态库的归档工具名字。

  VAR#1-2 : CMAKE_BINARY_DIR  构建树的顶层路径。

  VAR#1-3 : CMAKE_BUILD_TOOL  实际构建过程当中使用的工具。

  VAR#1-4 : CMAKE_CACHEFILE_DIR  文件CMakeCache.txt所在的路径。

  VAR#1-5 : CMAKE_CACHE_MAJOR_VERSION  用于建立CMakeCache.txt文件的CMake的主版本号。

  VAR#1-6 : VCMAKE_CACHE_MINOR_VERSION  用于建立CMakeCache.txt文件的CMake的子版本号。

  VAR#1-7 : CMAKE_CACHE_PATCH_VERSION  用于建立CMakeCache.txt文件的CMake的补丁号。

  VAR#1-8 : CMAKE_CFG_INTDIR 构建时,与构建配置相对应的输出子路径(只读)。

  VAR#1-9 : CMAKE_COMMAND 指向CMake可执行文件的完整路径。

  VAR#1-10 : CMAKE_CROSSCOMPILING  指出CMake是否正在交叉编译。

  VAR#1-11 : CMAKE_CTEST_COMMAND  与cmake一块儿安装的ctest命令的完整路径。

  VAR#1-12 : CMAKE_CURRENT_BINARY_DIR 当前正在被处理的二进制目录的路径。

  VAR#1-13 : CMAKE_CURRENT_LIST_DIR  当前正在处理的listfile的完整目录。

  VAR#1-14 : CMAKE_CURRENT_LIST_FILE  当前正在处理的listfile的完整路径。

  VAR#1-15 : CMAKE_CURRENT_LIST_LINE  当前正在处理的listfile的行号。

  VAR#1-16 : CMAKE_CURRENT_SOURCE_DIR  指向正在被处理的源码目录的路径。

  VAR#1-17 : CMAKE_DL_LIBS  包含dlopen和dlclose函数的库的名称。

  VAR#1-18 : CMAKE_EDIT_COMMAND  指向cmake-gui或ccmake的完整路径。

  VAR#1-19 : CMAKE_EXECUTABLE_SUFFIX(_<LANG>) 本平台上可执行文件的后缀。

  VAR#1-20 : CMAKE_EXTRA_GENERATOR  构建本工程所须要的额外生成器。

  VAR#1-21 : CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES 附加的共享库后缀(除CMAKE_SHARED_LIBRARY_SUFFIX之外,其余能够识别的共享库的后缀名。)

  VAR#1-22 : CMAKE_GENERATOR  用于构建该工程的生成器。

  VAR#1-23 : CMAKE_HOME_DIRECTORY 指向源码树顶层的路径。

  VAR#1-24 : CMAKE_IMPORT_LIBRARY_PREFIX(_<LANG>)  须要连接的导入库的前缀。

  VAR#1-25 : CMAKE_IMPORT_LIBRARY_SUFFIX(_<LANG>)  须要连接的导入库的后缀。

  VAR#1-26 : CMAKE_LINK_LIBRARY_SUFFIX  须要连接的库的后缀。

  VAR#1-27 : CMAKE_MAJOR_VERSION  cmake的主版本号(例如2.X.X中的2)。

  VAR#1-28 : CMAKE_MAKE_PROGRAM  参见CMAKE_BUILD_TOOL。

  VAR#1-29 : CMAKE_MINOR_VERSION  cmake的次版本号(例如X.4.X中的4)。

  VAR#1-30 : CMAKE_PARENT_LIST_FILE  当前正在被处理listfile的父listfile的全路径。

  VAR#1-31 : CMAKE_PATCH_VERSION  cmake的补丁号(例如X.X.3中的3)。

  VAR#1-32 : CMAKE_PROJECT_NAME  当前工程的工程名。

  VAR#1-33 : CMAKE_RANLIB  静态库的随机化工具的名字(好比linux下的ranlib)。

  VAR#1-34 : CMAKE_ROOT  CMake的安装路径。

  VAR#1-35 : CMAKE_SHARED_LIBRARY_PREFIX(_<LANG>)  被连接的共享库的前缀。

  VAR#1-36 : CMAKE_SHARED_LIBRARY_SUFFIX(_<LANG>)  被连接的共享库的后缀。

  VAR#1-37 : CMAKE_SHARED_MODULE_PREFIX(_<LANG>)  被连接的可加载模块的前缀。

  VAR#1-38 : CMAKE_SHARED_MODULE_SUFFIX(_<LANG>)  被连接的共享库的后缀。

  VAR#1-39 : CMAKE_SIZEOF_VOID_P void指针的长度。

  VAR#1-40 : CMAKE_SKIP_RPATH  若是变量为真,不为编译出的可执行文件添加运行时的路径信息。默认添加。

  VAR#1-41 : CMAKE_SOURCE_DIR  源码树的顶层路径。

  VAR#1-42 : CMAKE_STANDARD_LIBRARIES  连接到全部可执行文件和共享库上的库。这是一个list。

  VAR#1-43 : CMAKE_STATIC_LIBRARY_PREFIX(_<LANG>)  被连接的静态库的前缀。

  VAR#1-44 : CMAKE_STATIC_LIBRARY_SUFFIX(_<LANG>)  被连接的静态库的后缀。

  VAR#1-45 : CMAKE_TWEAK_VERSION  cmake的tweak版本号(例如X.X.X.1中的1)。

  VAR#1-46 : CMAKE_USING_VC_FREE_TOOLS  若是用到了免费的visual studio工具,设置为真。

  VAR#1-47 : CMAKE_VERBOSE_MAKEFILE  设置该变量为真将建立完整版本的makefile。

  VAR#1-48 : CMAKE_VERSION  cmake的完整版本号;格式为major.minor.patch[.tweak[-id]]。

  VAR#1-49 : PROJECT_BINARY_DIR  指向工程构建目录的全路径。

  VAR#1-50 : PROJECT_NAME  向project命令传递的工程名参数。

  VAR#1-51 : PROJECT_SOURCE_DIR  当前工程的源码路径。

  VAR#1-52 : [Project name]_BINARY_DIR  给定工程的二进制文件顶层路径。

  VAR#1-53 : [Project name]_SOURCE_DIR  给定工程的源码顶层路径。

相关文章
相关标签/搜索