CMake-变量

Posted by 周思进 on June 4, 2022

本文是阅读《Professional-CMake-A-Practical-Guide》第五章做的一点笔记。

一、变量设置

cmake 可以通过 set() 进行变量设置,如下:

set(varName value... [PARENT_SCOPE])

1、cmake 将所有的变量都定义为字符串,固设置变量值时,并不强制要求需要加引号包裹,除非对应的值存在空格,这种情况下如果不用引号包裹,变量值在空格处会默认加分号处理。

2、变量的值可以通过 ${变量名} 来获取

3、变量可以多行输出,只需要用引号包住并内部自行分行就行;对于值中有引号的,需要做下转义处理

4、可以用 unset 来取消变量的设置

上述知识点示例代码如下:

set(myVar a b c)
message("myVar:${myVar}")  # 输出:a;b;c

set(myVar "a b c")
message("myVar:${myVar}")  # 输出:a b c

set(multiLine "First line ${myVar}
Second line with a \"quoted\" word")
message("multiLine:${multiLine}")

unset(myVar)
message("myVar:${myVar}")  # 输出空


二、缓存变量设置

缓存变量是指在 CMakeCache.txt 中的变量,可以通过如下方式进行设置

set(optVar initialValue CACHE type helpString)

如设置缓存变量 MY_CACHE_VAR 为 hello:

set(MY_CACHE_VAR hello CACHE STRING "")

可以在 CMakeCache.txt 文件中看到 MY_CACHE_VAR:STRING=hello 信息


也可以通过在命令行设置缓存变量

cmake -D myVar:type=someValue ...

如定义是否要启用测试开关

cmake .. -Denable_test:BOOL=ON

可以在 CMakeCache.txt 文件中看到 enable_test:BOOL=ON 信息。


而 BOOL 型缓存变量是比较常用的设置操作,cmake 可以用对应的 option 接口来完成操作,如下:

option(optVar helpString [initialValue])

上面的开关操作则如下:

option(enable_test "enable test" ON)

可以看到设置后和前面命令行操作一样设置同样的缓存变量。


三、缓存变量特性

这里需要注意测试的时候,需要先手动删除下 CMakeCache.txt 文件,因为缓存变量值只要不手动删除 CMakeCache.txt 文件或者进行重新赋值覆盖,会一直保持原值存在。

即在命令行设置过一次缓存变量后,下次执行 cmake 命令就可以不用带相同的缓存命令设置,而可以直接使用缓存中已保存的值了。

而如果缓存变量和普通变量名称相同,则CMake 查询该变量名最近一次赋值的值。即如果缓存中的变量不进行强制覆盖,那么 CMakelist.txt 打印的变量都是普通变量的值。

set(myVar foo)
set(result ${myVar}) # result = foo
set(myVar bar CACHE STRING “”) # 首次设置缓存变量 myVar 为 bar,第二次运行时已经存在该缓存变量,不会再进行赋值操作,除非使用 FORCE 强制赋值 set(myVar bar CACHE STRING “” FORCE) 
set(result ${myVar}) # 第一次运行 result 为 bar,第二次运行为 foo,如果上面设置缓存变量带了 FORCE,则每次都是 bar


三、缓存变量删除

可以通过如下命令操作删除

cmake -U 缓存变量名 ...