cmake-policies(7)

简介

CMake 策略会在保持现有项目版本兼容性的同时引入行为更改。策略是弃用机制,不是功能开关。每个策略都记录了一个已弃用的 OLD 行为和一个推荐的 NEW 行为。项目应随时间推移更新以使用 NEW 行为,但现有版本将继续与 OLD 行为兼容。

更新项目

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

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

cmake_minimum_required(VERSION 3.10...4.1)

这使用 <min>...<max> 语法启用 CMake 4.1 及更早版本中引入的策略的 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,那么在引入策略的 CMake 版本发布至少 2 年后的 CMake 版本可能会发出警告,即策略的 OLD 行为将在未来的 CMake 版本中被移除。

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

支持的策略

支持以下策略。

CMake 4.2 引入的策略

CMake 4.1 引入的策略

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 移除的策略