CMP0077¶
3.13 版本新增。
option()
命令遵循普通变量。
通常,option()
命令用于创建一个缓存条目,以便用户可以设置该选项。但是,在某些情况下,项目可能会在调用 option()
命令之前定义一个与该选项同名的普通(非缓存)变量。例如,一个将另一个项目嵌入为子目录的项目可能希望硬编码子项目的选项,以便按照其需要的方式构建。
出于历史原因,在 CMake 3.12 及更低版本中,当满足以下任一条件时,option()
命令会移除一个同名的普通(非缓存)变量:
不存在指定的缓存条目,或者
指定的缓存条目存在,但未被赋予类型(例如,通过命令行上的
-D<name>=ON
)。
在这两种情况下(通常是在新构建树中的第一次运行时),option()
命令会为缓存条目赋予 BOOL
类型,并移除任何同名的普通(非缓存)变量。在剩余的情况下,即指定的缓存条目已存在并具有类型(通常是在构建树中的后续运行时),option()
命令不进行任何更改,任何同名的普通变量将保持设置状态。
在 CMake 3.13 及更高版本中,当给定名称的普通变量已存在时,option()
命令倾向于不做任何操作。它不会创建或更新缓存条目,也不会移除普通变量。新的行为在构建树中的第一次和后续运行之间是一致的。此策略提供了与未更新以适应新行为的项目兼容性。
当 option()
命令遇到给定名称的普通变量时:
此策略的
OLD
行为是在存在同名普通变量时仍继续执行。如果缓存条目尚不存在且没有类型,则会创建和/或赋予类型,并且会移除普通变量。此策略的
NEW
行为是在存在同名普通变量时不做任何操作。普通变量不会被移除。缓存条目不会被创建或更新,如果存在也会被忽略。
请参阅 CMP0126
,了解 set(CACHE)
命令的类似策略,但请注意这两个策略在 NEW
行为之间存在一些差异。
此策略是在 CMake 版本 3.13 中引入的。它可以通过 cmake_policy()
或 cmake_minimum_required()
来设置。如果未设置,CMake 会发出警告,并使用 OLD
行为。
使用 CMAKE_POLICY_DEFAULT_CMP0077
变量来为第三方子项目设置策略,而无需修改它。
注意
策略的 OLD
行为是根据定义已弃用
,并可能在 CMake 的未来版本中被移除。