cmake-policies(7)

简介

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

更新项目

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

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

cmake_minimum_required(VERSION 3.10...4.3)

这使用了 <min>...<policy_max> 语法,以启用在 CMake 4.3 及之前版本中引入的策略的 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.4 引入的策略

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