cmake-policies(7)

简介

CMake 策略引入行为变更,同时为现有项目版本保留兼容性。策略是弃用机制,而不是功能开关。每项策略都记录了已弃用的 OLD 行为和首选的 NEW 行为。项目必须随着时间的推移进行更新以使用 NEW 行为,但其现有版本将继续使用 OLD 行为。

更新项目

当 CMake 版本新引入策略时,该版本及更高版本会立即弃用其 OLD 行为。项目应尽快更新以使用策略的 NEW 行为。

使用 cmake_minimum_required() 命令来记录项目已更新到的最新 CMake 版本。例如

cmake_minimum_required(VERSION 3.10...3.31)

这使用 <min>...<max> 语法来启用 CMake 3.31 及更早版本中引入的策略的 NEW 行为,同时仅要求最低 CMake 版本为 3.10。该项目预计可与这些版本之间引入的策略的 OLDNEW 行为一起使用。

过渡计划

为了帮助项目按照自己的计划移植到策略的 NEW 行为,CMake 提供了过渡期

  • 如果项目未设置策略,CMake 将使用其 OLD 行为,但可能会警告该策略尚未设置。

    • 运行 CMake 的用户可以通过在 cmake(1) 命令行上将 CMAKE_POLICY_DEFAULT_CMP<NNNN> 变量设置为缓存条目来消除警告,而无需修改项目

      cmake -DCMAKE_POLICY_DEFAULT_CMP0990=OLD ...
      
    • 项目可以通过使用 cmake_policy() 命令显式地将策略设置为 OLDNEW 行为来消除警告

      if(POLICY CMP0990)
        cmake_policy(SET CMP0990 NEW)
      endif()
      

      注意

      策略几乎永远不应设置为 OLD,除非是为了在其他方面冻结或稳定的代码库中消除警告,或暂时作为更大迁移路径的一部分。

  • 如果项目将策略设置为 OLD,则在引入策略的版本之后至少 2 年发布的 CMake 版本可能会发出警告,提示策略的 OLD 行为将从未来的 CMake 版本中删除。

  • 如果项目未将策略设置为 NEW,则在引入策略的版本之后至少 6 年发布的 CMake 版本,且其主版本号更高,可能会发出错误,提示策略的 OLD 行为已被删除。

支持的策略

以下策略受到支持。

CMake 4.0 引入的策略

CMake 3.31 引入的策略

CMake 3.30 引入的策略

CMake 3.29 引入的策略

CMake 3.28 引入的策略

CMake 3.27 引入的策略

CMake 3.26 引入的策略

CMake 3.25 引入的策略

CMake 3.24 引入的策略

CMake 3.23 引入的策略

CMake 3.22 引入的策略

CMake 3.21 引入的策略

CMake 3.20 引入的策略

CMake 3.19 引入的策略

CMake 3.18 引入的策略

CMake 3.17 引入的策略

CMake 3.16 引入的策略

CMake 3.15 引入的策略

CMake 3.14 引入的策略

CMake 3.13 引入的策略

CMake 3.12 引入的策略

CMake 3.11 引入的策略

CMake 3.10 引入的策略

CMake 3.9 引入的策略

CMake 3.8 引入的策略

CMake 3.7 引入的策略

不支持的策略

以下策略不再受支持。项目对 cmake_minimum_required(VERSION)cmake_policy(VERSION) 的调用必须将其设置为 NEW。它们的 OLD 行为已从 CMake 中删除。

CMake 3.4 引入的策略,CMake 4.0 移除

CMake 3.3 引入的策略,CMake 4.0 移除

CMake 3.2 引入的策略,CMake 4.0 移除

CMake 3.1 引入的策略,CMake 4.0 移除

CMake 3.0 引入的策略,CMake 4.0 移除

CMake 2.8 引入的策略,CMake 4.0 移除

CMake 2.6 引入的策略,CMake 4.0 移除