本文是阅读《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 缓存变量名 ...