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 的最低版本。该项目预期可以在这些版本之间引入的策略的 OLD 和 NEW 行为下正常工作。
过渡计划¶
为了帮助项目按照自己的时间表迁移到策略的 NEW 行为,CMake 提供了一个过渡期
如果项目未设置某项策略,CMake 将使用其
OLD行为,但可能会发出警告,提示该策略尚未设置。运行 CMake 的用户可以在不修改项目的情况下,通过在
cmake(1)命令行上设置CMAKE_POLICY_DEFAULT_CMP<NNNN>变量作为缓存条目,来屏蔽该警告。cmake -DCMAKE_POLICY_DEFAULT_CMP0990=OLD ...
项目可以通过使用
cmake_policy()命令显式将策略设置为OLD或NEW行为来屏蔽警告。if(POLICY CMP0990) cmake_policy(SET CMP0990 NEW) endif()
注意
除非是为了在已冻结或稳定的代码库中屏蔽警告,或者作为更大迁移路径的一部分临时处理,否则策略几乎不应被设置为
OLD。
如果项目将策略设置为
OLD,则在引入该策略的版本发布至少 2 年后,CMake 版本可能会发出警告,提示该策略的OLD行为将在未来版本的 CMake 中移除。如果项目未将策略设置为
NEW,则在引入该策略的版本发布至少 6 年后,且主版本号更高的 CMake 版本可能会报错,提示该策略的OLD行为已被移除。
支持的策略¶
支持以下策略。
CMake 4.4 引入的策略¶
- CMP0219:宏调用在参数中保留反斜杠。
- CMP0218:忽略 CMAKE_WARN_DEPRECATED 和 CMAKE_ERROR_DEPRECATED 变量。
- CMP0217:MACROS 目录属性不再存在。
- CMP0216:Swift 目标具有默认项目名称。
- CMP0215:Ninja 生成器将 Swift 模块与编译分开生成。
- CMP0214:为 Swift 可执行目标尊重 CMAKE_EXE_LINKER_FLAGS。
- CMP0213:file(ARCHIVE_{CREATE,EXTRACT}) 默认将归档路径编码为 UTF-8。
- CMP0212:add_custom_command DEPENDS 不会剥离 .exe 后缀。
- CMP0211:一个文件在目标中最多只能属于一个非 HEADERS 文件集。
CMake 4.3 引入的策略¶
CMake 4.2 引入的策略¶
CMake 4.1 引入的策略¶
- CMP0197:MSVC link -machine: 标志不在 CMAKE_*_LINKER_FLAGS 中。
- CMP0196:移除了 CMakeDetermineVSServicePack 模块。
- CMP0195:构建树中的 Swift 模块使用 Swift 模块目录结构。
- CMP0194:MSVC 不是语言 ASM 的汇编器。
- CMP0193:GNUInstallDirs 对安装前缀 '/' 缓存以 'usr/' 开头的 CMAKE_INSTALL_*。
- CMP0192:GNUInstallDirs 在特殊前缀中使用绝对路径的 SYSCONFDIR、LOCALSTATEDIR 和 RUNSTATEDIR。
- CMP0191:移除了 FindCABLE 模块。
- CMP0190:FindPython 在交叉编译模式下强制一致性。
- CMP0189:TARGET_PROPERTY 传递性地评估 LINK_LIBRARIES 属性。
- CMP0188:移除了 FindGCCXML 模块。
- CMP0187:在同名且有扩展名的文件之后,包含无扩展名的源文件。
- CMP0186:正则表达式在重复搜索中最多匹配 ^ 一次。
CMake 4.0 引入的策略¶
CMake 3.31 引入的策略¶
- CMP0180:project() 始终将 <PROJECT-NAME>_* 设置为普通变量。
- CMP0179:链接行上的静态库去重保留第一次出现。
- CMP0178:测试命令行保留空参数。
- CMP0177:install() DESTINATION 路径被规范化。
- CMP0176:execute_process() ENCODING 默认为 UTF-8。
- CMP0175:add_custom_command() 拒绝无效参数。
- CMP0174:cmake_parse_arguments(PARSE_ARGV) 为单值关键字后的空字符串定义变量。
- CMP0173:移除了 CMakeFindFrameworks 模块。
- CMP0172:CPack 模块在 CPack WIX 生成器中默认启用每机安装。
- CMP0171:'codegen' 是保留的目标名称。
CMake 3.30 引入的策略¶
- CMP0170:强制执行 FETCHCONTENT_FULLY_DISCONNECTED 要求。
- CMP0169:FetchContent_Populate(depName) 单参数签名被弃用。
- CMP0168:FetchContent 直接实现步骤,而非通过子构建。
- CMP0167:移除了 FindBoost 模块。
- CMP0166:TARGET_PROPERTY 对静态库的私有依赖项传递性地评估链接属性。
- CMP0165:不能在 project() 之前调用 enable_language()。
- CMP0164:当平台不支持时,add_library() 拒绝 SHARED 库。
- CMP0163:GENERATED 源文件属性现在在所有目录中可见。
- CMP0162:Visual Studio 生成器默认添加 UseDebugLibraries 指示符。
CMake 3.29 引入的策略¶
CMake 3.28 引入的策略¶
CMake 3.27 引入的策略¶
- CMP0151:AUTOMOC 包含目录默认作为系统包含目录。
- CMP0150:ExternalProject_Add 和 FetchContent_Declare 将相对 git 仓库路径视为相对于父项目的远程仓库。
- CMP0149:Visual Studio 生成器默认选择最新的 Windows SDK。
- CMP0148:移除了 FindPythonInterp 和 FindPythonLibs 模块。
- CMP0147:Visual Studio 生成器并行构建自定义命令。
- CMP0146:移除了 FindCUDA 模块。
- CMP0145:移除了 Dart 和 FindDart 模块。
- CMP0144:find_package 使用大写的 PACKAGENAME_ROOT 变量。
CMake 3.26 引入的策略¶
CMake 3.25 引入的策略¶
CMake 3.24 引入的策略¶
- CMP0139:if() 命令支持使用 PATH_EQUAL 运算符进行路径比较。
- CMP0138:CheckIPOSupported 使用调用项目的标志。
- CMP0137:try_compile() 在项目模式下传递平台变量。
- CMP0136:Watcom 运行时库标志由抽象层选择。
- CMP0135:对于 URL 下载方法,ExternalProject 和 FetchContent 默认忽略归档中的时间戳。
- CMP0134:当 "TARGET" 视图不可用时,回退到 "HOST" Windows 注册表视图。
- CMP0133:CPack 模块在 CPack DragNDrop 生成器中默认禁用 SLA。
- CMP0132:首次运行时不要设置编译器环境变量。
- CMP0131:LINK_LIBRARIES 支持 LINK_ONLY 生成器表达式。
- CMP0130:while() 会诊断条件评估错误。
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 移除的策略¶
- CMP0050:禁止 add_custom_command SOURCE 签名。
- CMP0049:不要在目标源条目中扩展变量。
- CMP0048:project() 命令管理 VERSION 变量。
- CMP0047:对 QNX 上的 qcc 驱动程序使用 QCC 编译器 ID。
- CMP0046:对 add_dependencies 中不存在的依赖项报错。
- CMP0045:对 get_target_property 中不存在的目标报错。
- CMP0044:区分大小写的 Lang_COMPILER_ID 生成器表达式。
- CMP0043:忽略 COMPILE_DEFINITIONS_Config 属性。
- CMP0042:默认启用 MACOSX_RPATH。
- CMP0041:对带有生成器表达式的相对包含路径报错。
- CMP0040:add_custom_command() TARGET 签名中的目标必须存在。
- CMP0039:实用工具目标不能有链接依赖项。
- CMP0038:目标不能直接链接到自身。
- CMP0037:目标名称不应是保留字,且应符合有效性模式。
- CMP0036:不应调用 build_name 命令。
- CMP0035:不应调用 variable_requires 命令。
- CMP0034:不应调用 utility_source 命令。
- CMP0033:不应调用 export_library_dependencies 命令。
- CMP0032:不应调用 output_required_files 命令。
- CMP0031:不应调用 load_command 命令。
- CMP0030:不应调用 use_mangled_mesa 命令。
- CMP0029:不应调用 subdir_depends 命令。
- CMP0028:目标名称中的双冒号意味着 ALIAS 或 IMPORTED 目标。
- CMP0027:有条件链接的导入目标缺少包含目录。
- CMP0026:禁止使用 LOCATION 目标属性。
- CMP0025:Apple Clang 的编译器 ID 现在是 AppleClang。
- CMP0024:禁止 include 导出结果。
CMake 2.8 引入,CMake 4.0 移除的策略¶
- CMP0023:不能混合使用普通签名和关键字签名的 target_link_libraries。
- CMP0022:INTERFACE_LINK_LIBRARIES 定义了链接接口。
- CMP0021:INCLUDE_DIRECTORIES 目标属性中的相对路径会导致致命错误。
- CMP0020:在 Windows 上自动将 Qt 可执行文件链接到 qtmain 目标。
- CMP0019:不要在包含和链接信息中重新扩展变量。
- CMP0018:忽略 CMAKE_SHARED_LIBRARY_Lang_FLAGS 变量。
- CMP0017:从 CMake 模块目录包含时,优先使用该目录中的文件。
- CMP0016:如果其唯一参数不是目标,target_link_libraries() 会报告错误。
- CMP0015:link_directories() 将路径视为相对于源目录。
- CMP0014:输入目录必须有 CMakeLists.txt。
- CMP0013:不允许重复的二进制目录。
- CMP0012:if() 识别数字和布尔常量。
CMake 2.6 引入,CMake 4.0 移除的策略¶
- CMP0011:包含的脚本自动执行 cmake_policy PUSH 和 POP。
- CMP0010:糟糕的变量引用语法会导致错误。
- CMP0009:FILE GLOB_RECURSE 调用默认不应跟随符号链接。
- CMP0008:通过全路径链接的库必须有有效的库文件名。
- CMP0007:list 命令不再忽略空元素。
- CMP0006:安装 MACOSX_BUNDLE 目标需要 BUNDLE DESTINATION。
- CMP0005:预处理器定义值现在会自动转义。
- CMP0004:链接的库不能有前导或尾随空格。
- CMP0003:通过全路径链接的库不再产生链接器搜索路径。
- CMP0002:逻辑目标名称必须全局唯一。
- CMP0001:不应再使用 CMAKE_BACKWARDS_COMPATIBILITY。
- CMP0000:必须指定最低要求的 CMake 版本。