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