CMake 3.20 发布说明

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

新功能

Presets

生成器

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

Languages

编译器

  • 现在通过编译器 ID NVHPC 支持 NVIDIA HPC SDK 编译器。

  • 现在通过编译器 ID IntelLLVM 支持 Intel oneAPI NextGen LLVM 编译器。

    • Linux 上的 icx/icpx C/C++ 编译器,以及 Windows 上的 icx C/C++ 编译器,从 oneAPI 2021.1 开始全面支持。

    • 从 oneAPI 2021.1 开始支持 Linux 上的 ifx Fortran 编译器。

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

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

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

Platforms

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

File-Based API

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

命令

变量

属性

模块

  • 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 模块学会了支持版本范围。

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

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

  • UseSWIG 模块为 MakefileNinja 生成器增加了使用 swig 工具生成隐式依赖的能力。

Autogen

  • AUTOMOC 功能现在可以与 per-config 源一起使用。

CTest

CPack

弃用和移除的功能

其他更改

  • 运行 cmake(1)Generate a Project Buildsystem 时,以连字符(-)开头的未知命令行参数现在会被拒绝并报错。之前它们会被静默忽略。

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

  • LANGUAGE 源文件属性现在强制按指定语言编译。请参见策略 CMP0119

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

  • 对于类 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 模块一致。

  • 所有 Apple 平台(不仅仅是 macOS)现在都指定支持 -rpath 链接器标志。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

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