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

Ant*_*nio 37 boolean global-variables cmake cmake-gui

以下两个之间有什么区别吗?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)
Run Code Online (Sandbox Code Playgroud)

文档:set - 选项

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

usr*_*567 30

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

此外,当您使用选项时,您向用户指示可以安全地设置它.从外部设置内部变量可能会使用无效值巧妙地破坏脚本.

  • 但是,如果您使用命令行-D方法而不是ccmake,CMake非常乐意让您将BOOL变量/选项设置为非BOOL值,无论您使用`option`还是`set(... CACHE BOOL) `.所以这种"类型安全"似乎只适用于ccmake/cmake-gui. (5认同)

bar*_*gol 5

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

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

因此,在上游已经定义了同名变量时,是否使用option(FOO "" ON)set(FOO ON CACHE BOOL "")也可能取决于您希望配置系统做什么。

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

  • 您可能需要检查 [CMP0126](https://cmake.org/cmake/help/latest/policy/CMP0126.html#policy:CMP0126)。 (3认同)