CMake编程(三)

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...]
             [INCLUDE_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: option 为用户提供一个可选项。

  option(<option_variable> "描述选项的帮助性文字" [initial value])

  该命令为用户提供了一个在ON和OFF中做出选择的选项。如果没有指定初始值,将会使用OFF作为初值。如果有些选项依赖于其他选项的值,参见CMakeDependentOption模块的帮助文件。

CMD#59: output_required_files 输出一个list,其中包含了一个给定源文件所需要的其他源文件。

  output_required_files(srcfile outputfile)

  输出一个指定的源文件所需要的所有源文件的list。这个list会写到outputfile变量中。该命令的功能是将srcfile的依赖性写出到outputfile中,不过该命令将尽可能地跳过.h文件,搜索依赖中的.cxx,.c和.cpp文件。

CMD#60: project  为整个工程设置一个工程名。

  project(<projectname> [languageName1 languageName2 ... ] )

  为本工程设置一个工程名。而且,该命令还将变量<projectName>_BINARY_DIR和<projectName>_SOURCE_DIR设置为对应值。后面的可选项还可以让你指定你的工程可以支持的语言。比如CXX(即C++),C,Fortran,等等。在默认条件下,支持C和CXX语言。例如,如果你没有C++编译器,你可以通过列出你想要支持的语言,例如C,来明确地禁止对它的检查。使用特殊语言"NONE",针对任何语言的检查都会被禁止。

CMD#61: qt_wrap_cpp  创建Qt包裹器。

  qt_wrap_cpp(resultingLibraryName DestName SourceLists ...)

  为所有在SourceLists中列出的.h文件生成moc文件。这些moc文件将会被添加到那些使用DestName源文件列表的库文件中。

Produce moc files for all the .h files listed in the SourceLists. The moc files will be added to the library using the DestName source list.

CMD#62: qt_wrap_ui 创建Qt的UI包裹器。

  qt_wrap_ui(resultingLibraryName HeadersDestName SourcesDestName SourceLists ...)

  为所有在SourceLists中列出的.ui文件生成.h和.cxx文件。这些.h文件会被添加到使用HeadersDestNamesource列表的库中。这些.cxx文件会被添加到使用SourcesDestNamesource列表的库中。

CMD#63: remove_definitions 取消由add_definitions命令添加的-D定义标志。

  remove_definitions(-DFOO -DBAR ...)

  在当前及以下的路径,从编译命令行中取消(由add_definitions命令添加的)标志。

CMD#64: return  从一个文件,路径或函数内返回。

  return()

  从一个文件,路径或函数中返回。若出现在一个include文件里(经由include()或find_package()命令),该命令会导致当前文件的处理过程停止,并且将控制权转移到试图包含它的文件中。若出现在一个不被任何文件包含的文件中,例如,一个CMakeLists.txt中,那么该命令将控制权转移到父目录下,如果存在这样的父目录的话。如果在一个函数中调用return函数,控制权会返回到该函数的调用函数那里。注意,宏不是函数,它不会像函数那样去处理return命令。

CMD#65: separate_arguments 将空格分隔的参数解析为一个分号分隔的list。

  separate_arguments(<var> <UNIX|WINDOWS>_COMMAND "<args>")

  解析一个unix或者windows风格的命令行字符串"<args>",并将结果以分号分隔的list的形式存储到<var>中。整个命令行都必须从这个"<args>"参数中给出。

  UNIX_COMMAND模式以没有被括起来的白字符为参数的分隔符。它可以识别单引号和双引号的引号对。反斜杠可以对下一个字符的字面值转义(\",就是");没有其他特殊的转义字符(例如\n就是n)。

  WINDOWS_COMMAND模式按照与运行时库相同的语法解析一个windows命令行,在启动(starrtup)时构造argv。它使用没有被双引号括起来的白字符来分隔参数。反斜杠维持其字面含义,除非它们在双引号之前。更多细节,参见MSDN的文章:"Parsing C Command-Line Arguments"。

  separate_arguments(VARIABLE)

  将VARIABLE的值转换为一个分号分隔的list。所有的空格会被替换为';'。该命令可以用来辅助生成命令行。

CMD#66: set 将一个CMAKE变量设置为给定值。

  set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

  将变量<variable>的值设置为<value>。在<variable>被设置之前,<value>会被展开。如果有CACHE选项,那么<variable>就会添加到cache中;这时<type>和<docstring>是必需的。<type>被CMake GUI用来选择一个窗口,让用户设置值。<type>可以是下述值中的一个:

  FILEPATH = 文件选择对话框。
  PATH     = 路径选择对话框。
  STRING   = 任意的字符串。
  BOOL     = 布尔值选择复选框。
  INTERNAL = 不需要GUI输入端。(适用于永久保存的变量)。

  如果<type>是内部的(INTERNAL),那么<value>总是会被写入到cache中,并替换任何已经存在于cache中的值。如果它不是一个cache变量,那么这个变量总是会写入到当前的makefile中。FORCE选项将覆盖cache值,从而去掉任何用户带来的改变。

  如果指定了PARENT_SCOPE选项,变量<variable>将会被设置为当前作用域之上的作用域中。每一个新的路径或者函数都可以创建一个新作用域。该命令将会把一个变量的值设置到父路径或者调用函数中(或者任何类似的可用的情形中。)

  如果没有指定<value>,那么这个变量就会被撤销而不是被设置。另见:unset()命令。

  set(<variable> <value1> ... <valueN>)

  在这种情形下,<variable>被设置为一个各个值之间由分号分隔的list。

  <variable>可以是环境变量,比如:

  set( ENV{PATH} /home/martink )

  在这种情形下,环境变量将会被设置。

CMD#67: set_directory_properties  设置某个路径的一种属性。

  set_directory_properties(PROPERTIES prop1 value1 prop2 value2)

  为当前的路径及其子路径设置一种属性。如果该属性不存在,CMake将会报告一个错误。属性包括:INCLUDE_DIRECTORIES, LINK_DIRECTORIES, INCLUDE_REGULAR_EXPRESSION, 以及ADDITIONAL_MAKE_CLEAN_FILES共四种。ADDITIONAL_MAKE_CLEAN_FILES是一个文件名的list,其中包含有"make clean"阶段会被清除掉的文件。

CMD#68: set_property  在给定的作用域内设置一个命名的属性。

  set_property(<GLOBAL                            |
                DIRECTORY [dir]                   |
                TARGET    [target1 [target2 ...]] |
                SOURCE    [src1 [src2 ...]]       |
                TEST      [test1 [test2 ...]]     |
                CACHE     [entry1 [entry2 ...]]>
               [APPEND]
               PROPERTY <name> [value1 [value2 ...]])

  为作用域里的0个或多个对象设置一种属性。第一个参数决定了属性可以影响到的作用域。他必须是下述值之一:GLOBAL,全局作用域,唯一,并且不接受名字。DIRECTORY,路径作用域,默认为当前路径,但是也可以用全路径或相对路径指定其他值。TARGET,目标作用域,可以命名0个或多个已有的目标。SOURCE,源作用域,可以命名0个或多个源文件。注意,源文件属性只对加到相同路径(CMakeLists.txt)中的目标是可见的。TEST 测试作用域可以命名0个或多个已有的测试。CACHE作用域必须指定0个或多个cache中已有的条目。

  PROPERTY选项是必须的,并且要紧跟在待设置的属性的后面。剩余的参数用来组成属性值,该属性值是一个以分号分隔的list。如果指定了APPEND选项,该list将会附加在已有的属性值之后。

CMD#69: set_source_files_properties 源文件有一些属性来可以改变它们构建的方式。

  set_source_files_properties([file1 [file2 [...]]]
                              PROPERTIES prop1 value1
                              [prop2 value2 [...]])

  以键/值对的方式设置与源文件相关的那些属性值。那些CMake中的源文件属性,参见关于属性的相关文档。不能被识别的属性将会被忽略。源文件属性只对同一路径(CMakeLists.txt)中添加的目标可见。

CMD#70: set_target_properties  设置目标的一些属性来改变它们构建的方式。

  set_target_properties(target1 target2 ...
                        PROPERTIES prop1 value1
                        prop2 value2 ...)

  为一个目标设置属性。该命令的语法是列出所有你想要变更的文件,然后提供你想要设置的值。你能够使用任何你想要的属性/值对,并且在随后的代码中调用GET_TARGET_PROPERTY命令取出属性的值。

  影响一个目标输出文件的名字的属性详述如下。PREFIX和SUFFIX属性覆盖了默认的目标名前缀(比如lib)和后缀(比如.so)。IMPORT_PREFIX和IMPORT_SUFFIX是与之等价的属性,不过针对的是DLL(共享库目标)的导入库。在构建目标时,OUTPUT_NAME属性设置目标的真实名字,并且可以用来辅助创建两个具有相同名字的目标,即使CMake需要唯一的逻辑目标名。<CONFIG>_OUTPUT_NAME可以为不同的配置设置输出的目标名字。当目标在指定的配置名<CONFIG>(全部大写,例如DEBUG_POSTFIX)下被构建时,<CONFIG>_POSTFIX为目标的真实名字设置一个后缀。该属性的值在目标创建时被初始化为CMAKE_<CONFIG>_POSTFIX的值(可执行目标除外,因为较早的CMake版本不会为可执行文件使用这个属性。)

  LINK_FLAGS属性可以用来为一个目标的链接阶段添加额外的标志。LINK_FLAGS_<CONFIG>将为配置<CONFIG>添加链接标志,例如DEBUG,RELEASE,MINSIZEREL,RELWITHDEBINFO。DEFINE_SYMBOL属性设置了编译一个共享库中的源文件时才会被定义的预处理器符号名。如果这个值没有被设置的话,那么它会被设置为默认值target_EXPORTS(如果目标不是一个合法的C标示符的话可以用一些替代标志)。这对于检测头文件是包含在它们的库以内还是以外很有帮助,从而可以合理设置dllexport/dllimport修饰符(注意,只有在编译到的时候,这个符号才会被定义;因此猜测在代码中,判断预处理符号是否被定义可以知道依赖库是导入的还是导出的——译注)。COMPILE_FLAGS属性可以设置附加的编译器标志,它们会在构建目标内的源文件时被用到。它也可以用来传递附加的预处理器定义。

  LINKER_LANGUAGE属性用来改变链接可执行文件或共享库的工具。默认的值是设置与库中的文件相匹配的语言。CXX和C是这个属性的公共值。

  对于共享库,VERSION和SOVERSION属性分别可以用来指定构建的版本号以及API版本号。当构建或者安装时,如果平台支持符号链接并且链接器支持so名字,那么恰当的符号链接会被创建。如果只指定两者中的一个,缺失的另一个假定为具有相同的版本号。对于可执行文件,VERSION可以被用来指定构建版本号。当构建或者安装时,如果该平台支持符号链接,那么合适的符号链接会被创建。对于在Windows系统而言,共享库和可执行文件的VERSION属性被解析成为一个"major.minor"的版本号。这些版本号被用做该二进制文件的镜像版本。

  还有一些属性用来指定RPATH规则。INSTALL_RPATH是一个分号分隔的list,它指定了在安装目标时使用的rpath(针对支持rpath的平台而言)(-rpath在gcc中用于在编译时指定加载动态库的路径;优先级较系统库路径要高。详情参见http://www.cmake.org/Wiki/CMake_RPATH_handling#What_is_RPATH_.3F——译注)。INSTALL_RPATH_USE_LINK_PATH是一个布尔值属性,如果它被设置为真,那么在链接器的搜索路径中以及工程之外的目录会被附加到INSTALL_RPATH之后。SKIP_BUILD_RPATH是一个布尔值属性,它指定了是否跳过一个rpath的自动生成过程,从而可以从构建树开始运行。BUILD_WITH_INSTALL_RPATH是一个布尔值属性,它指定了是否将在构建树上的目标与INSTALL_RPATH链接。该属性要优先于SKIP_BUILD_RPATH,因此避免了安装之前的重新链接。INSTALL_NAME_DIR是一个字符串属性,它用于在Mac OSX系统上,指定了被安装的目标中使用的共享库的"install_name"域的目录部分。如果目标已经被创建,变量CMAKE_INSTALL_RPATH, CMAKE_INSTALL_RPATH_USE_LINK_PATH, CMAKE_SKIP_BUILD_RPATH, CMAKE_BUILD_WITH_INSTALL_RPATH和CMAKE_INSTALL_NAME_DIR的值会被用来初始化这个属性。

  PROJECT_LABEL属性可以用来在IDE环境,比如visual studio,中改变目标的名字。 VS_KEYWORD可以用来改变visual studio的关键字,例如如果该选项被设置为Qt4VSv1.0的话,QT集成将会运行得更好。

  VS_SCC_PROJECTNAME, VS_SCC_LOCALPATH, VS_SCC_PROVIDER可以被设置,从而增加在一个VS工程文件中对源码控制绑定的支持。

  PRE_INSTALL_SCRIPT和POST_INSTALL_SCRIPT属性是在安装一个目标之前及之后指定运行CMake脚本的旧格式。只有当使用旧式的INSTALL_TARGETS来安装目标时,才能使用这两个属性。使用INSTALL命令代替这种用法。

  EXCLUDE_FROM_DEFAULT_BUILD属性被visual studio生成器使用。如果属性值设置为1,那么当你选择"构建解决方案"时,目标将不会成为默认构建的一部分。

CMD#71: set_tests_properties   设置若干个测试的属性值。

  set_tests_properties(test1 [test2...] PROPERTIES prop1 value1 prop2 value2)

  为若干个测试设置一组属性。若属性未被发现,CMake将会报告一个错误。这组属性包括:WILL_FAIL, 如果设置它为true,那将会把这个测试的“通过测试/测试失败”标志反转。PASS_REGULAR_EXPRESSION,如果它被设置,这个测试的输出将会被检测是否违背指定的正则表达式,并且至少要有一个正则表达式要匹配;否则测试将会失败。

  例子: PASS_REGULAR_EXPRESSION "TestPassed;All ok"

  FAIL_REGULAR_EXPRESSION: 如果该属性被设置,那么只要输出匹配给定的正则表达式中的一个,那么测试失败。

  例子: PASS_REGULAR_EXPRESSION "[^a-z]Error;ERROR;Failed"

  PASS_REGULAR_EXPRESSION和FAIL_REGULAR_EXPRESSION属性都期望一个正则表达式列表(list)作为其参数。

  TIMEOUT: 设置该属性将会限制测试的运行时长不超过指定的秒数。

CMD#72: site_name  将给定的变量设定为计算机名。

  site_name(variable)

CMD#73: source_group  为Makefile中的源文件定义一个分组。

  source_group(name [REGULAR_EXPRESSION regex] [FILES src1 src2 ...])

  为工程中的源文件中定义一个分组。这主要用来在Visual Studio中建立文件组按钮(file tabs)。所有列出来的文件或者匹配正则表达式的文件都会被放到这个文件组中。如果一个文件匹配多个组,那么最后明确地列出这个文件的组将会包含这个文件,如果有这样的组的话。如果没有任何组明确地列出这个文件,那么最后那个其正则表达式与该文件名匹配的组,将会成为最终候选者。

  组名中可以包含反斜杠,以指定子文件组:source_group(outer\\inner ...)

  为了保持后向兼容性,这个命令也支持这种格式:source_group(name regex)

CMD#74: string  字符串操作函数。

  string(REGEX MATCH <regular_expression> <output variable> <input> [<input>...])
  string(REGEX MATCHALL <regular_expression> <output variable> <input> [<input>...])
  string(REGEX REPLACE <regular_expression> <replace_expression> <output variable> <input> [<input>...])
  string(REPLACE <match_string> <replace_string> <output variable> <input> [<input>...])
  string(COMPARE EQUAL <string1> <string2> <output variable>)
  string(COMPARE NOTEQUAL <string1> <string2> <output variable>)
  string(COMPARE LESS <string1> <string2> <output variable>)
  string(COMPARE GREATER <string1> <string2> <output variable>)
  string(ASCII <number> [<number> ...] <output variable>)
  string(CONFIGURE <string1> <output variable> [@ONLY] [ESCAPE_QUOTES])
  string(TOUPPER <string1> <output variable>)
  string(TOLOWER <string1> <output variable>)
  string(LENGTH <string> <output variable>)
  string(SUBSTRING <string> <begin> <length> <output variable>)
  string(STRIP <string> <output variable>)
  string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output variable>)

  REGEX MATCH : 匹配正则表达式一次,然后将匹配的值存储到输出变量中。

  REGEX MATCHALL : 尽可能多次地匹配正则表达式,然后将匹配的值以list的形势存储到输出变量中。

  REGEX REPLACE : 尽可能多次地匹配正则表达式,并且将匹配的值用replacement expression 替换掉,然后存储到输出变量中。这个replace expression 可以引用包含匹配字符串的子表达式,这些匹配的字符串用圆括号隔开的\1,\2,...,\9等加以引用。注意:在CMake代码里,如果要使用一个反斜杠,必须要用两个反斜杠(\\1)转义,才能通过参数解析。

  REPLACE : 将输入字符串内所有出现match_string的地方都用replace_string代替,然后将结果存储到输出变量中。

  COMPARE EQUAL/NOTEQUAL/LESS/GREATER : 将会比较两个字符串,然后将比较的结果(true/false)存储到输出变量中。

  ASCII : 将会把所有数字转换为对应的ASCII字符。

  CONFIGURE : 将一个字符串进行变换,这种变换与将一个FILE变换为CONFIGURE_FILE相似。

  TOUPPER/TOLOWER : 将字符串转换为大写/小写字符。

  LENGTH : 返回给定字符串的长度。

  SUBSTRING : 返回给定字符串的子串。

  STRIP : 返回一个给定字符串的子串,它会去掉原先字符串开始和结尾的空格。

  RANDOM : 将会返回一个给定长度的随机字符串,它由给定的字母表中的字母组成。默认的长度是5个字符,默认的字母表是全部的大小写字母以及数字。如果指定了一个整数RANDOM_SEED,它的值将会被用做随机数发生器的种子。

  在正则表达式中,下述字符有特殊含义:

   ^         在行首匹配。
   $         在行尾匹配。
   .         匹配任意单个字符。
   [ ]       匹配在中括号中的任意字符。
   [^ ]      匹配不在中括号中的任意字符。
    -        匹配任意在短横线两端字符闭区间中间的任意一个字符。
   *         匹配先前模式零次或多次。
   +         匹配先前模式一次或多次。
   ?         匹配先前模式零次或一次。
   |         匹配|两侧的任意一种模式。
   ()        保存一个匹配的子表达式,这个子表达式后续可以在REGEX REPLACE操作中以\n的方式引用。 它也会被所有正则表达式相关的命令所保存;包括,比如,
        如果用到if( MATCHES )命令的话,这些匹配的值被保存在变量CMAKE_MATCH_(0..9)中。

CMD#75: target_link_libraries  将给定的库链接到一个目标上。

  target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)

  为给定的目标设置连接时使用的库或者标志(flags)。如果一个库名字与工程中的另外一个目标相匹配,一个依赖关系会自动添加到构建系统中来,这样就可以在链接目标之前,保证正在被链接的库是最新的。以“-”开始,但不是“-l”或“-framework”的那些项,将会被当作链接器标志来处理。

  关键字“debug”,“optimized”或者“general” 表示紧随关键字之后的库仅仅会被用到相应的构建配置上。“debug”关键字对应于调试配置(或者,如果全局属性DEBUG_CONFIGURATIONS被设置的话,就是DEBUG_CONFIGURATIONS中的名字所指定的配置)。“optimized”关键字对应于所有其他的配置类型。“general”关键字对应于所有的配置,并且纯粹是可选的(它是默认配置,可以省略)。通过创建并链接到导入库目标,可以对每种配置规则进行更细致的粒度控制。更多内容参见add_library命令的IMPORTED模式。

  默认时,库之间的依赖性是可传递的。当这个目标被链接到其他目标上时,那么链接到这个目标上的库也会出现在其他目标的链接依赖上。参见LINK_INTERFACE_LIBRARIES属性的相关文档,其中有关于如何覆盖一个目标的链接依赖性传递设置的介绍。

  target_link_libraries(<target> LINK_INTERFACE_LIBRARIES [[debug|optimized|general] <lib>] ...)

  对于LINK_INTERFACE_LIBRARIES模式,它将会把库附加在LINK_INTERFACE_LIBRARIES以及LINK_INTERFACE_LIBRARIES在不同配置下的等价目标属性,而不是用这些库去链接。指定为“debug”的库将会被附加到LINK_INTERFACE_LIBRARIES_DEBUG属性(或者是在DEBUG_CONFIGURATIONS全局属性中列出的配置,如果DEBUG_CONFIGURATIONS被设置的话)。指定为“optimized”库将会被附加到LINK_INTERFACE_LIBRARIES属性上。指定为“general”的库(或者没有任何关键字的库),将会被当做即被指定为“debug”又被指定为“optimized”对待。

  库之间的依赖图通常是非循环图(DAG),但是如果出现互相依赖的静态库,CMake会允许依赖图中包含循环依赖(强连通分支)。当其它目标链接到这些库中的一个时,CMake会重复整个连通分支。例如,代码:

