CMake 3.19 发行说明

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

新功能

预设

生成器

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

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

  • Visual Studio Generators for VS 2015 and above gained support for the Visual Studio Tools for Android. One may now set CMAKE_SYSTEM_NAME to Android to generate .vcxproj files for the Android tools.

语言

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

  • 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

其他

已弃用和移除的功能

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

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

  • 不再支持早于 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 Generators 不再重复来自目标依赖项的自定义命令。参见策略 CMP0113

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

  • 对于 ASM 语言,现在会考虑 OSX_ARCHITECTURES 目标属性。

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

更新

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

3.19.1

  • CMake 3.19.0 通过传递显式语言标志(如 -x c)来编译具有 LANGUAGE 属性的源文件。这与属性的文档含义一致,即源文件是用指定的语言编写的。但是,这会破坏仅使用该属性来导致使用指定语言编译器(例如 -x cuda)的项目。此更改已被撤销,以恢复 CMake 3.18 及更早版本的行为。

  • Clang 的 CUDA 11.1 支持。

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 目标来启动这些操作仅在使用旧版构建系统时才受支持。

  • 3.19.0 中为支持 Xcode 的 *Link Binaries With Libraries* 构建阶段而引入的框架处理破坏了在不重新配置的情况下切换设备和模拟器构建的能力。现在已恢复此功能。

3.19.6

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

3.19.7