cmake-policies(7)¶
简介¶
CMake 策略引入行为变更,同时为现有项目版本保留兼容性。策略是弃用机制,而不是功能开关。每项策略都记录了已弃用的 OLD
行为和首选的 NEW
行为。项目必须随着时间的推移进行更新以使用 NEW
行为,但其现有版本将继续使用 OLD
行为。
更新项目¶
当 CMake 版本新引入策略时,该版本及更高版本会立即弃用其 OLD
行为。项目应尽快更新以使用策略的 NEW
行为。
使用 cmake_minimum_required()
命令来记录项目已更新到的最新 CMake 版本。例如
cmake_minimum_required(VERSION 3.10...3.31)
这使用 <min>...<max>
语法来启用 CMake 3.31 及更早版本中引入的策略的 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.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: enable_language() 必须在 project() 之前调用。
- 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 引入的策略¶
- CMP0088: FindBISON 在执行时在 CMAKE_CURRENT_BINARY_DIR 中运行 bison。
- CMP0087: install(SCRIPT | CODE) 支持生成器表达式。
- CMP0086: UseSWIG 通过 -module 标志遵循 SWIG_MODULE_NAME。
- CMP0085: IN_LIST 生成器表达式处理空列表项。
- CMP0084: FindQt 模块对于 find_package() 不存在。
- CMP0083: 链接可执行文件时添加 PIE 选项。
- CMP0082: 来自 add_subdirectory() 的安装规则与调用者中的规则交错。
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: 不允许包含导出结果。
CMake 2.8 引入的策略,CMake 4.0 移除¶
- CMP0023: Plain 和 keyword 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 版本。