1
2
3
4
5
6
add_library(A STATIC a.c)
add_library(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)

将“main”链接到了“A B A B”。(虽然通常一次重复就足够了,但是病态对象文件以及符号排布可能需要多次重复。你可以通过在上一次target_link_libraries调用中手动重复该分支来处理这种情况。不过,如果两个归档文件确实是如此紧密的相互关联,它们可能会被合并为一个单一的归档文件。) 

CMD#76: try_compile 尝试编译一些代码。

  try_compile(RESULT_VAR bindir srcdir
              projectName <targetname> [CMAKE_FLAGS <Flags>]
              [OUTPUT_VARIABLE var])

  尝试编译一个程序。在这种格式时,srcdir路径下应该包含一个完整的CMake工程,包括CMakeLists.txt文件以及所有的源文件。在该命令运行完之后,路径bindir和srcdir不会被删除。如果指定了<target name>,那么CMake将只构建那个目标;否则,目标all或ALL_BUILD将会被构建。

  try_compile(RESULT_VAR bindir srcfile
              [CMAKE_FLAGS <Flags>]
              [COMPILE_DEFINITIONS <flags> ...]
              [OUTPUT_VARIABLE var]
              [COPY_FILE <filename> )

  尝试编译一个srcfile。在这种情况下,用户仅仅需要提供源文件。CMake会创建合适的CMakeLists.txt文件来构建源文件。如果使用了COPY_FILE选项,编译出的文件将会被拷贝到给定的文件那里。

  在这个版本里,所有在bindir/CMakeFiles/CMakeTmp文件夹下的文件,将会被自动清除;通过向CMake传递调试选项--debug-trycompile可以避免这个清除步骤。另外一些可以包含的额外标志有:INCLUDE_DIRECTORIES, LINK_DIRECTORIES, 和LINK_LIBRARIES。COMPILE_DEFINITIONS是通过-Ddefinations选项设置的预定义符号,这会传递到编译器命令行。try_compile命令在构建过程中伴随创建出的CMakeLists.txt看起来像这样:

  add_definitions( <expanded COMPILE_DEFINITIONS from calling cmake>)
  include_directories(${INCLUDE_DIRECTORIES})
  link_directories(${LINK_DIRECTORIES})
  add_executable(cmTryCompileExec sources)
  target_link_libraries(cmTryCompileExec ${LINK_LIBRARIES})

  在该命令的这两种版本里,如果指定了OUTPUT_VARIABLE,那么构建过程的输出会存储到给定的变量里。编译成功或失败的结果,会通过RESULT_VAR返回。CMAKE_FLAGS可以用来向正在构建的CMake传递-DVAR:TYPE = VALUE 符号。

CMD#77: try_run  尝试编译并运行某些代码。

  try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR
          bindir srcfile [CMAKE_FLAGS <Flags>]
          [COMPILE_DEFINITIONS <flags>]
          [COMPILE_OUTPUT_VARIABLE comp]
          [RUN_OUTPUT_VARIABLE run]
          [OUTPUT_VARIABLE var]
          [ARGS <arg1> <arg2>...])

  尝试编译一个源文件srcfile。通过变量COMPILE_RESULT_VAR返回TRUE或者FALSE来反应编译是否失败。如果构建出了可执行文件,但是不能运行,那么RUN_RESULT_VAR会被设置为FAILED_TO_RUN。COMPILE_OUTPUT_VARIABLE变量指定了一个变量,这个变量存储了构建步骤输出的信息。RUN_OUTPUT_VARIABLE指定了一个变量,这个变量存储了运行可执行文件时的输出。出于兼容性的考虑,OUTPUT_VARIABLE还会被支持,它包含了包含编译和运行阶段的输出信息。

