CMP0077¶
在 3.13 版本加入.
option() 支持普通变量。
option() 命令通常用于创建缓存条目以允许用户设置选项。但是,在某些情况下,项目可能会在调用 option() 命令之前定义与选项同名的普通(非缓存)变量。例如,将另一个项目作为子目录嵌入的项目可能希望对子项目的选项进行硬编码以构建它需要的方式。
由于历史原因,在 CMake 3.12 及以下版本中, option() 命令 删除 一个正常的(非缓存的)同名变量,当:
指定名称的缓存条目根本不存在,或者
指定名称的缓存条目存在但尚未指定类型(例如,通过命令行上的“-D<name>=ON”)。
在这两种情况下(通常是在新构建树中第一次运行时), option() 命令给出缓存条目类型 BOOL 并删除任何同名的普通(非缓存)变量.在其余情况下,指定名称的缓存条目已经存在并且具有类型(通常在构建树中稍后运行), option() 命令不做任何更改,任何同名的普通变量保持设置。
在 CMake 3.13 及更高版本中,当给定名称的普通变量已经存在时, option() 命令倾向于不执行任何操作。它不会创建或更新缓存条目或删除普通变量。新行为在构建树中的第一次和后来的运行之间是一致的。此策略提供与尚未更新以期待新行为的项目的兼容性。
当 option() 命令看到给定名称的普通变量时:
即使存在同名的普通变量,此策略的“旧”行为也会继续。如果缓存条目尚不存在且没有类型,则创建它和/或为其指定类型,然后删除普通变量。
此策略的“新”行为是在存在同名普通变量时不执行任何操作。不删除普通变量。缓存条目不会被创建或更新,如果存在则被忽略。
有关 set(CACHE) 命令的类似策略,请参阅:policy:CMP0126,但请注意,这两个策略之间的“NEW”行为存在一些差异。
此策略是在 CMake 版本 3.13 中引入的。 CMake 版本 |发布|当未设置策略并使用“旧”行为时发出警告。使用 cmake_policy() 命令在项目中明确地将其设置为 OLD 或 NEW。使用 CMAKE_POLICY_DEFAULT_CMP0077 变量为子目录中的第三方项目设置策略而不修改它。
备注
策略的“旧”行为是 :manual:根据定义 <cmake-policies(7)> 已弃用,并且可能会在未来版本的 CMake 中删除。