CMP0077

3.13 版本新增。

option() 命令尊重普通变量。

通常使用 option() 命令来创建一个缓存条目,以便用户可以设置选项。然而,在某些情况下,一个与选项同名的普通(非缓存)变量可能在调用 option() 命令之前就被项目定义了。例如,一个将另一个项目嵌入为子目录的项目可能希望硬编码子项目选项以按需构建。

出于历史原因,在 CMake 3.12 及以下版本中,当以下任一情况发生时,option() 命令会移除同名的普通(非缓存)变量:

  • 指定名称的缓存条目根本不存在,或

  • 指定名称的缓存条目存在但未被赋予类型(例如,通过命令行 -D<name>=ON)。

在这两种情况下(通常是在新构建树的首次运行时),option() 命令会赋予缓存条目 BOOL 类型,并移除同名的普通(非缓存)变量。在剩余的、指定名称的缓存条目已存在且有类型的情况下(通常在构建树的后续运行时),option() 命令不会更改任何内容,并且同名的普通变量将保持设置状态。

在 CMake 3.13 及以上版本中,当给定名称的普通变量已存在时,option() 命令倾向于什么都不做。它不会创建或更新缓存条目,也不会移除普通变量。新的行为在构建树的首次运行和后续运行之间是一致的。此策略提供了与未更新以期望新行为的项目兼容性。

option() 命令遇到给定名称的普通变量时:

  • 此策略的 OLD 行为是即使存在同名的普通变量也会继续执行。如果缓存条目尚不存在且没有类型,则会创建并/或赋予类型,并且普通变量会被移除。

  • 此策略的 NEW 行为是当存在同名的普通变量时什么都不做。普通变量不会被移除。缓存条目不会被创建或更新,如果存在则会被忽略。

有关 set(CACHE) 命令的类似策略,请参阅 CMP0126,但请注意,这两个策略在 NEW 行为上存在一些差异。

此策略在 CMake 版本 3.13 中引入。它可以由 cmake_policy()cmake_minimum_required() 设置。如果未设置,CMake 将发出警告并使用 OLD 行为。

使用 CMAKE_POLICY_DEFAULT_CMP0077 变量来为子目录中的第三方项目设置策略,而无需修改它。

注意

策略的 OLD 行为 根据定义已被弃用,并可能在未来的 CMake 版本中被移除。