CMake 3.20 发行说明

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

新功能

预设

生成器

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

语言

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

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

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

编译器

  • 现在支持编译器 ID 为“NVHPC”的 NVIDIA HPC SDK 编译器。

  • Intel oneAPI NextGen LLVM 编译器现在支持编译器 ID 为“IntelLLVM”:

    • 从 oneAPI 2021.1 开始,Linux 上的 icx/icpx C/C++ 编译器和 Windows 上的 icx C/C++ 编译器得到完全支持。

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

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

    Intel oneAPI Classic 编译器(iccicpc 和``ifort``)继续支持编译器 ID Intel

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

平台

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

基于文件的 API

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

命令

变量

  • 添加了 CMAKE_<LANG>_BYTE_ORDER 变量以提供从工具链检测到的目标体系结构字节顺序。

  • CMAKE_RUNTIME_OUTPUT_DIRECTORY、CMAKE_LIBRARY_OUTPUT_DIRECTORY 和 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 变量现在支持目标相关的生成器表达式。

特性

  • <LANG>_CLANG_TIDY 目标属性和关联的 CMAKE_<LANG>_CLANG_TIDY 变量学会了支持 OBJCOBJCXX 语言。

  • 为关联的 CMAKE_EXPORT_COMPILE_COMMANDS 变量添加了 EXPORT_COMPILE_COMMANDS 目标属性,以允许配置每个目标的导出编译命令。

  • GENERATED 源文件属性现在在任何目录范围内都是可见的,无论其设置范围如何。请参阅政策:policy:CMP0118

  • 添加了 UNITY_BUILD_UNIQUE_ID 目标属性以支持在统一构建中生成每个源文件唯一的标识符。它可以帮助解决匿名名称空间的重复符号问题。

  • WIN32_EXECUTABLE 目标属性现在适用于 Windows 上的 Clang。

  • 添加了 XCODE_EMBED_FRAMEWORKS 目标属性,以告诉 Xcode 生成器嵌入框架。嵌入的各个方面可以使用 XCODE_EMBED_FRAMEWORKS_PATH <XCODE_EMBED_<type>>`、XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY 和 XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COP 进行自定义Y` 目标属性。

模块

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

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

  • UseJava 模块``add_jar()`` 命令的``GENERATE_NATIVE_HEADERS`` 特性获得了导出生成目标的选项。

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

自动生成器

  • 奥托莫克 特性现在可以与 per-config 源一起使用。

C测试

包装

弃用和删除的功能

其他变化

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

  • 源文件扩展名现在必须是明确的。有关详细信息,请参阅政策:policy:CMP0115

  • LANGUAGE 源文件属性现在强制编译为指定语言。请参阅政策:policy:CMP0119

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

  • 对于类似 MSVC 的编译器,CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` 的值默认不再包含用于运行时类型信息的 /GR 标志。请参阅政策:policy:CMP0117

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

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

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

更新

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

3.20.1

  • CMake 3.20.0 中的:module:FindIntl 模块添加了检查``Intl_HAVE_GETTEXT_BUILTIN``、Intl_HAVE_DCGETTEXT_BUILTIN 和``Intl_IS_BUILTIN``,但它们没有正确实现。这些已被删除并替换为单个“Intl_IS_BUILT_IN”检查,其名称与 FindIconv 模块一致。

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

3.20.2

  • 英特尔经典 2021 编译器版本号现在被正确检测为具有主要版本 2021。CMake 3.20.1 及更低版本不知道英特尔从 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

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