【问题标题】:What is the difference between "option" and "set CACHE BOOL" for a CMake variable?CMake 变量的“option”和“set CACHE BOOL”有什么区别?
【发布时间】:2016-07-21 08:55:15
【问题描述】:

以下两者有区别吗?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)

文档:set - option

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

【问题讨论】:

    标签: cmake boolean global-variables cmake-gui


    【解决方案1】:

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

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

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

    【讨论】:

    • 关于你的最后一点,当使用set 时,通过将变量设为布尔值,我不会阻止用户给它一个不同类型的值,例如在命令行中?无论如何,我觉得你的第二点非常相关。
    • 坦率地说,我从未尝试过。但我想我记得 CMake GUI 会根据变量类型调整其输入法。
    • 我可以确认(对于布尔变量,它会给你一个勾选框)
    • 但是,如果您使用命令行 -D 方法,而不是 ccmake,CMake 非常乐意让您将 BOOL 变量/选项设置为非 BOOL 值,无论您使用 option 还是 @ 987654330@。所以看起来这种“类型安全”只适用于 ccmake/cmake-gui。
    • 关于第一点:option 接受一个可选的初始值。如果没有提供初始值,则使用OFF
    【解决方案2】:

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2018-11-24
    • 2010-11-09
    • 2018-08-07
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多