CMake 变量的 "option" 和 "set CACHE BOOL" 有什么区别?

What is the difference between "option" and "set CACHE BOOL" for a CMake variable?

下面这两个有区别吗?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

文档:set - option

背景:虽然我用了一段时间的CMake,今天才注意到option命令,所以一直在用set:我想知道是不是safe/worth 用第二个替换第一个。

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

  • Option 的默认值为 OFF
  • 您可以使用 CMakeDependentOption
  • 使一个选项依赖于其他选项
  • Set 接受 BOOL 以外的类型,尤其是 ;-lists.

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

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

here 所述,如果存在同名的普通变量,option 命令不会创建 CACHE 变量。此行为是在 3.13 版(默认设置)中引入的。另一方面,当 FOO 作为普通变量存在时,设置名为 FOO 的 CACHE 变量,将产生两个 FOO 副本,一个普通变量和一个 CACHE 副本。

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

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