CMake 3.19 发行说明

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

新功能

预设

  • cmake(1)cmake-gui(1) 现在可以识别 CMakePresets.jsonCMakeUserPresets.json 文件(参见:manual:cmake-presets(7 )).

生成器

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

  • Xcode 生成器通过 Link Binaries With Libraries 构建阶段获得了对链接库和框架的支持,而不是总是通过直接嵌入链接器标志。此行为由新的 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 编译器的 Linux、macOS 和 Windows 上的 Makefile Generators 和 Ninja 生成器目前支持 ISPC

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

  • CUDA 语言支持现在适用于 QNX。

平台

基于文件的 API

  • cmake-file-api(7) "codemodel" version 2 version 字段已更新为 2.2。

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

命令行

  • cmake(1) 命令行工具的 --install 模式获得了 --default-directory-permissions 选项。

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

图形用户界面

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

命令

  • add_test() 命令现在(正式)支持其创建的测试名称中的空格和其他特殊字符。请参阅政策:policy: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 解析功能。

变量

特性

模块

  • 添加了 CheckCompilerFlag 模块以将 CheckCCompilerFlag 和 CheckCXXCompilerFlag 推广到更多语言。它还支持 CUDAISPC 语言。

  • CheckLinkerFlag 模块现在支持 CUDA 语言。

  • 添加了 CheckSourceCompiles 模块以将 CheckCSourceCompiles 和 CheckCXXSourceCompiles 推广到更多语言。它还支持 CUDAISPC 语言。

  • 添加了 CheckSourceRuns 模块以将 CheckCSourceRuns 和 CheckCXXSourceRuns 推广到更多语言。它还支持 CUDA 语言。

  • CMakePackageConfigHelpers 模块获得了对版本范围的支持。

  • FindCUDAToolkit 模块支持查找不包含 nvcc 的 CUDA 工具包,以及在交叉编译时查找分散的工具包安装。

  • FindPackageHandleStandardArgs 模块学会了处理版本范围。它还获得了 find_package_check_version() 命令来根据 find_package() 命令的版本相关参数检查版本的有效性。

  • FindPython3、FindPython2 和 FindPython 模块获得了处理版本范围的能力。

  • FindPython3、FindPython2 和 FindPython 模块分别提供链接选项的变量 Python3_LINK_OPTIONS、Python2_LINK_OPTIONS 和 Python_LINK_OPTIONS。

  • FindSDL 模块现在提供:

    • 导入的目标“SDL::SDL”。

    • 结果变量“SDL_LIBRARIES”和“SDL_INCLUDE_DIRS”。

    • 版本变量“SDL_VERSION”、“SDL_VERSION_MAJOR”、“SDL_VERSION_MINOR”和“SDL_VERSION_PATCH”。

  • FindSWIG 模块获得了处理版本范围的能力。

  • FindTIFF 模块获得了一个 CXX 组件来查找包含 C++ 绑定的 tiffxx 库。

  • FindVulkan 模块现在提供了一个``Vulkan::glslc`` 导入目标和关联的``Vulkan_GLSLC_EXECUTABLE`` 变量,其中包含 GLSL SPIR-V 编译器的路径。

  • UseSWIG 模块获得了对新源文件属性“OUTPUT_DIR”和“OUTFILE_DIR”的支持,以在每个源的基础上管理输出目录。

C测试

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

包装

其他

弃用和删除的功能

  • 与 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 以来,该选项无法正常工作。

文档

添加了以下指南:

  • IDE 集成指南

  • 导入和导出指南

其他变化

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

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

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

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

  • 如果使用位置,则导入的目标缺少其位置属性会在生成过程中失败。请参阅政策:policy:CMP0111

  • 以下查询目录或文件名组件的基于目标的生成器表达式不再添加对评估目标的依赖性。请参阅政策:policy: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 生成器 不再重复来自目标依赖项的自定义命令。请参阅政策:policy:CMP0113

  • 步骤目标依赖项的 ExternalProject 模块处理已被修改。请参阅政策:policy: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 及以下版本的行为。

  • 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

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

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

    • 命名模式“cmake-$ver-macos-universal”是具有“x86_64”和“arm64”架构的通用二进制文件。它需要 macOS 10.13 或更高版本。

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

3.19.4

  • 3.19.0 中引入的 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM 变量以前仅适用于 Visual Studio 14 2015 生成器。它现在已被修复,可以与 Visual Studio 生成器 一起用于更高版本的 VS。

3.19.5

  • 当启用:prop_tgt:IOS_INSTALL_COMBINED 并使用:generator:Xcode 生成器时,现在可以通过从命令行。使用 Xcode 新构建系统时,由于 Xcode 的限制,这些是唯一受支持的方法。只有在使用旧版构建系统时才支持通过在 Xcode 中构建“install”或“package”目标来启动这些操作。

  • 作为支持 Xcode 的 Link Binaries With Libraries 构建阶段的一部分,3.19.0 中引入的框架处理打破了无需重新配置即可在设备和模拟器构建之间切换的能力。该功能现已恢复。

3.19.6

  • cmake-presets(7) 功能不再允许在 CMakePresets.jsonCMakeUserPresets.json 文件中进行评论。这是 CMake 3.19.0 到 CMake 3.19.5 中的实现错误地允许的,并且没有记录。

3.19.7

  • 对于 VS 2017 及更高版本的 Visual Studio Generators,CMAKE_GENERATOR_TOOLSET 字段 version= 现在接受三组件 MSVC 工具集版本,例如 14.28.29910。请参阅 CMAKE_VS_PLATFORM_TOOLSET_VERSION 变量。