"选项"之间有什么区别?和"设置CACHE BOOL"对于CMake变量?

时间:2016-04-01 13:56:04

标签: cmake boolean global-variables cmake-gui

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

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

文档:set - option

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

2 个答案:

答案 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 变量。