cmake-policies(7)

简介

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

更新项目

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

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

cmake_minimum_required(VERSION 3.10...4.0)

这使用 <min>...<max> 语法来启用 CMake 4.0 及更早版本中引入的策略的 NEW 行为,同时只要求最低版本为 CMake 3.10。项目应在使用这些版本之间引入的策略的 OLD 行为和 NEW 行为时都能正常工作。

过渡计划

为了帮助项目按照自己的时间表移植到策略的 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.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 移除的策略