CMake 3.17 发布说明

自 CMake 3.16 以来的更改包括以下内容。

新功能

生成器

语言

  • Compile Features 功能现在为 CUDA 语言标准级别(例如 cuda_std_03cuda_std_14)提供了元特性。请参阅 CMAKE_CUDA_KNOWN_FEATURES

编译器

  • IBM XL Fortran 编译器现在得到了 Ninja 生成器的支持。

命令行

  • cmake(1) 新增了 --debug-find 命令行选项,以启用关于 find_* 命令搜索位置的额外可读输出。

  • cmake(1) 新增了 --trace-format 命令行选项,可用于设置 --trace 的输出格式。当前支持旧的易读格式和新的 JSON 格式。新的 JSON 格式比现有格式更容易自动解析。

  • cmake(1) 新增了一个 -E rm 命令行工具,可用于删除目录和文件。它取代了现有的 -E remove-E remove_directory 工具,并且具有更好的语义。

命令

  • add_custom_command() 命令现在可以解释 DEPENDS 参数中相对于当前二进制目录指定的路径。

  • foreach() 命令新增了 ZIP_LISTS 选项,用于同时迭代多个列表。

  • 当使用 cmake -P 运行脚本 时,现在允许使用 load_cache(READ_WITH_PREFIX) 命令模式。

  • message() 命令现在可以输出 CMAKE_MESSAGE_CONTEXT 变量中提供的上下文信息(用于 NOTICE 及以下级别)。通过新的 --log-context 命令行选项或 CMAKE_MESSAGE_CONTEXT_SHOW 变量启用此输出。

  • message() 命令新增了 CHECK_STARTCHECK_PASSCHECK_FAIL 关键字。

  • target_compile_options() 命令现在更能一致地遵守 BEFORE 关键字。请参阅策略 CMP0101

变量

属性

模块

  • ExternalProject 模块的 ExternalProject_Add() 命令新增了 GIT_SUBMODULES_RECURSE 选项,用于指定是否递归更新 Git 子模块。默认值为开启,以保持现有行为。

  • 新增了 FindCUDAToolkit 模块,用于查找 CUDA Toolkit 而不启用 CUDA 作为语言。

  • FindCURL 模块现在可以通过 CURL 的 cmake 构建系统生成的 CURLConfig.cmake 包配置文件来查找 CURL。它还新增了 CURL_NO_CURL_CMAKE 选项来禁用此行为。

  • FindFLEX 模块的 flex_target() 命令现在以 CMAKE_CURRENT_BINARY_DIR 作为工作目录来运行 flex。请参阅策略 CMP0098

  • FindLibArchive 模块现在为 libarchive 提供了一个导入的目标。

  • FindPython 模块现在可以查找由 conda 管理的活动虚拟环境中的 Python 组件。

  • FindPython3FindPython 模块分别新增了变量 Python3_SOABIPython_SOABI,用于提供模块的标准扩展后缀。此外,命令 Python3_add_library()Python_add_library() 新增了 WITH_SOABI 选项,以 SOABI 的值为库后缀添加前缀。

  • FindLibXml2 模块现在为 xmllint 可执行文件提供了一个导入的目标。

Autogen

CTest

  • ctest(1) 使用 -C <cfg> 调用时,CTEST_CONFIGURATION_TYPE 变量现在是从命令行设置的。

  • ctest(1) 工具新增了对 Dr. Memory 的支持,用于运行内存检查。

  • ctest(1) 工具新增了 --no-tests=<[error|ignore]> 选项,用于在未找到测试时显式设置和统一直接调用与脚本模式之间的行为。

  • ctest(1) 工具新增了 --repeat <mode>:<n> 选项,用于指定重复测试的条件。这扩展了现有的 --repeat-until-fail <n> 选项,增加了 until-passafter-timeout 的模式。

  • ctest_test() 命令新增了 REPEAT <mode>:<n> 选项,用于指定重复测试的条件。

CPack

其他

  • 如果终端支持颜色,ccmake(1) 现在会根据条目类型使用颜色显示缓存值。

  • ccmake(1) 现在在配置和生成期间显示消息和进度条。如果发生任何错误或警告,它将保留显示的输出。

已弃用和已移除的功能

  • 为策略 CMP0068CMP0069CMP0067 及以下版本已弃用)添加了显式的弃用诊断。 cmake-policies(7) 手册解释说,所有策略的 OLD 行为都已弃用,项目应迁移到 NEW 行为。

  • CPack PackageMaker 生成器已弃用,因为 Xcode 不再分发 PackageMaker 工具。未经文档化的 OSXX11 生成器也已弃用。

  • CMake 命令行工具 -E remove-E remove_directory 已弃用,推荐使用新的 -E rm 工具。旧工具在命名的路径不存在时即使没有 force 选项也总是返回 0,并且无法在不破坏兼容性的情况下修复,因此已被取代。

  • CPack NSIS Generator 现在要求 NSIS 3.0 或更高版本。

其他更改

  • file API 索引文件现在发出一个 multiConfig 标志,指定生成器是否支持多输出配置。

  • 目标链接属性 INTERFACE_LINK_OPTIONSINTERFACE_LINK_DIRECTORIESINTERFACE_LINK_DEPENDS 现在对于静态库上的私有依赖项是可传递的。请参阅策略 CMP0099

  • 在使用 MinGW 工具时,find_library() 命令默认不再查找 .dll 文件。相反,它期望 .dll.a 导入库可用。

  • MinGW Makefiles 生成器不再因为环境中 PATH 中存在 sh.exe 而发出错误。

  • Ninja 生成器现在优先选择 PATH 中第一个出现的 ninja 构建工具,无论其名称是 ninja-buildninja 还是 samu。以前是优先选择 PATH 中第一个出现的这些名称。

  • 使用 SDCC 时,现在优先使用 sdar 工具而不是 sdcclib 作为库管理器。后者已被 SDCC 3.2.0 弃用,并在 SDCC 3.8.6 中移除。

  • 使用 SDCC 时,默认标志不再包含任何特定于目标平台的标志。以前默认标志是为 8051 硬编码的。

  • CMAKE_VS_GLOBALS 变量的值现在在编译器识别期间以及由 add_custom_target() 命令创建的目标中生效。

  • Xcode 生成器不再硬编码 -Wmost-Wno-four-char-constants-Wno-unknown-pragmas 警告标志。

更新

自 CMake 3.17.0 以来的更改包括以下内容。

3.17.1

  • CMake 3.17.0 更新了 CPack NSIS Generator,其中包含需要 NSIS 3.0 或更高版本进行的更改。CMake 3.17.1 现在强制使用足够新版本的 NSIS。

3.17.3

3.17.5

  • CMAKE_AUTOMOC_PATH_PREFIX 的默认值已更改为 OFF,因为此功能可能会破坏具有不同包含目录中同名头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。在 3.16.9 中,默认值也已更改为 OFF