CMake 3.19 发行说明

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

新功能

预设

生成器

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

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

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

语言

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

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

  • 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_COMMANDcompute-sanitizer 支持的各种工具(memcheckracechecksynccheckinitcheck)可以通过向 CTEST_MEMORYCHECK_COMMAND_OPTIONS 变量添加适当的标志来选择。默认标志为 --tool memcheck --leak-check full

CPack

其他

已弃用和移除的功能

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

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

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

  • 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>_FLAGS_INIT 变量现在将在编译器标识检查期间被考虑,前提是未设置其他源,如 CMAKE_<LANG>_FLAGSCFLAGS

  • 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

  • OSX_ARCHITECTURES 目标属性现在对 ASM 语言生效。

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

更新

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

3.19.1

  • CMake 3.19.0 通过传递显式语言标志(例如 -x c)来编译具有 LANGUAGE 属性的源文件。这与该属性的文档含义一致,即源文件是用指定语言编写的。但是,这会破坏仅使用该属性来触发指定语言的编译器使用的项目。此行为已恢复,以恢复 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 的限制,这是唯一支持的方法。在 legacy 构建系统下,可以通过在 Xcode 中构建 installpackage 目标来启动这些操作,这仅在 legacy 构建系统下受支持。

  • 在 3.19.0 中为支持 Xcode 的“链接二进制文件至库”构建阶段而引入的框架处理,破坏了在不重新配置的情况下在设备和模拟器构建之间切换的能力。该功能现已恢复。

3.19.6

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

3.19.7