CMake 手册详解(16-20)

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运算符的左边的参数和右边的参数会被独立测试,用来确认它们是否是布尔常量;如果是,就用这个常量,否则它们会被当做变量然后被解引用。
<<<------------- 欢迎转载;转载请标明出处。 ------------->>>


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

<<<------------- 欢迎转载;转载请标明出处。 ------------->>>

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值