CMake 3.20 发行说明

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

新特性

预设

生成器

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

语言

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

  • nvcc 是符号链接时,例如由于 ccachecolornvcc 包装脚本,CUDA 语言支持现在可以工作。

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

编译器

  • 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” 对象类型,用于描述每种启用语言使用的编译器。

命令

变量

属性

模块

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

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

  • FindBoost 模块获得了一个 Boost_NO_WARN_NEW_VERSIONS 选项,以消除有关新 Boost 版本的未知依赖项的警告。

  • FindCUDAToolkit 模块获得了在 nvcc 是符号链接时查找 CUDA 工具包的支持,例如由于 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 功能现在可以与每个配置的源文件一起使用。

CTest

  • ctest(1) 获得了一个 --test-dir 选项,用于指定在其中查找测试的目录。

CPack

已弃用和移除的特性

其他更改

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

  • 源文件扩展名现在必须是显式的。 有关详细信息,请参阅策略 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 模块一致。

  • -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

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