cmake之 set命令
转自:https://www.cnblogs.com/ncuneugcj/p/9756324.html,很详细
https://www.jianshu.com/p/c2c71d5a09e9,有例子
1.介绍
set(<variable> <value>... [PARENT_SCOPE]) #设置普通变量
set
的值<value>...
表示可以给变量设置0个或者多个值,当设置多个值时(大于2个),多个值会通过分号连接符
连接成一个真实的值赋值给变量,当设置0个值时,实际上是把变量变为未设置状态,相当于调用unset
命令。-
如果使用了
PARENT_SCOPE
选项,意味着该变量的作用域会传递到上一层(也就是上一层目录或者当前函数的调用者,如果是函数则传递到函数的调用者,如果是目录则传递到上一层目录),并且在当前作用域该变量不受带PARENT_SCOPE
选项的set
命令的影响(如果变量之前没有定义,那么在当前作用域仍然是无定义的;如果之前有定义值,那么值和之前定义的值保持一致)。
变量分为normal和cache类型,cache类型暂时不了解,用到时再了解。
normal变量设置: set(MY_VAL "666")
cache变量:
set(MY_CACHE_VAL "666" CACHE STRING INTERNAL)
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
normal变量范围:
- add_subdirectory()、include()是值拷贝,类似函数传参,不会改变父目录的值。
- include()、macro() 是传引用(本质有点类似 c 中的 #include 预处理含义)子目录修改父目录能看到,子目录新定义的变量父目录也能看到。
通过 include() 和 macro() 相当于把这两部分包含的代码直接加入根目录 CMakeLists.txt 文件中去执行,相当于他们是一个整体。因此变量直接都是互通的。这就有点像 C/C++ 中的 #include 包含头文件的预处理过程了。
但在函数以及 add_subdirectory() 中,他们本身就是一个不同的作用域范围,仅仅通过拷贝调用者的 Normal 值(仅仅在调用 add_subdirectory() / function() 之前的 Normal 变量),如果要修改调用者包含的 Normal 变量,那么只能通过 set(MY_VAL value PARENT_SCOPE)
注明我们修改的是调用者 Normal 值。虽然在 C/C++ 中,可以通过指针的方式,通过函数可以修改外部变量值,但是在 CMake 脚本语言中 function() 虽然能够传入形式参数,但是者本质上就是 C/C++ 中的值拷贝。而不是引用。
2.设置缓存变量
https://modern-cmake-cn.github.io/Modern-CMake-zh_CN/chapters/basics/variables.html
缓存实际上就是个文本文件,CMakeCache.txt ,当你运行 CMake 构建目录时会创建它。 CMake 可以通过它来记住你设置的所有东西,因此你可以不必在重新运行 CMake 的时候再次列出所有的选项。
option 是一个专门用于定义可以由用户从命令行或 GUI 切换的布尔选项的 CMake 命令。用户可以选择在 CMake 的配置过程中启用或禁用 MY_OPTION:
option(MY_OPTION "This is settable from the command line" OFF) cmake -DMY_OPTION=ON ..
set可以设置任意类型的变量。
https://www.cnblogs.com/narjaja/p/8351500.html