“option”和“set CACHE BOOL”在CMake变量中有什么区别?

71

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

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

文档:set - option

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

2个回答

59
在你的示例中,没有区别。但是可能会有不同之处:
  • option 的默认值为OFF
  • 使用CMakeDependentOption可以使一个选项依赖于其他选项。
  • set 接受除 BOOL 以外的其他类型,特别是列表
另外,当你使用选项时,你向用户表示可以安全地设置它。从外部设置内部变量可能会以无效的方式破坏脚本。

关于您最后的观点,使用 set 时,通过将变量设置为布尔值,我不是防止用户在命令行中给它赋予其他类型的值吗?无论如何,我认为您的第二个观点非常相关。 - Antonio
坦白说,我从未尝试过那个。但我记得 CMake GUI 会根据变量类型调整其输入方式。 - usr1234567
1
我可以确认(对于布尔变量,它会给你一个复选框) - Antonio
7
然而,如果你使用命令行的-D方法,而不是ccmake,CMake可以完全接受你将BOOL变量/选项设置为非BOOL值,无论你使用option还是set(...CACHE BOOL)。因此,这种“类型安全性”似乎只适用于ccmake/cmake-gui。 - kdopen
1
关于第一点:option 接受一个可选的初始值。如果没有提供初始值,则使用 OFF - Cnly

10

偶然发现了这个问题,并且想要添加一些更新。

此处所解释的,如果存在与option命令同名的普通变量,则该命令不会创建一个缓存变量。这种行为在3.13版本中引入(默认情况下)。另一方面,当FOO作为普通变量存在时,设置一个名为FOO的缓存变量将产生两个FOO副本,一个普通变量和一个缓存变量。

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

注意:如果FOO已经在上游缓存中定义,则这两者仍然具有相同的行为方式。区别只在于上游是一个普通变量。


3
您可能想要查看 CMP0126 - Johannes Pille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接