0%

CMake中变量总结

关于CMake中不同变量的用法与总结

CMake中的变量

CMake中变量的类型有多种:通过set设置的普通变量和缓存变量、环境变量、数组变量等等,由于CMake在生成的过程中会加载缓存的关系,因此用法不一样。

常用的变量设置语法:

1
2
set(<variable> <value>
[[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

普通变量

普通变量(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文件夹的所有文件。