60

以下两者有什么区别吗?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

文档:设置-选项

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

4

2 回答 2

50

在您的示例中,没有区别。但可能存在差异:

  • Option有一个默认值OFF
  • 您可以使一个选项依赖于其他选项CMakeDependentOption
  • Set接受除;-listsBOOL以外的类型。

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

于 2016-04-01T14:32:48.507 回答
6

偶然发现了这个问题,并认为我添加了更新。

正如这里option所解释的,如果存在同名的普通变量,该命令不会创建 CACHE 变量。此行为是在版本 3.13 中引入的(这是默认设置)。另一方面,将名为FOOwhen FOOexists 的 CACHE 变量设置为普通变量,将产生 FOO 的两个副本,一个普通变量和一个 CACHE 副本。

因此,在上游已经定义了同名变量时,是否使用option(FOO "" ON)或还可能取决于您希望配置系统执行的操作。set(FOO ON CACHE BOOL "")

注意:如果 FOO 已在 cache 的上游定义,则两者的行为方式仍然相同。区别仅在于上游是正常变量时。

于 2020-06-23T19:14:44.530 回答