交叉编译相关问题

  当运行交叉编译时,第一步中编译出的可执行文件通常不能在编译宿主机上直接运行。try_run()函数会检查CMAKE_CROSSCOMPILING变量来检测CMake是否是交叉编译模式。如果是的话,CMake还是会尝试编译可执行文件,但是它不会尝试运行可执行文件。相反,他会创建一些cache变量,这些变量必须由用户填充,或者在某个CMake脚本中预先设置为那些在真实目标机平台上执行的结果。这些变量有:RUN_RESULT_VAR (解释参见上文),以及如果使用了RUN_OUTPUT_VARIABLE (或者OUTPUT_VARIABLE) ,还有一个附加的cache变量RUN_RESULT_VAR__COMPILE_RESULT_VAR__TRYRUN_OUTPUT。该变量是为了保存执行过程中stdout和stderr的输出。

  为了让交叉编译更加容易些,必要时再使用try_run命令。如果你使用了try_run命令,那么只有必要时才使用RUN_OUTPUT_VARIABLE(或者OUTPUT_VARIABLE)变量。在交叉编译时,使用这些变量需要cache变量必须被手动设置为可执行文件的输出。你也可以用if(CMAKE_CROSSCOMPILING)将try_run的调用“保护”起来,同时还要为这种情形给定一个易于预先设置的备选方案。

CMD#78 unset  撤销对一个变量,cache变量或者环境变量的设置。

  unset(<variable> [CACHE])

  删除一个指定的变量,让它变成未定义的。如果指定了CACHE选项,那么这个变量将会从cache中删除而不是当前作用域。<variable>可以是一个环境变量,比如:

  unset(ENV{LD_LIBRARY_PATH})

在这个例子中,这个变量将会从当前的环境中被删除。

CMD#79 : variable_watch  监视CMake变量的改变。

  variable_watch(<variable name> [<command to execute>])

  如果给定的变量发生了变化,关于正在被改写的变脸的消息会被打印出来。如果指定了command选项,这条命令会被执行。这条命令会接受这样的参数:COMMAND(<variable> <access> <value> <current list file> <stack>)

CMD#80: while  当条件为真时,评估(执行)一组命令。

  while(condition)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
  endwhile(condition)

  所有在while和与之配对的endwhile之间的命令将会被记录,但并不会执行。只有当endwhile被评估,并且条件为真时,这个命令列表的记录才会被调用。条件值的评估与if命令使用相同的逻辑。

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

一、提供信息的变量

  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  给定工程的源码顶层路径。

发布了347 篇原创文章 · 获赞 607 · 访问量 260万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览