CMake编程(二)

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选项,搜索过程如下:

  1、在cmake特有的cache变量中指定的搜索路径搜索。这些路径用于在命令行里用-DVAR=value被设置。如果使用了NO_CMAKE_PATH选项,该路径会被跳过。(此句翻译可能有误——译注。)搜索路径还包括:    

  对于每个在CMAKE_PREFIX_PATH中的路径<prefix>,<prefix>/include  

  变量:CMAKE_INCLUDE_PATH
  变量:CMAKE_FRAMEWORK_PATH

  2、在cmake特定的环境变量中指定的搜索路径搜索。该路径会在用户的shell配置中被设置。如果指定了NO_CMAKE_ENVIRONMENT_PATH选项,该路径会被跳过。搜索路径还包括:

  对于每个在CMAKE_PREFIX_PATH中的路径<prefix>,<prefix>/include  
  变量:CMAKE_INCLUDE_PATH
  变量:CMAKE_FRAMEWORK_PATH

  3、由HINTS选项指定的搜索路径。这些路径是由系统内省(introspection)时计算出来的路径,比如已经发现的其他项的位置所提供的痕迹。硬编码的参考路径应该使用PATHS选项指定。(HINTS与PATHS有何不同?比后者的优先级高?有疑问。——译注)

  4、搜索标准的系统环境变量。如果指定NO_SYSTEM_ENVIRONMENT_PATH选项,搜索路径将跳过其后的参数。搜索路径包括环境变量PATH个INCLUDE。

  5、查找在当前系统的平台文件中定义的cmake变量。如果指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。其他的搜索路径还包括:

  对于每个在CMAKE_PREFIX_PATH中的路径<prefix>,<prefix>/include  
  变量:CMAKE_SYSTEM_INCLUDE_PATH
  变量:CMAKE_SYSTEM_FRAMEWORK_PATH

  6、搜索由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选项,那么搜索的过程中不会有其他的附加路径。如果没有指定该选项,搜索过程如下:

  1、搜索cmake特有的cache变量指定的路径。这些变量是在用cmake命令行时,通过-DVAR=value指定的变量。如果指定了NO_CMAKE_PATH选项,这些路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/lib 
   CMAKE_LIBRARY_PATH
   CMAKE_FRAMEWORK_PATH

  2、搜索cmake特有的环境变量指定的路径。这些变量是用户的shell配置中设置的变量。如果指定了NO_CMAKE_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/lib 
   CMAKE_LIBRARY_PATH
   CMAKE_FRAMEWORK_PATH

  3、搜索由HINTS选项指定的路径。这些路径是系统内省(introspection)估算出的路径,比如由另一个已经发现的库文件的地址提供的参考信息。硬编码的推荐路径应该通过PATHS选项指定。

  4、查找标准的系统环境变量。如果指定了NO_SYSTEM_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:

   PATH
   LIB

  5、查找在为当前系统的平台文件中定义的cmake变量。如果指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路径<prefix>/lib 
   CMAKE_SYSTEM_LIBRARY_PATH
   CMAKE_SYSTEM_FRAMEWORK_PATH

  6、搜索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_*选项都会被激活。

  1、搜索在cmake特有的cache变量中指定的搜索路径。这些变量是为了在命令行中用-DVAR=value选项指定而设计的。通过指定NO_CMAKE_PATH选项可以跳过该搜索路径。搜索路径还包括:

    CMAKE_PREFIX_PATH
   CMAKE_FRAMEWORK_PATH
   CMAKE_APPBUNDLE_PATH

  2、搜索cmake特有的环境变量。这些变量是为了在用户的shell配置中进行配置而设计的。通过指定NO_CMAKE_ENVIRONMENT_PATH选项可以跳过该路径。搜索的路径包括:

   <package>_DIR
   CMAKE_PREFIX_PATH
   CMAKE_FRAMEWORK_PATH
   CMAKE_APPBUNDLE_PATH

  3、搜索HINTS选项指定的路径。这些路径应该是由操作系统内省时计算产生的,比如由其它已经找到的项的位置而提供的线索。硬编码的参考路径应该在PATHS选项中指定。

  4、搜索标准的系统环境变量。如果指定了NO_SYSTEM_ENVIRONMENT_PATH选项,这些路径会被跳过。以"/bin"或"/sbin"结尾的路径条目会被自动转换为它们的父路径。搜索的路径包括:

   PATH

  5、搜索在CMake GUI中最新配置过的工程的构建树。可以通过设置NO_CMAKE_BUILDS_PATH选项来跳过这些路径。这是为了在用户正在依次构建多个相互依赖的工程时而准备的。

  6、搜索存储在CMake用户包注册表中的路径。通过设置NO_CMAKE_PACKAGE_REGISTRY选项可以跳过这些路径。当CMake嗲用export(PACKAGE<name>)配置一个工程时,这些路径会被存储在注册表中。参见export(PACKAGE)命令的文档阅读更多细节。

  7、搜索在当前系统的平台文件中定义的cmake变量。可以用NO_CMAKE_SYSTEM_PATH选项跳过这些路径。

   CMAKE_SYSTEM_PREFIX_PATH

   CMAKE_SYSTEM_FRAMEWORK_PATH

   CMAKE_SYSTEM_APPBUNDLE_PATH

  8、搜索由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选项,搜索的过程如下:

  1、搜索cmake专有的cache变量中的路径。这种用法是为了在命令行中用选项-DVAR=value指定搜索路径。如果指定了NO_CMAKE_PATH选项,该路径会被跳过。搜索路径还包括:

   对于每个在CMAKE_PREFIX_PATH中的<prefix>/,路径<prefix>/include 

   CMAKE_INCLUDE_PATH
   CMAKE_FRAMEWORK_PATH

  2、搜索cmake专有的环境变量中指定的路径。这种用法是为了在用户的shell配置中设置指定的搜索路径。如果指定了NO_CMAKE_ENVIRONMENT_PATH选项,该路径会被跳过。搜索路径还包括:

   对于每个在CMAKE_PREFIX_PATH中的<prefix>/,路径<prefix>/include
   CMAKE_INCLUDE_PATH
   CMAKE_FRAMEWORK_PATH

  3、搜索由HINTS选项指定的路径。这些路径应该是由系统内省时计算得出的路径,比如由其它已经发现的项目提供的线索。硬编码的参考路径应该在PATHS选项中指定。

  4、搜索标准的系统环境变量。通过指定选项NO_SYSTEM_ENVIRONMENT_PATH可以跳过搜索环境变量。搜索的路径还包括:

    PATH
   INCLUDE

  5、查找在为当前系统的平台文件中定义的cmake变量。如果指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路径<prefix>/include 
   CMAKE_SYSTEM_LIBRARY_PATH
   CMAKE_SYSTEM_FRAMEWORK_PATH

  6、搜索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选项,那么搜索的过程中不会有其他的附加路径。如果没有指定该选项,搜索过程如下:

  1、搜索cmake特有的cache变量指定的路径。这些变量是在用cmake命令行时,通过-DVAR=value指定的变量。如果指定了NO_CMAKE_PATH选项,这些路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/[s]bin 
   CMAKE_PROGRAM_PATH
   CMAKE_APPBUNDLE_PATH

  2、搜索cmake特有的环境变量指定的路径。这些变量是用户的shell配置中设置的变量。如果指定了NO_CMAKE_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_PREFIX_PATH中的<prefix>,路径<prefix>/[s]bin 
   CMAKE_PROGRAM_PATH
   CMAKE_APPBUNDLE_PATH

  3、搜索由HINTS选项指定的路径。这些路径是系统内省(introspection)估算出的路径,比如由另一个已经发现的程序的地址提供的参考信息。硬编码的推荐路径应该通过PATHS选项指定。

  4、查找标准的系统环境变量。如果指定了NO_SYSTEM_ENVIRONMENT_PATH选项,这些路径会被跳过。搜索的路径还包括:

   PATH

  5、查找在为当前系统的平台文件中定义的cmake变量。如果指定了NO_CMAKE_SYSTEM_PATH选项,该路径会被跳过。搜索的路径还包括:

   对于每个在CMAKE_SYSTEM_PREFIX_PATH中的<prefix>,路径<prefix>/[s]bin 
   CMAKE_SYSTEM_PROGRAM_PATH
   CMAKE_SYSTEM_APPBUNDLE_PATH

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

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

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

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

分享到微信朋友圈

×

扫一扫,手机浏览