set(<variable> <value>... [PARENT_SCOPE]) #设置普通变量
set(<variable> <value>... CACHE <type> <docstring> [FORCE]) #设置缓存条目
set(ENV{<variable>} [<value>]) #设置环境变量
set命令可以设置普通变量、缓存条目、环境变量三种变量的值,分别对应上述三种命令格式。
set的值
假设当前系统的cmake版本为3.10.2
下面分别对三种变量的设置进行说明。
命令格式:set(
命令含义:将变量variable设置为值
关于变量的作用域:每一个新的目录或者函数都会创建一个新的作用域,普通变量的作用域,如果不使用PARENT_SCOPE选项,只能从外层往内层传递。
1. 先来看最常用的用法,设置变量为一个给定的值
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (normal_var a)
message (">>> value = ${normal_var}")
输出为:
>>> value = a
2. 设置变量为多个给定的值
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (normal_var a b c)
message (">>> value = ${normal_var}")
输出为:
>>> value = a;b;c
可以看到多个值被;号连接最终的值之后赋给变量。
3. 设置变量为空
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (normal_var a b c)
message (">>> value = ${normal_var}")
set (normal_var) # 设置变量为空
message (">>> value = ${normal_var}")
输出为:
>>> value = a;b;c
>>> value =
4. 在函数内使用选项PARENT_SCOPE,对应的作用域只能传递到调用它的函数。
场景1:在函数内使用选项PARENT_SCOPE定义变量,在函数定义的文件中(非另一个函数中)使用该变量。
结果:变量无定义。
结论:函数内定义的变量,在函数定义的文件中调用,找不到变量的定义。
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
function (test_fn arg1)
set (normal_var_in_fn ${arg1} PARENT_SCOPE)
endfunction (test_fn)
message (">>> in directory, value = ${normal_var_fn}")
输出为:
>>> in directory, value =
>>> in function, value =
场景2:在函数内使用选项PARENT_SCOPE定义变量,在函数内使用该变量。
结果:变量无定义。
结论:函数内使用选项PARENT_SCOPE定义的变量,在函数内也是无定义的。
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
function (test_fn arg1)
set (normal_var_in_fn ${arg1} PARENT_SCOPE)
message (">>> in function, value = ${normal_var_fn}")
endfunction (test_fn)
test_fn (hello)
输出为:
>>> in function, value =
场景3:在函数内使用选项PARENT_SCOPE定义变量,在函数内使用该变量,并且使用set命令不带PARENT_SCOPE选项定义过该变量。
结果:函数内的变量值为不带PARENT_SCOPE选项的set命令所定义的。
结论:选项PARENT_SCOPE定义的变量作用域在上一层函数,当前函数的变量必须使用不带选项PARENT_SCOPE定义。
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
function (test_fn arg1)
set (normal_var_in_fn nohello)
set (normal_var_in_fn ${arg1} PARENT_SCOPE)
message (">>> in function, value = ${normal_var_in_fn}")
endfunction (test_fn)
test_fn (hello)
输出为:
>>> in function, value = nohello
场景4:在函数(示例中为test_fn)内使用选项PARENT_SCOPE定义变量,在另一个函数(调用者,示例中为test_fn_parent)内调用该函数。
结果:调用者函数内有该变量的定义。
结论:选项PARENT_SCOPE将变量传递到上一层调用函数。
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
function (test_fn arg1)
set (normal_var_in_fn nohello)
set (normal_var_in_fn ${arg1} PARENT_SCOPE)
message (">>> in function, value = ${normal_var_in_fn}")
endfunction (test_fn)
function (test_fn_parent arg1)
test_fn (${arg1})
message (">>> in parent function, value = ${normal_var_in_fn}")
endfunction (test_fn_parent)
test_fn_parent (hello)
#输出为:
>>> in function, value = nohello
>>> in parent function, value = hello
5. 在目录内使用选项PARENT_SCOPE,对应的作用域只能传递到上层目录,变量的传递过程与4)中函数的场景类似,不再赘述。注意一点:本例在test和test/sub下分别创建一个CMakeLists.txt文件。
示例如下:
cmake_minimum_required (VERSION 3.10.2)
project (set_sub_test)
set (normal_var_in_sub_dir sub_hello)
set (normal_var_in_sub_dir hello PARENT_SCOPE)
message (">>>>>> in sub directory, value = ${normal_var_in_sub_dir}")
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
add_subdirectory (sub)
message (">>> in top level, value = ${normal_var_in_sub_dir}")
输出为
>>>>>> in sub directory, value = sub_hello
>>> in top level, value = hello
命令格式:set(
命令含义:将缓存条目variable设置为值
缓存条目的
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
set (cache_entry_val ON OFF CACHE BOOL "choose ON to enable")
message (">>> value = ${cache_entry_val}")
set (cache_entry_val2 ON CACHE BOOL "choose ON to enable" FORCE)
message (">>> value2 = ${cache_entry_val2}")
set (cache_entry_val3 ON)
set (cache_entry_val3 OFF CACHE BOOL "choose ON to enable")
message (">>> value3 = ${cache_entry_val3}")
set (cache_entry_input OFF CACHE BOOL "choose ON to enable")
message (">>> value4 = ${cache_entry_input}")
set (mypath "test" CACHE FILEPATH "choose a file path")
message (">>> value5 = ${mypath}")
# 输入cmake构建,使用-D选项
cmake . -Dcache_entry_input=ON -Dmypath=sub
# 输出
>>> value = ON;OFF
>>> value2 = ON
>>> value3 = ON
>>> value4 = ON
>>> value5 = /XXX/XXX/XXX/sub
命令格式:set(ENV{(
命令含义:将环境变量设置为值(
环境变量设置的几个注意事项:
cmake_minimum_required (VERSION 3.10.2)
project (set_test)
message (">>> value = $ENV{CMAKE_PREFIX_PATH}")
set (ENV{CMAKE_PREFIX_PATH} "/test/sub")
message (">>> value = $ENV{CMAKE_PREFIX_PATH}")
set (ENV{CMAKE_PREFIX_PATH})
message (">>> value = $ENV{CMAKE_PREFIX_PATH}")
set (ENV{CMAKE_PREFIX_PATH} "/test/top/")
message (">>> value = $ENV{CMAKE_PREFIX_PATH}")
set (ENV{CMAKE_PREFIX_PATH} "")
message (">>> value = $ENV{CMAKE_PREFIX_PATH}")
输出为:
>>> value =
>>> value = /test/sub
>>> value =
>>> value = /test/top
>>> value =