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 变量初始化。

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

语言

  • CMake 学会支持 ISPC 作为可以始终通过 project()enable_language() 启用的一流语言。目前,ISPCMakefile Generators 和在 Linux、macOS 和 Windows 上使用 Intel ISPC 编译器的 Ninja 发生器提供支持。

  • 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 选项。它允许将参数用作程序调用,并且,如果可以找到,它将会将可执行文件解析为完整路径。

  • DIRECTORY 选项 set_property()get_property()get_directory_property() 命令现在接受对二进制目录路径的引用,例如 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() 调用现在将发出弃用诊断。

  • 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

  • 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

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

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

3.19.6

  • 功能不再允许在 CMakePresets.jsonCMakeUserPresets.json 文件中进行注释。由于在 CMake 3.19.0 到 CMake 3.19.5 中的实现错误允许这种情况,因此该错误未记录在文档中。

3.19.7

  • 对于适用于 VS 2017 及更高版本的Visual Studio 生成器字段 version= 现在接受三部分 MSVC 工具集版本,例如 14.28.29910。参见 变量。