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 版本中移除。