CMP0077¶
3.13 版本新增。
option() 尊重普通变量。
通常,option() 命令用于创建一个缓存条目,允许用户设置选项。但是,在某些情况下,项目在调用 option() 命令之前,可能已经定义了一个与选项同名的普通(非缓存)变量。例如,将另一个项目作为子目录嵌入的项目可能希望硬编码子项目的选项,以便以其需要的方式构建。
由于 CMake 3.12 及更早版本中的历史原因,如果
指定的名称的缓存条目根本不存在,或者
指定的名称的缓存条目存在但未指定类型(例如,通过命令行中的
-D<name>=ON),
那么 option() 命令会移除同名的普通(非缓存)变量。在上述两种情况下(通常是在新的构建树中的首次运行),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 中被移除。