关于CMake中不同变量的用法与总结
CMake中的变量
CMake中变量的类型有多种:通过set设置的普通变量和缓存变量、环境变量、数组变量等等,由于CMake在生成的过程中会加载缓存的关系,因此用法不一样。
常用的变量设置语法:
1 | set(<variable> <value> |
普通变量
普通变量(normal variable)相当于编程中脚本内部变量,类似于脚本文件的局部变量,这种变量不能跨越CMakeLists.txt文档。普通变量定义方式如下:
1 | set(var "value") |
设置一个普通变量var,值为value,引号的作用可以详见我的另一篇文章。
和编程语言中局部变量的用法类似,这个变量会屏蔽CMake缓存中的同名变量,(类似局部变量屏蔽全局变量)。但是这条语句不会改变缓存中的var变量。
缓存变量
cache variable用于缓存变量,定义如下:
1 | set(var "value" CACHE STRING "" FORCE) |
这条语句设置了一个CACHE语句,类型是STRING,说明信息为空字符串,上述都不能省略。
还有一种方法能够设置CACHE变量,就是通过cmake命令的-D选项,可以添加一个CACHE变量。
CACHE作用如下:
如果缓存中存在同名的变量,根据FORCE来决定是否写入缓存:如果没有FORCE,这条语句不起作用,使用缓存中的变量;如果有FORCE,使用当前设置的值。
- 注意,如果是FORCE,也能修改-D选项设置的CACHE变量,所以有可能传入的生成命令选项是无效的。
如果缓存中不存在同名的变量,则将这个变量写入缓存并使用。
缓存变量也可以设置只在本文件内生效,将STRING类型改为INTERNAL即可。
环境变量
读取环境变量:
$ENV{...}
设置环境变量:
set(ENV{...} ...)
option变量
主要是缓存的字符串,只能是ON或OFF,他们允许一些特殊的处理,如依赖,这个变量可以跨文本。
不要将其option与set命令搞错。给定的值option实际上只是“初始值”(在第一个配置步骤中一次传送到缓存),之后将由用户通过CMake的GUI或者命令行进行更改
总结
正常使用的时候,如果有多层CMakeLists.txt,需要跨文本的变量,应该使用CACHE类型,如果只是当前文本的变量,则不需要使用CACHE,更重要的是,应该避免使用同名的普通和缓存变量。另外,由于CMake没有有效的清除缓存的方法,如果要彻底清除缓存,需要删除build或者release文件夹的所有文件。