咱们首先来看变量。局部变量一般这样设置:html
set(MY_VARIABLE "value")
变量的名称一般使用全大写字母,后面紧跟变量的值。您可使用 ${}
来获取变量的值,例如,${MY_VARIABLE}
。1 CMake 具备做用范围的概念:在设置变量后,只要在同一范围内,你均可以存取该变量的值。 离开函数或子目录中的一个文件,变量也随之消失。 您能够在 PARENT_SCOPE
的尾部设置变量用于子做用域。缓存
你能够设置多个值造成一个列表:函数
set(MY_LIST "one" "two")
这至关于多个值之间用 ; 隔开。因此如下声明和上面的效果相同:测试
set(MY_LIST "one;two")
list(
命令有一些实用方法来处理列表,separate_arguments
可以将一个空格分隔的字符串转为一个列表(直接修改变量值)。 请注意,CMake 中若是没有空格,值也能够不用引号引发来。 这容许您大多数时候均可以不把值用引号引发来。spa
使用 ${}
语法扩展变量时,对于空格的相关规则是同样的。对于文件和目录路径处理要特别当心。 由于路径能够随时包含空格,所以当它们是变量时应该始终用引号引发来(即永远不要写${MY_PATH}
,老是应该写为"${MY_PATH}"
)。命令行
若是你想从命令行设置变量,CMake 会提供变量缓存。 有些变量已经内置了,好比CMAKE_BUILD_TYPE
。 这种若是变量还没有(从命令行)设置,则设置变量值的语法以下:翻译
set(MY_CACHE_VARIABLE "VALUE" CACHE STRING "Description")
这将不会取代已经设置的变量值,所以您能够在命令行上设置它们,而不会在执行 CMake 文件时被覆盖。 若是要将这些变量做为全局变量,你能够这样书写:code
set(MY_CACHE_VARIABLE "VALUE" CACHE STRING "" FORCE) mark_as_advanced(MY_CACHE_VARIABLE)
第一行将致使不管如何都对变量进行设置。 第二行使你运行 cmake -L ..
或使用 GUI
时,变量将不会显示在列表中。 这很常见的,所以你也可使用 INTERNAL
类型来达到一样的效果(虽然从技术上来讲它强制为 STRING 类型,但不会影响任何依赖于变量的 CMake 代码):htm
set(MY_CACHE_VARIABLE "VALUE" CACHE INTERNAL "")
因为 BOOL
类型很是常见,您也可使用 option
指令简洁地设置它:ip
option(MY_OPTION "This is settable from the command line" OFF)
对于 BOOL
数据类型值 ON
和 OFF
,有几种不一样语境。
有关 CMake
中内置变量列表,请参阅 cmake-variables。
你也能够用 set(ENV{variable_name} value)
设置,用 $ENV{variable_name}
获取环境变量值, 但一般最好避免环境变量。
缓存实际上就是一个文本文件,CMakeCache.txt
。CMake 运行时会在构建目录中建立这个文件。 这就是 CMake 记住你设置的任何内容的方式,所以每次从新运行 CMake 时你没必要从新(在命令行上)列上这些选项。
CMake 存储信息的另外一种方式是使用属性。 这相似于变量,但它只能附加到其余条目上,例如目录或目标。 全局属性能够做为无缓存全局变量。 许多目标属性经过从 CMAKE_
打头的相匹配的变量初始化而来。 例如,设置 CMAKE_CXX_STANDARD
意味着全部的新目标建立时都将把 CXX_STANDARD
设置为 CMAKE_CXX_STANDARD
变量的值。 设置属性有两种方法:
set_property(TARGET TargetName PROPERTY CXX_STANDARD 11) set_target_properties(TargetName PROPERTIES CXX_STANDARD 11)
第一种形式更通用,能够一次设置多个目标/文件/测试,并提供有用的选项。 第二个是在一个目标上设置多个属性的快捷方式。 你能够这样获取目标属性:
get_property(ResultVariable TARGET TargetName PROPERTY CXX_STANDARD)
有关全部内置属性的列表,请参阅 cmake-properties。 在某些状况下,您也能够定义你本身的属性。2
1.if
语句有点奇怪,由于它可使用也能够不使用包围语法来获取变量; 这是历史缘由形成的:if
出如今${}
语法出现以前。 ↩
2. 例如,
Interface
目标对容许的自定义属性有一些限制。
↩