CMake 3.19 发行说明

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

新特性

预设

生成器

  • Xcode 生成器在为 Xcode 12.0 或更高版本生成时,现在使用 Xcode “新的构建系统”。请参阅 CMAKE_XCODE_BUILD_SYSTEM 变量。可以使用 -T buildsystem=1 切换到旧的构建系统。

  • Xcode 生成器增加了对通过链接二进制文件与库构建阶段而不是总是直接嵌入链接器标志来链接库和框架的支持。此行为由新的 XCODE_LINK_BUILD_PHASE_MODE 目标属性控制,该属性由新的 CMAKE_XCODE_LINK_BUILD_PHASE_MODE 变量初始化。

  • 用于 VS 2015 及更高版本的 Visual Studio 生成器 增加了对 Visual Studio Tools for Android 的支持。现在可以将 CMAKE_SYSTEM_NAME 设置为 Android 以生成 Android 工具的 .vcxproj 文件。

语言

  • CMake 学会了支持 ISPC 作为第一类语言,可以通过 project()enable_language() 命令启用。ISPC 目前由 Makefile 生成器 和 Linux、macOS 和 Windows 上使用 Intel ISPC 编译器的 Ninja 生成器支持。

  • Clang 的 CUDA 语言支持现在包括

  • CUDA 语言支持现在可以在 QNX 上工作。

平台

基于文件的 API

  • cmake-file-api(7) “codemodel” 版本 2 的 version 字段已更新为 2.2。

  • cmake-file-api(7) “codemodel” 版本 2 的 “target” 对象在 compileGroups 对象中获得了一个新的 languageStandard 字段。

命令行

  • cmake(1) 命令行工具的 --install 模式增加了一个 --default-directory-permissions 选项。

  • cmake(1) 增加了一个 -E create_hardlink 命令行工具,可用于在文件之间创建硬链接。

GUI

  • CMake GUI 现在具有环境变量编辑器。

命令

  • add_test() 命令现在(正式地)支持在其创建的测试名称中使用空格和其他特殊字符。请参阅策略 CMP0110

  • cmake_language() 命令增加了一个 DEFER 模式,用于计划在处理目录结束时执行命令调用。

  • configure_file() 命令增加了一个 NO_SOURCE_PERMISSIONS 选项,用于禁止将输入文件的权限复制到输出文件。

  • execute_process() 命令增加了一个 COMMAND_ERROR_IS_FATAL 选项,用于指定致命错误。

  • file(ARCHIVE_CREATE) 命令增加了一个 COMPRESSION_LEVEL 选项,用于指定压缩级别。

  • 添加了 file(CHMOD)file(CHMOD_RECURSE) 子命令,用于设置文件和目录的权限。

  • file(DOWNLOAD) 命令的 <file> 参数现在是可选的。如果未指定,则不保存文件。

  • file(GENERATE) 命令增加了一个新的 TARGET 关键字,以支持解析目标相关的生成器表达式。

  • file() 命令增加了一个新的 REAL_PATH 子命令,用于计算已解析符号链接的路径。

  • find_package() 命令学会了处理版本范围。

  • separate_arguments() 命令增加了一个新的 PROGRAM 选项。它允许将参数视为程序调用,并将可执行文件解析为完整路径(如果可以找到)。

  • set_property()get_property()get_directory_property() 命令的 DIRECTORY 选项现在接受对二进制目录路径的引用,例如 CMAKE_CURRENT_BINARY_DIR 的值。

  • string() 命令增加了一组新的 JSON 子命令,提供 JSON 解析功能。

变量

属性

模块

CTest

  • ctest(1) 现在支持 CUDA compute-sanitizer 检查器(以前称为 cuda-memcheck)作为 CTEST_MEMORYCHECK_COMMAND。可以通过向 CTEST_MEMORYCHECK_COMMAND_OPTIONS 变量添加适当的标志来选择 compute-sanitizer 支持的不同工具(memcheckracechecksynccheckinitcheck)。默认标志是 --tool memcheck --leak-check full

CPack

其他

已弃用和移除的特性

  • 与 CMake 2.8.12 之前版本的兼容性现在已弃用,并将从未来版本中移除。将策略版本设置为旧值的 cmake_minimum_required()cmake_policy() 调用现在会发出弃用诊断信息。

  • 为策略 CMP0071 添加了显式弃用诊断信息(CMP0071 及以下版本已弃用)。cmake-policies(7) 手册解释说,所有策略的旧行为都已被弃用,项目应移植到新行为。

  • 不再支持早于 10.5 的 macOS SDK。

  • cmake-gui(1) 现在需要 Qt5。已移除对使用 Qt4 编译的支持。

  • 已移除 cmake(1) 命令行选项 --warn-unused-vars,现在会被静默忽略。自 CMake 3.3 以来,此选项一直无法正常工作。

文档

已添加以下指南

