cmake_policy¶
管理 CMake 策略设置。 请参阅 cmake-policies(7)
手册以了解已定义的策略。
随着 CMake 的发展,有时需要更改现有行为,以修复错误或改进现有功能的实现。 CMake 策略机制旨在帮助现有项目在新版本 CMake 引入行为更改时保持构建。 每个新策略(行为更改)都具有 CMP<NNNN>
形式的标识符,其中 <NNNN>
是整数索引。 与每个策略关联的文档描述了 OLD
和 NEW
行为以及引入策略的原因。 项目可以设置每个策略以选择所需的行为。 当 CMake 需要知道使用哪种行为时,它会检查项目指定的设置。 如果没有可用的设置,则假定为 OLD
行为,并生成警告,要求设置策略。
按 CMake 版本设置策略¶
cmake_policy
命令用于将策略设置为 OLD
或 NEW
行为。 虽然支持单独设置策略,但我们鼓励项目根据 CMake 版本设置策略
- cmake_policy(VERSION <min>[...<max>])¶
3.12 版本新增: 可选的 <max>
版本。
<min>
和可选的 <max>
都是 major.minor[.patch[.tweak]]
形式的 CMake 版本,而 ...
是字面量。 <min>
版本必须至少为 2.4
,且最多为正在运行的 CMake 版本。 如果指定了 <max>
版本,则它必须至少为 <min>
版本,但可以超过正在运行的 CMake 版本。 如果正在运行的 CMake 版本早于 3.12,则额外的 ...
点将被视为版本组件分隔符,从而导致 ...<max>
部分被忽略,并保留基于 <min>
的策略的 3.12 之前的行为。
这指定当前的 CMake 代码是为给定的 CMake 版本范围 <min>[...<max>]
编写的。 它将“策略版本”设置为
范围的
<max>
版本(如果指定),或设置为<min>
版本,或设置为CMAKE_POLICY_VERSION_MINIMUM
变量的值(如果它高于其他两个版本)。
策略版本有效地请求给定 CMake 版本首选的行为,并告知较新的 CMake 版本警告它们的新策略。 运行的 CMake 版本已知且在该版本或更早版本中引入的所有策略都将设置为使用 NEW
行为。 稍后版本中引入的所有策略都将取消设置(除非 CMAKE_POLICY_DEFAULT_CMP<NNNN>
变量设置了默认值)。 这有效地请求给定 CMake 版本首选的行为,并告知较新的 CMake 版本警告它们的新策略。
请注意,cmake_minimum_required(VERSION)
命令隐式调用 cmake_policy(VERSION)
。
4.0 版本更改: 移除了与 CMake 3.5 之前版本的兼容性。 在 CMake 4.0 及更高版本中,调用 cmake_minimum_required(VERSION)
或 cmake_policy(VERSION)
未指定至少 3.5 作为其策略版本(可选地通过 ...<max>
)将产生错误。
3.31 版本更改: 与 CMake 3.10 之前版本的兼容性已被弃用。 在 CMake 3.31 及更高版本中,调用 cmake_minimum_required(VERSION)
或 cmake_policy(VERSION)
未指定至少 3.10 作为其策略版本(可选地通过 ...<max>
)将产生弃用警告。
3.27 版本更改: 与 CMake 3.5 之前版本的兼容性已被弃用。 在 CMake 3.27 及更高版本中,调用 cmake_minimum_required(VERSION)
或 cmake_policy(VERSION)
未指定至少 3.5 作为其策略版本(可选地通过 ...<max>
)将产生弃用警告。
3.19 版本更改: 与 CMake 2.8.12 之前版本的兼容性已被弃用。 在 CMake 3.19 及更高版本中,调用 cmake_minimum_required(VERSION)
或 cmake_policy(VERSION)
未指定至少 2.8.12 作为其策略版本(可选地通过 ...<max>
)将产生弃用警告。
显式设置策略¶
- cmake_policy(SET CMP<NNNN> NEW|OLD)¶
告诉 CMake 为给定策略使用 OLD
或 NEW
行为。 依赖于给定策略旧行为的项目可以通过将策略状态设置为 OLD
来消除策略警告。 或者,可以修复项目以使用新行为,并将策略状态设置为 NEW
。
注意
策略的 OLD
行为 按定义已弃用
,并且可能会在 CMake 的未来版本中删除。
检查策略设置¶
- cmake_policy(GET CMP<NNNN> <variable>)¶
检查给定策略是否设置为 OLD
或 NEW
行为。 如果策略已设置,则输出 <variable>
值将为 OLD
或 NEW
,否则为空。
CMake 策略堆栈¶
CMake 将策略设置保存在堆栈中,因此 cmake_policy
命令所做的更改仅影响堆栈的顶部。 每个子目录都会自动管理策略堆栈上的新条目,以保护其父目录和同级目录。 CMake 还为由 include()
和 find_package()
命令加载的脚本管理新条目,除非使用 NO_POLICY_SCOPE
选项调用(另请参阅策略 CMP0011
)。 cmake_policy
命令提供了一个接口来管理策略堆栈上的自定义条目
- cmake_policy(PUSH)¶
在策略堆栈上创建一个新条目。
- cmake_policy(POP)¶
删除使用
cmake_policy(PUSH)
创建的最后一个策略堆栈条目。
每个 PUSH
都必须有一个匹配的 POP
才能擦除任何更改。 这对于临时更改策略设置很有用。 调用 cmake_minimum_required(VERSION)
, cmake_policy(VERSION)
, 或 cmake_policy(SET)
命令仅影响策略堆栈的当前顶部。
3.25 版本新增: block(SCOPE_FOR POLICIES)
命令提供了一种更灵活和更安全的方式来管理策略堆栈。 当离开块作用域时,pop 操作会自动完成,因此无需在每个 return()
之前调用 cmake_policy(POP)
。
# stack management with cmake_policy()
function(my_func)
cmake_policy(PUSH)
cmake_policy(SET ...)
if (<cond1>)
...
cmake_policy(POP)
return()
elseif(<cond2>)
...
cmake_policy(POP)
return()
endif()
...
cmake_policy(POP)
endfunction()
# stack management with block()/endblock()
function(my_func)
block(SCOPE_FOR POLICIES)
cmake_policy(SET ...)
if (<cond1>)
...
return()
elseif(<cond2>)
...
return()
endif()
...
endblock()
endfunction()
由 function()
和 macro()
命令创建的命令在创建时记录策略设置,并在调用时使用预记录的策略。 如果函数或宏实现设置了策略,则更改会自动向上冒泡通过调用者,直到它们到达最近的嵌套策略堆栈条目。