CMake 3.20 发行说明

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

新功能

预设

生成器

  • Makefile 生成器,对于某些工具链,现在在编译源文件时使用编译器提取隐式依赖项。

语言

编译器

  • 现在支持 NVIDIA HPC SDK 编译器,编译器 ID 为 NVHPC

  • 现在支持 Intel oneAPI NextGen LLVM 编译器,编译器 ID 为 IntelLLVM

    • Linux 上的 icx/icpx C/C++ 编译器,以及 Windows 上的 icx C/C++ 编译器,自 oneAPI 2021.1 起完全支持。

    • Linux 上的 ifx Fortran 编译器自 oneAPI 2021.1 起支持。

    • Windows 上的 ifx Fortran 编译器尚不支持。

    Intel oneAPI Classic 编译器(iccicpcifort)继续以编译器 ID Intel 支持。

  • 增加了对 IAR STM8 编译器的支持。

平台

  • CMake 对 Android 交叉编译 的支持现已与 Android NDK 的工具链文件合并。它们现在具有类似的行为,尽管某些变量名称不同。面向用户的更改包括

基于文件的 API

  • cmake-file-api(7) 增加了一个新的 "toolchains" 对象类型,该类型描述了为每种启用的语言使用的编译器。

命令

  • add_custom_command()add_custom_target() 现在在其 OUTPUTBYPRODUCTS 选项中支持 生成器表达式

    它们的 COMMANDWORKING_DIRECTORYDEPENDS 选项增加了对新的生成器表达式 $<COMMAND_CONFIG:...>$<OUTPUT_CONFIG:...> 的支持,这些表达式在与 Ninja Multi-Config 生成器一起使用时,可以控制跨配置处理。

  • add_custom_command() 命令在 Makefile 生成器 上增加了 DEPFILE 支持。

  • add_library() 命令之前在使用可能的多架构配置时禁止了导入的对象库。这主要影响了 Xcode 生成器,例如在针对 iOS 或其他设备平台时。此限制现已解除。

  • 添加了 cmake_path() 命令用于对文件系统路径进行操作。

  • configure_file() 命令增加了 USE_SOURCE_PERMISSIONSFILE_PERMISSIONS 选项,以分别支持复制源文件权限和使用指定权限。

  • file(GENERATE) 命令增加了 NEWLINE_STYLE 选项,用于指定生成文件的换行符处理方式。

  • file(GENERATE) 命令增加了 NO_SOURCE_PERMISSIONSUSE_SOURCE_PERMISSIONSFILE_PERMISSIONS 选项,用于控制生成文件的权限。

  • install(FILES) 命令的 RENAME 选项学会了支持 生成器表达式

  • target_include_directories() 命令增加了一个新选项 AFTER

  • target_sources() 命令现在支持由 add_custom_target() 命令创建的目标。

  • try_run() 命令增加了一个 WORKING_DIRECTORY 选项,用于设置运行编译的检查可执行文件的当前工作目录。

变量

属性

模块

  • ExternalData 模块的 ExternalData_Add_Target() 函数增加了 SHOW_PROGRESS <bool> 选项,用于控制在构建过程中是否显示进度输出。

  • ExternalProject 模块的 ExternalProject_Add() 函数增加了 CONFIGURE_HANDLED_BY_BUILD 选项。这可以用于使配置步骤的后续运行在外部项目依赖重新构建时由构建步骤触发,而不是在这些情况下始终重新运行配置步骤。

  • FindBoost 模块增加了 Boost_NO_WARN_NEW_VERSIONS 选项,用于静默关于新 Boost 版本未知依赖项的警告。

  • FindCUDAToolkit 模块增加了对查找 CUDA 工具包的支持,当 nvcc 是符号链接时,例如由于 ccachecolornvcc 包装脚本。

  • FindGDAL 模块已得到改进,文档记录了其缓存变量并将其标记为高级。新增了 FindGDAL_SKIP_GDAL_CONFIG 变量,可用于跳过基于 gdal-config 的搜索。用户还可以设置 GDAL_ADDITIONAL_LIBRARY_VERSIONS 来为库名搜索策略添加其他版本。

  • FindIntl 模块现在提供了一个导入的目标。

  • FindOpenSSL 模块学会了支持版本范围。

  • FindPython3、FindPython2 和 FindPython 模块增加了控制如何搜索未版本化解释器名称的选项。

  • UseJava 模块 add_jar() 命令的 GENERATE_NATIVE_HEADERS 功能增加了导出生成目标的选项。

  • UseSWIG 模块获得了能力,对于 MakefileNinja 生成器,可以使用 swig 工具生成隐式依赖项。

Autogen

  • AUTOMOC 功能现在可以与每配置源一起工作。

CTest

CPack

弃用和移除的功能

其他更改

  • 在运行 cmake(1) 生成项目构建系统 时,以连字符(-)开头的未知命令行参数现在会因错误而被拒绝。以前它们会被静默忽略。

  • 源文件扩展名现在必须显式。有关详细信息,请参阅策略 CMP0115

  • LANGUAGE 源文件属性现在强制以指定语言进行编译。请参阅策略 CMP0119

  • 在 AIX 上,安装 XCOFF 可执行文件和共享库不再需要重新链接以将构建树 RPATH 的运行时搜索路径更改为安装树 RPATH。CMake 现在像在 ELF 平台上一贯做的那样,在安装期间直接编辑 XCOFF 二进制文件。

  • 对于类 MSVC 编译器,CMAKE_CXX_FLAGS 的值默认不再包含用于运行时类型信息的 /GR 标志。请参阅策略 CMP0117

  • Ninja 生成器现在会转换 add_custom_command() 生成的 DEPFILE。有关详细信息,请参阅策略 CMP0116

  • cmake.org 上提供的 Linux 预编译二进制文件的命名模式已更改为 cmake-$ver-linux-$arch,其中 $archx86_64aarch64

  • cmake.org 上提供的 Windows 预编译二进制文件的命名模式已更改为 cmake-$ver-windows-$arch,其中 $archx86_64i386

更新

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

3.20.1

  • CMake 3.20.0 中的 FindIntl 模块添加了 Intl_HAVE_GETTEXT_BUILTINIntl_HAVE_DCGETTEXT_BUILTINIntl_IS_BUILTIN 检查,但它们没有正确实现。已将其移除,并替换为单个 Intl_IS_BUILT_IN 检查,其名称与 FindIconv 模块一致。

  • 现在将 -rpath 链接器标志指定为在所有 Apple 平台上支持,而不仅仅是 macOS。用于 iOS、tvOS 和 watchOS 的 install_name_dir 现在应该默认为 @rpath,而不是使用完整的绝对路径并在库或框架嵌入到应用程序包中时在运行时失败(请参阅 XCODE_EMBED_<type>)。

3.20.2

  • 现在可以正确检测到 Intel Classic 2021 编译器版本号,其主版本为 2021。CMake 3.20.1 及更早版本不了解 Intel 从 2021 版本开始的标识宏版本方案的更改,并将版本检测为 20.2。

  • Intel oneAPI Fortran 编译器现在标识为 IntelLLVM。oneAPI 2021.1 Fortran 编译器缺少一个标识宏,因此 CMake 3.20.1 及更早版本将其标识为 Intel。CMake 现在有一个特殊情况来识别 oneAPI 2021.1 Fortran 为 IntelLLVM。oneAPI 2021.2 Fortran 编译器定义了正确的标识宏,因此所有 CMake 3.20 版本都将其标识为 IntelLLVM

3.20.3, 3.20.4, 3.20.5, 3.20.6

这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。