CMake 3.20 发行说明

从 CMake 3.19 起做出的更改包括以下内容。

新特性

预设

生成器

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

语言

  • 现在可以通过 CXX_STANDARDCUDA_STANDARDOBJCXX_STANDARD 目标属性,或通过 Compile Features 功能的 cxx_std_23 元特性来指定 C++23 编译器模式。

  • CUDA 语言支持现在可以在 nvcc 为符号链接时正常工作,例如,由于 ccachecolornvcc 包装器脚本而导致。

  • CUDAARCHS 环境变量已添加用于初始化 CMAKE_CUDA_ARCHITECTURES。在编译器默认值不适合机器 GPU 的情况下非常有用。

编译器

  • 现在使用编译器 ID NVHPC 来支持 NVIDIA HPC SDK 编译器。

  • 现在使用编译器 ID IntelLLVM 来支持 Intel oneAPI NextGen LLVM 编译器。

    • Linux 上的 icx/icpx C/C++ 编译器和 Windows 上的 icx C/C++ 编译器在 oneAPI 2021.1 起得到完全支持。

    • Linux 上的 ifx Fortran 编译器在 oneAPI 2021.1 起得到支持。

    • Windows 上的 ifx Fortran 编译器尚未得到支持。

    Intel oneAPI Classic 编译器 (icc, icpcifort) 继续获得支持,编译器 ID 为 Intel

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

平台

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

基于文件的 API

  • cmake-file-api(7) 获益于一种新的“工具链”对象类型,其中描述了用于每种已启用语言的编译器。

命令

变量

属性

模块

  • 现在,ExternalData 模块的 ExternalData_Add_Target() 函数包含了一个 SHOW_PROGRESS <bool> 选项,用于控制构建期间是否显示进度输出。

  • ExternalProject 模块 ExternalProject_Add() 函数新增了一个 CONFIGURE_HANDLED_BY_BUILD 选项。当一个外部项目依赖项重新构建时,此选项可用来通过构建步骤触发配置步骤的后续运行,而不必在这种情况下总是重新运行配置步骤。

  • FindBoost 模块新增了一个 Boost_NO_WARN_NEW_VERSIONS 选项,用于屏蔽关于新 Boost 版本的未知依赖项的警告。

  • FindCUDAToolkit 模块新增了在 nvcc 是符号链接(例如由于 ccachecolornvcc 包装脚本)时查找 CUDA 工具包的支持。

  • FindGDAL 模块已得到改进,其缓存变量已记录和标记为高级变量。有一个新的 FindGDAL_SKIP_GDAL_CONFIG 变量,它可以用来跳过基于 gdal-config 的搜索。用户也可以设置 GDAL_ADDITIONAL_LIBRARY_VERSIONS 以向库名称搜索策略添加其他版本。

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

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

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

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

  • UseSWIG 模块增加了针对 MakefileNinja 生成器的功能,以使用 swig 工具来生成隐式依赖项。

自动生成

  • AUTOMOC 功能现在适用于每个配置的源。

CTest

CPack

已弃用和已移除的功能

其他更改

  • 在运行 cmake(1)生成项目构建系统 时,现在使用连字符 (-) 开头的未知命令行参数会报错并拒绝执行。之前,系统会忽略警告。

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

  • LANGUAGE 源文件属性现在强制编译成指定语言。有关详细信息,请参阅策略 CMP0119

  • 在 AIX 上,不再需要重新链接来更改运行时搜索路径,从构建树 RPATH 更改为安装树 RPATH 即可安装 XCOFF 可执行文件和共享库。现在,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 模块一致。

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

3.20.2

  • 英特尔经典版 2021 编译器版本号现在已正确检测到主版本为 2021。CMake 3.20.1 及更低版本不知道英特尔从版本 2021 起对识别宏版本方案所做的更改,并将版本检测为 20.2。

  • 英特尔 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

这些版本对已记录的功能或界面没有做出任何更改。对一些实现进行了更新以支持生态系统更改和/或修复回归问题。