对于CMake变量,“option”和“set CACHE BOOL”之间有什么区别?

dfty9e19  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(313)

下面两个有什么区别吗?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

文件:setoption
背景:即使我已经使用CMake一段时间了,我也只是今天才注意到option命令,因此我一直在使用set:我想知道用第二个代替第一个是否安全/值得。

8wigbo56

8wigbo561#

在你的例子中,没有区别,但也可以有区别:

  • option的预设值为OFF
  • 使用CMakeDependentOption可以使某个选项依赖于其他选项
  • set接受BOOL以外的类型,尤其是;- 清单。

此外,当您使用某个选项时,您是在向用户表明可以安全地设置该选项。从外部设置内部变量可能会使用无效值巧妙地破坏脚本。

ecfsfe2w

ecfsfe2w2#

无意中发现了这个问题,并认为我添加了一个更新。
here所述,如果存在同名的常规变量,则option命令不会创建CACHE变量。此行为是在版本3.13中引入的(在该版本中它是默认值)。另一方面,当FOO作为常规变量存在时,设置名为FOO的CACHE变量将产生FOO的两个副本,一个常规变量和一个CACHE变量。
因此,是使用option(FOO "" ON)还是set(FOO ON CACHE BOOL "")还可能取决于在上游已经定义了同名变量时,您希望配置系统执行的操作。
注意:如果FOO已经该高速缓存 * 中的上游 * 定义,这两个变量的行为仍然相同。区别仅在于上游是一个 normal 变量。

相关问题