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

 

posted @ 2023-05-14 17:08  lypbendlf  阅读(667)  评论(0编辑  收藏  举报