cmake-policies(7)

简介

CMake 策略在引入行为变更的同时,保持对现有项目版本的兼容性。策略是一种弃用机制,而非功能开关。每个策略文档都会记录一个被弃用的 OLD(旧)行为和一个首选的 NEW(新)行为。项目必须随着时间的推移进行更新以使用 NEW 行为,但其现有版本将继续使用 OLD 行为正常工作。

更新项目

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

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

cmake_minimum_required(VERSION 3.10...4.2)

这使用了 <min>...<policy_max> 语法,以启用 CMake 4.2 及更早版本中引入的策略的 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.3 引入的策略

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