其他更改

  • 现在,macOS 的构建将使用系统上可用的最新 SDK,除非用户已使用 CMAKE_OSX_SYSROOT 显式选择了 SDK。部署目标或系统 macOS 版本不会影响 SDK 的选择。

  • 现在可以使用 CMAKE_<LANG>_COMPILER 变量来存储“强制性”编译器标志,例如 CC 和其他环境变量。

  • 如果在编译器识别检查期间未设置其他来源(如 CMAKE_<LANG>_FLAGSCFLAGS),则现在将考虑 CMAKE_<LANG>_FLAGS_INIT 变量。

  • find_program() 命令现在需要执行权限,但不需要读取找到的文件的权限。请参阅策略 CMP0109

  • 如果导入的目标缺少其位置属性,并且使用了该位置,则在生成期间会失败。请参阅策略 CMP0111

  • 以下基于目标的生成器表达式查询目录或文件名组件时,不再添加对被评估目标的依赖。请参阅策略 CMP0112

    • TARGET_FILE_DIR

    • TARGET_LINKER_FILE_BASE_NAME

    • TARGET_LINKER_FILE_NAME

    • TARGET_LINKER_FILE_DIR

    • TARGET_SONAME_FILE_NAME

    • TARGET_SONAME_FILE_DIR

    • TARGET_PDB_FILE_NAME

    • TARGET_PDB_FILE_DIR

    • TARGET_BUNDLE_DIR

    • TARGET_BUNDLE_CONTENT_DIR

  • Makefile 生成器 不再重复来自目标依赖项的自定义命令。请参阅策略 CMP0113

  • ExternalProject 模块对步骤目标依赖项的处理已修订。请参阅策略 CMP0114

  • 现在,ASM 语言也支持 OSX_ARCHITECTURES 目标属性。

  • 如果使用用户指定的 CMAKE_CUDA_ARCHITECTURESCMAKE_CUDA_HOST_COMPILER 导致 CUDA 编译器检测失败,则会引发错误。

更新

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

3.19.1

  • CMake 3.19.0 使用 LANGUAGE 属性编译源文件,方法是传递显式语言标志,例如 -x c。这与该属性的文档化含义一致,即源文件以指定的语言编写。但是,这可能会破坏仅使用该属性来导致使用指定语言的编译器的项目。这已恢复为 CMake 3.18 及更低版本的行为。

  • CUDA 11.1 支持 Clang。

3.19.2

  • cmake.org 上提供的预编译 macOS 二进制文件现在是一个通用二进制文件,具有 x86_64arm64 架构。它需要 macOS 10.10 或更高版本。软件包文件名模式已从 cmake-$ver-Darwin-x86_64 更改为 cmake-$ver-macos-universal

  • Apple Silicon 主机架构选择支持已更新。CMake 3.19.0 和 3.19.1 始终选择 arm64 作为主机架构。CMake 3.19.2 恢复使用 uname -m,与 CMake 3.18 及更低版本相同。由于这可能因 CMake 自身的架构以及调用进程树的架构而异,因此可以设置 CMAKE_APPLE_SILICON_PROCESSOR 变量或 CMAKE_APPLE_SILICON_PROCESSOR 环境变量来显式指定主机架构。

  • 添加了 CMAKE_ISPC_HEADER_SUFFIX 变量和相应的 ISPC_HEADER_SUFFIX 目标属性,以控制 ISPC 编译器生成的标头使用的标头后缀。

3.19.3

  • 现在在 cmake.org 上提供了预编译的 Linux aarch64 二进制文件。

  • 现在在 cmake.org 上提供了两个预编译的 macOS 二进制文件

    • 命名模式 cmake-$ver-macos-universal 是一个通用二进制文件,具有 x86_64arm64 架构。它需要 macOS 10.13 或更高版本。

    • 命名模式 cmake-$ver-macos10.10-universal 是一个通用二进制文件,具有 x86_64arm64 架构。它需要 macOS 10.10 或更高版本。

3.19.4

3.19.5

  • 当启用 IOS_INSTALL_COMBINED 并且使用 Xcode 生成器时,现在可以通过从命令行运行 cmake --installcpack 来启动安装或包创建。当使用 Xcode 新构建系统时,由于 Xcode 的限制,这些是唯一支持的方法。仅当使用旧构建系统时,才支持通过在 Xcode 中构建 installpackage 目标来启动这些操作。

  • 作为支持 Xcode 的链接二进制文件与库构建阶段的一部分,在 3.19.0 中引入的框架处理破坏了在设备和模拟器构建之间切换而无需重新配置的功能。该功能现已恢复。

3.19.6

  • cmake-presets(7) 功能不再允许在 CMakePresets.jsonCMakeUserPresets.json 文件中添加注释。CMake 3.19.0 至 CMake 3.19.5 中的实现错误地允许了这一点,并且未记录在文档中。

3.19.7