cmake-policies(7)¶
简介¶
CMake 中的策略用于跨多个版本保留向后兼容行为。如果引入一项新策略,较新版本的 CMake 将开始对向后兼容行为发出警告。可以请求显式启用 cmake_policy()
命令的 OLD
(向后兼容)行为,以禁用警告。还可以要求对策略采用 NEW
(不向后兼容)行为,也可以避免发出警告。还可以使用 CMAKE_POLICY_DEFAULT_CMP<NNNN>
变量通过命令行明确将每项策略设置为 NEW
或 OLD
行为。
策略是一种弃用机制,而不是可靠的功能切换。几乎不应该设置策略 OLD
,但可以用来消除冻结或稳定的代码库的警告,也可以暂时用作更大迁移路径的一部分。每项策略的 OLD
行为都不理想,而且将在将来的版本中被错误情况取代。
如果用老版本的 CMake 构建项目时,cmake_minimum_required()
命令不止报告报错,还会将该 CMake 版本或更早版本中引入的所有策略设置为 NEW
行为。为管理那些策略,无需增加最低要求的 CMake 版本,可以采用 if(POLICY)
命令
if(POLICY CMP0990)
cmake_policy(SET CMP0990 NEW)
endif()
这样一来,较新版本的 CMake(用户可能在使用,而且未发出兼容性警告)可以用 NEW
行为。
在某些情况下,策略的设置限定在其父作用域能不传播。例如,如果 include()
命令或 find_package()
命令读取的文件包含有 cmake_policy()
的使用情况,那么默认情况下,该策略设置不会影响调用者。这两个命令都接受一个可选项 NO_POLICY_SCOPE
关键字来控制这种行为。
CMAKE_MINIMUM_REQUIRED_VERSION
变量还可以用来确定是否报告那些弃用宏或函数的使用情况错误。
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 Generator 中默认启用机器安装。
- 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 include 目录是系统 include 目录。
- 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 3.4 引入的策略¶
CMake 3.3 引入的策略¶
CMake 3.2 引入的策略¶
CMake 3.1 引入的策略¶
CMake 3.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 目标。
- 具有缺失包含目录的有条件链接的导入目标。
- CMP0026:不允许使用 LOCATION 目标属性。
- CMP0025:Apple Clang 的编译器 ID 现在为 AppleClang。
- CMP0024:不允许包含导出结果。
CMake 2.8 引入的策略¶
- CMP0023:不能混合简单的和关键字的 target_link_libraries 签名。
- CMP0022:INTERFACE_LINK_LIBRARIES 定义了链接接口。
- CMP0021:INCLUDE_DIRECTORIES 目标属性中相对路径会产生致命错误。
- 在 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 引入的策略¶
- CMP0011:包含的脚本会自动执行 cmake_policy PUSH 和 POP。
- CMP0010:变量引用语法错误会导致错误。
- CMP0009: 默认情况下,FILE GLOB_RECURSE 调用不应遵循符号链接。
- CMP0008: 根据完整路径链接的库必须具有有效的库文件名。
- CMP0007: list 命令不再忽略空元素。
- CMP0006: 安装 MACOSX_BUNDLE 目标需要 BUNDLE 目标。
- CMP0005: 预处理器定义值现在自动转义。
- CMP0004: 链接的库不得有前导或尾随空格。
- CMP0003: 通过完整路径链接的库不再产生链接器搜索路径。
- CMP0002: 逻辑目标名称在全球范围内必须是唯一的。
- CMP0001: 不应再使用 CMAKE_BACKWARDS_COMPATIBILITY。
- CMP0000: 必须指定所需的最低 CMake 版本。