下面两个有什么区别吗?
set(FOO true CACHE BOOL "description") option(FOO "description" ON)
文件:set到option背景:即使我已经使用CMake一段时间了,我也只是今天才注意到option命令,因此我一直在使用set:我想知道用第二个代替第一个是否安全/值得。
option
set
8wigbo561#
在你的例子中,没有区别,但也可以有区别:
OFF
CMakeDependentOption
BOOL
此外,当您使用某个选项时,您是在向用户表明可以安全地设置该选项。从外部设置内部变量可能会使用无效值巧妙地破坏脚本。
ecfsfe2w2#
无意中发现了这个问题,并认为我添加了一个更新。如here所述,如果存在同名的常规变量,则option命令不会创建CACHE变量。此行为是在版本3.13中引入的(在该版本中它是默认值)。另一方面,当FOO作为常规变量存在时,设置名为FOO的CACHE变量将产生FOO的两个副本,一个常规变量和一个CACHE变量。因此,是使用option(FOO "" ON)还是set(FOO ON CACHE BOOL "")还可能取决于在上游已经定义了同名变量时,您希望配置系统执行的操作。注意:如果FOO已经该高速缓存 * 中的上游 * 定义,这两个变量的行为仍然相同。区别仅在于上游是一个 normal 变量。
FOO
option(FOO "" ON)
set(FOO ON CACHE BOOL "")
2条答案
按热度按时间8wigbo561#
在你的例子中,没有区别,但也可以有区别:
option
的预设值为OFF
。CMakeDependentOption
可以使某个选项依赖于其他选项set
接受BOOL
以外的类型,尤其是;- 清单。此外,当您使用某个选项时,您是在向用户表明可以安全地设置该选项。从外部设置内部变量可能会使用无效值巧妙地破坏脚本。
ecfsfe2w2#
无意中发现了这个问题,并认为我添加了一个更新。
如here所述,如果存在同名的常规变量,则
option
命令不会创建CACHE变量。此行为是在版本3.13中引入的(在该版本中它是默认值)。另一方面,当FOO
作为常规变量存在时,设置名为FOO
的CACHE变量将产生FOO的两个副本,一个常规变量和一个CACHE变量。因此,是使用
option(FOO "" ON)
还是set(FOO ON CACHE BOOL "")
还可能取决于在上游已经定义了同名变量时,您希望配置系统执行的操作。注意:如果FOO已经该高速缓存 * 中的上游 * 定义,这两个变量的行为仍然相同。区别仅在于上游是一个 normal 变量。