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> 都是 CMake 版本,形式为 major.minor[.patch[.tweak]],其中 ... 是字面量。 <min> 版本必须至少为 2.4,最多为当前运行的 CMake 版本。如果指定了 <max> 版本,则它必须至少等于 <min> 版本,但可以超过当前运行的 CMake 版本。如果当前运行的 CMake 版本早于 3.12,则额外的 ... 点将被视为版本组件分隔符,导致 ...<max> 部分被忽略,并保留 3.12 之前的行为,即基于 <min> 来设置策略。
这指定当前 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 版本中更改: 移除了与早于 3.5 的 CMake 版本的兼容性。在 CMake 4.0 及更高版本中,未指定至少 3.5 作为其策略版本的 cmake_minimum_required(VERSION) 或 cmake_policy(VERSION) 调用(可选通过 ...<max>)将产生错误。
在 3.31 版本中更改: 与早于 3.10 的 CMake 版本的兼容性已弃用。在 CMake 3.31 及更高版本中,未指定至少 3.10 作为其策略版本的 cmake_minimum_required(VERSION) 或 cmake_policy(VERSION) 调用(可选通过 ...<max>)将产生弃用警告。
在 3.27 版本中更改: 与早于 3.5 的 CMake 版本的兼容性已弃用。在 CMake 3.27 及更高版本中,未指定至少 3.5 作为其策略版本的 cmake_minimum_required(VERSION) 或 cmake_policy(VERSION) 调用(可选通过 ...<max>)将产生弃用警告。
在 3.19 版本中更改: 与早于 2.8.12 的 CMake 版本的兼容性已弃用。在 CMake 3.19 及更高版本中,未指定至少 2.8.12 作为其策略版本的 cmake_minimum_required(VERSION) 或 cmake_policy(VERSION) 调用(可选通过 ...<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) 命令提供了一种更灵活、更安全的方式来管理策略堆栈。弹出操作在离开块作用域时自动完成,因此无需在每次调用 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() 命令创建的命令在创建时会记录策略设置,并在调用时使用预记录的策略。如果函数或宏实现设置了策略,则更改会自动传播到调用者,直到达到最近的嵌套策略堆栈条目。