一、简单介绍
set 和 unset 为一对相反的指令,分别为设置变量以及取消设置变量。
1、什么是变量?
变量就是用于保存值的存储单元。
2、set 有哪几种?
set 有三种:
- 设置一般变量(Set Normal Variable)
- 设置缓存变量(Set Cache Entry)
- 设置环境变量(Set Environment Variable)
// 1. 设置一般变量(Set Normal Variable)
set(<variable> <value>... [PARENT_SCOPE])// 2. 设置缓存变量(Set Cache Entry)
set(<variable> <value>... CACHE <type> <docstring> [FORCE])// 3. 设置环境变量(Set Environment Variable)
set(ENV{<variable>} [<value>])
3、变量的作用域
Function Scope: 在函数内部定义,仅仅在当前函数以及所调用的子函数内有效;
Directory Scope: 在当前目录的定义的变量,当调用子目录时候,子目录会复制一份父级目录内的变量到子目录中
Persistent Cache: 持久化的缓存,一般由CACHE 存储起来。
4、变量的搜索路径
在当前 Function Scope 调用内查找,找到后使用,未找到进行下一步;
在当前目录下面查找,找到使用,未找到下一步;
在 CACHE 中寻找,找到使用,未找到,则为空.
二、设置一般变量(Normal Variable)
set(<variable> <value>... [PARENT_SCOPE])
将一个或者多个值 <value>... 赋值给变量 <variable>, 多个值之间以分号(;)分隔。
1、参数解析
PARENT_SCOPE
配置该选项后,表示该变量在父级作用域上有效, 在当前作用域上是无效的;
2、Coding
目录结构如下:
rs:cmake-set$ tree
.
├── CMakeLists.txt
├── main.cpp
└── subdir
└── CMakeLists.txt
顶层的 CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(DEMO VERSION 10.2.1.3 LANGUAGES CXX C ASM )
# 设置一般变量
set(PNAME rsenjoyer)
set(PGRADE 80 85 90 95)message("top name = ${PNAME}") # top name = rsenjoyer
message("top grade = ${PGRADE}") #top grade = 80;85;90;95add_subdirectory(subdir)
message("top after name = ${PNAME}") # top name = rsenjoyer
add_executable(DEMO main.cpp)
子目录的 CMakeLists.txt
set(PNAME jack)
message("sub name = ${PNAME}") # sub name = jack# 仅仅会改变父级的 PNAME, 对当前的变量不会更改
set(PNAME rose PARENT_SCOPE)
message("sub name = ${PNAME}") #sub name = jack
三、设置缓存变量(Set Cache Entry)
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
作用:
- 设置变量并缓存到 CMakeCache.txt
- 默认不会覆盖已缓存(已存在于 CMakeCache.txt )的变量;
1、 参数解析
a)、类型 type
类型 type 必须为以下的一种
BOOL:布尔值(ON/OFF)
FILEPATH:文件路径
PATH:目录路径
STRING:字符串
INTERNAL:单行文字
b)、 描述字符串 <docstring>
单行文字,用于 CMAKE-GUI 的时提示用户
c)、FORCE
用于是否强制更新缓存里面的值,配置后,每次都会强制更新CMakeCache.txt 里面的值
四、设置环境变量(Set Environment Variable)
set(ENV{<variable>} [<value>])
作用
- 设置环境变量 <variable>,值为 <value>
- 如果 <value> 不存在或者为空字符串 表示清除该环境变量
五、环境变量与一般变量区别
参考: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#cmake-language-variables