以下两个之间有什么区别吗?
set(FOO true CACHE BOOL "description")
option(FOO "description" ON)
背景:即使我已经使用CMake一段时间了,我今天才注意到option
命令,因此我一直在使用set
:我想知道它是否安全/值得用第二个替换第一个。
答案 0 :(得分:26)
在您的示例中,没有区别。但可能存在差异:
Option
的默认值为OFF
。CMakeDependentOption
Set
接受BOOL
以外的其他类型,尤其是;-lists。此外,当您使用选项时,您向用户表明可以安全地设置它。从外部设置内部变量可能会使用无效值巧妙地破坏脚本。
答案 1 :(得分:2)
偶然发现了这个问题,以为我添加了一个更新。
如here所述,如果存在具有相同名称的普通变量,则option
命令不会创建CACHE变量。此行为是在3.13版中引入的(默认设置)。另一方面,在FOO
作为常规变量存在时设置名为FOO
的CACHE变量将产生FOO的两个副本,一个常规变量和一个CACHE。
因此,在上游已定义相同名称的变量时,是否使用option(FOO "" ON)
或set(FOO ON CACHE BOOL "")
可能还取决于您希望配置系统执行的操作。
注意:如果在缓存中的上游中定义了FOO,则两者的行为仍相同。唯一的区别是上游是 normal 变量。