基础命令set() unset()
8. set() unset()
在CMake中,set用于设置变量的值。这个变量可以为普通变量、Cache或者是环境变量。
如果提供了一个或多个 <value> 参数,则将 <variable> 设置为给定的值。
如果没有提供 <value> 参数,则取消设置 <variable>,将其值设置为无,相当于unset
8.1 设置普通变量
8.1.1 命令格式
set(<variable> <value>... [PARENT_SCOPE])
unset(<variable>... [PARENT_SCOPE])
8.1.2 参数说明
- variable:要被赋值的变量
- value:要赋给变量的值
PARENT_SCOPE是一个修饰符,用于指定变量的作用域为父级作用域。
当在函数或宏中设置变量时,使用PARENT_SCOPE修饰符可以将该变量的作用域提升到父级作用域,使得在函数或宏外部也能够访问和使用该变量。 如下示例
8.1.3 使用示例
function(set_variable)
set(variable "Hello, World!" PARENT_SCOPE)
endfunction()
set_variable()
message("${variable}") # 输出:Hello, World!
在上面的示例中,set_variable函数内部使用set命令设置了变量variable的值,并使用PARENT_SCOPE修饰符将其作用域提升到调用函数的作用域。因此,message命令在函数外部打印出了变量variable的值。
需要注意的是,PARENT_SCOPE修饰符只能将变量的作用域提升到直接的父级作用域,无法跳过中间的作用域。如果要将变量的作用域提升到更高层次的作用域,需要在对应的父级作用域中再次使用set命令。
8.2 设置Cache变量
set命令可以用于设置缓存变量(cache entry),并提供用户可设置的值。
8.2.1 命令格式
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
unset(<variable>... CACHE)
8.2.2 参数说明
- <variable>:要设置的缓存变量的名称。
- <value>:要为缓存变量设置的值(可以有多个)。
- CACHE:指定该变量是一个缓存变量。
- <type>:变量的类型,可以是以下之一:
- BOOL:布尔类型,即开/关(ON/OFF)值。cmake-gui 提供一个复选框。
- FILEPATH:指向磁盘上文件的路径。cmake-gui 提供一个文件对话框。
- PATH:指向磁盘上目录的路径。cmake-gui 提供一个文件对话框。
- STRING:字符串类型,即文本行。cmake-gui 提供一个文本字段或下拉选择(如果设置了 STRINGS 缓存变量属性)。
- INTERNAL:内部类型,即文本行。cmake-gui 不显示内部变量。内部变量可用于持久保存跨运行的变量。使用此类型会隐含使用 FORCE。
- FORCE:可选项,用于强制覆盖现有的缓存变量。缓存默认是不覆盖的,如果在调用之前缓存项不存在,或者给出了FORCE选项,那么缓存项将被设置为给定的值。
8.2.3 使用示例:
cmake_minimum_required(VERSION 3.5)
project(hello_library)
set(MY_VARIABLE "Hello, World!" CACHE STRING "A greeting message" FORCE)
message("${MY_VARIABLE}") # 输出Hello, World!
set(MY_VARIABLE "Good Morning!" CACHE STRING "A greeting message")
message("${MY_VARIABLE}") # 输出Hello, World!因为不加FORCE默认不覆盖
set(MY_VARIABLE "Good Morning!" CACHE STRING "A greeting message" FORCE)
message("${MY_VARIABLE}") # 输出Good Morning! 加了FORCE强制覆盖
注意,如果已经存在同名的普通变量,则不能直接访问缓存变量的内容。最好不要存在同名的。
此外,如果在调用CMake命令时,用户通过命令行选项"-D<var>=<value>"来创建缓存变量,并且在这种情况下,如果没有指定类型,缓存变量将存在但没有类型。对于特殊类型的变量(如路径类型),相对路径会被转化为绝对路径,以确保准确性。
例如:在执行CMake命令时,使用以下语句:
cmake -DMY_PATH="../relative/path"
,创建了一个缓存变量,但未指定类型。为了为该变量设置类型并将相对路径转换为绝对路径,可以在CMakeLists.txt文件中使用"set"命令:set(MY_PATH "${MY_PATH}" PATH)
,这样,通过"set"命令,为变量"MY_PATH"添加了类型"PATH"。同时,如果"MY_PATH"的值是相对路径,CMake将将其视为相对于当前工作目录,并将其转换为绝对路径。
8.3 设置系统变量
设置环境变量的值,执行这个命令时,它只会对当前的 CMake 进程中的环境变量进行修改。它不会影响调用 CMake 的进程的环境变量,整个系统环境,或者后续构建或测试过程的环境变量。
8.3.1 命令格式
set(ENV{<variable>} [<value>])
unset(ENV{<variable>})
8.3.2 参数说明
- <variable>: 是环境变量的名称
- <value>: 要设置的值
如果没有提供<value> 或者<value> 是空字符串,该命令将清除环境变量的任何现有值。
在 set(ENV{} []) 命令之后提供的任何参数都会被忽略。如果发现额外的参数,将会发出作者警告。
8.3.3 使用示例
cmake_minimum_required(VERSION 3.5)
project(setCommand)
# 设置一个名为 MY_VARIABLE 的环境变量,其值为 Hello World:
set(ENV{MY_VARIABLE} "Hello World")
message(">>> MY_VARIABLE: $ENV{MY_VARIABLE}")
# 清除名为 PATH 的环境变量的值
set(ENV{MY_VARIABLE})
message(">>> MY_VARIABLE: $ENV{MY_VARIABLE}")
# 设置一个名为 NUM_THREADS 的环境变量,其值为 4:
set(ENV{NUM_THREADS} 4)
message(">>> NUM_THREADS: $ENV{NUM_THREADS}")
# 清除名为 DEBUG_FLAG 的环境变量的值:
unset(ENV{NUM_THREADS})
message(">>> NUM_THREADS: $ENV{NUM_THREADS}")
输出如下:
>>> MY_VARIABLE: Hello World
>>> MY_VARIABLE:
>>> NUM_THREADS: 4
>>> NUM_THREADS:
附:返回总目录的传送门如下:
〓〓〓〓〓〓〓〓踏实学CMake总目录〓〓〓〓〓〓〓〓〓〓