cmake 政策(7)¶
介绍¶
CMake 中的策略用于跨多个版本保留向后兼容的行为。当引入新策略时,较新的 CMake 版本将开始警告有关向后兼容的行为。可以通过使用 cmake_policy() 命令明确请求旧的或向后兼容的行为来禁用警告。也可以为策略请求“NEW”或非向后兼容行为,同时避免警告。每个策略也可以在命令行上使用 CMAKE_POLICY_DEFAULT_CMP<NNNN> 变量显式设置为 NEW 或 OLD 行为。
策略是一种弃用机制,而不是可靠的功能切换。策略几乎不应该设置为“旧”,除非在冻结或稳定的代码库中消除警告,或者暂时作为更大迁移路径的一部分。每个策略的“旧”行为都是不可取的,在未来的版本中将被替换为错误条件。
如果使用太旧版本的 CMake 构建项目,cmake_minimum_required 命令不仅仅会报告错误。它还将在该 CMake 版本或更早版本中引入的所有策略设置为“新”行为。要在不增加所需的最低 CMake 版本的情况下管理策略,可以使用 if(POLICY) 命令:
if(POLICY CMP0990)
cmake_policy(SET CMP0990 NEW)
endif()
这具有将“NEW”行为与用户可能正在使用的较新 CMake 版本一起使用的效果,并且不会发出兼容性警告。
策略的设置在某些情况下被限制为不传播到父范围。例如,如果 include() 命令或 find_package() 命令读取的文件包含对 cmake_policy() 的使用,默认情况下该策略设置不会影响调用者。这两个命令都接受可选的 NO_POLICY_SCOPE 关键字来控制此行为。
CMAKE_MINIMUM_REQUIRED_VERSION 变量也可用于确定是否报告有关使用已弃用的宏或函数的错误。
CMake 3.26 引入的策略¶
CMake 3.25 引入的策略¶
CMake 3.24 引入的策略¶
- CMP0139:if() 命令支持使用 PATH_EQUAL 运算符进行路径比较。
- CMP0138:CheckIPOSupported 使用来自调用项目的标志。
- CMP0137:try_compile() 在项目模式下传递平台变量。
- CMP0136:Watcom 运行时库标志由抽象选择。
- CMP0135:对于 URL 下载方法,ExternalProject 默认忽略存档中的时间戳。
- 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:将 QCC 编译器 ID 用于 QNX 上的 qcc 驱动程序。
- 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 引入的策略¶
- CMP0023:普通签名和关键字 target_link_libraries 签名不能混合。
- CMP0022:INTERFACE_LINK_LIBRARIES 定义链接接口。
- CMP0021:INCLUDE_DIRECTORIES 目标属性中的相对路径发生致命错误。
- CMP0020:自动将 Qt 可执行文件链接到 Windows 上的 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:列表命令不再忽略空元素。
- CMP0006:安装 MACOSX_BUNDLE 目标需要 BUNDLE DESTINATION。
- CMP0005:预处理器定义值现在自动转义。
- CMP0004:链接的库可能没有前导或尾随空格。
- CMP0003:通过完整路径链接的库不再生成链接器搜索路径。
- CMP0002:逻辑目标名称必须全局唯一。
- CMP0001:不应再使用 CMAKE_BACKWARDS_COMPATIBILITY。
- CMP0000:必须指定所需的最低 CMake 版本。