cmake学习之- set
- 最后更新: 2019-06-06
一、简单介绍
set
和 unset
为一对相反的指令,分别为设置变量以及取消设置变量。
-
什么是变量?
- 变量就是用于保存值的存储单元。
-
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>])
-
-
变量的作用域
- Function Scope: 在函数内部定义,仅仅在当前函数以及所调用的子函数内有效;
- Directory Scope: 在当前目录的定义的变量,当调用子目录时候,子目录会复制一份父级目录内的变量到子目录中
- Persistent Cache: 持久化的缓存,一般由
CACHE
存储起来.
-
变量的搜索路径
- 在当前 Function Scope 调用内查找,找到后使用,未找到进行下一步;
- 在当前目录下面查找,找到使用,未找到下一步;
- 在 CACHE 中寻找,找到使用,未找到,则为空.
二、设置一般变量(Normal Variable)
set(<variable> <value>... [PARENT_SCOPE])
- 将一个或者多个值
<value>...
赋值给变量<variable>
, 多个值之间以分号(;)分隔。
2.1 参数解析
- PARENT_SCOPE
- 配置该选项后,表示该变量在父级作用域上有效, 在当前作用域上是无效的;
2.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;95
add_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 )的变量;
3.1 参数解析
-
类型 type
类型 type 必须为以下的一种
- BOOL
- 布尔值(ON/OFF)
- FILEPATH
- 文件路径
- PATH
- 目录路径
- STRING
- 字符串
- INTERNAL
- 单行文字
- BOOL
-
描述字符串
<docstring>
: 单行文字,用于 CMAKE-GUI 的时提示用户 -
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