CMake 3.30 发行说明

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

新功能

Presets

  • cmake-presets(7) 文件现已支持 9 模式版本。 include 字段现在会展开除 $env{} 和特定于 preset 的宏(即源自 preset 定义字段的宏)之外的所有宏。

基于文件的 API

  • CMake 文件 API cmake-file-api(7) 的 "cmakeFiles" 版本 1 对象中的 version 字段已更新为 1.1。它增加了一个 globsDependent 字段,用于报告使用 CONFIGURE_DEPENDSfile(GLOB) 调用。

Generators

  • Visual Studio Generators 现在会向 .vcxproj 文件添加 UseDebugLibraries 指示符,以表示哪些配置是调试配置。请参阅策略 CMP0162

Languages

  • Compile Features 功能现在实现了对 cxx_std_26cuda_std_26 元特征的支持,以指示编译器模式必须至少为 C++26。这些元特征最早由 CMake 3.25 文档化,但尚未完全实现。

命令

  • 在不支持共享库的平台上,add_library() 命令现在会拒绝创建共享库,而不是自动将其转换为静态库。请参阅策略 CMP0164

  • enable_language() 命令现在在首次调用 project() 调用之前调用时会报错。请参阅策略 CMP0165

  • file(DOWNLOAD)file(UPLOAD) 命令增加了 TLS_VERSION <min> 选项,用于指定连接到 https:// URL 的最低 TLS 版本。

变量

属性

模块

  • ExternalProject 模块的 ExternalProject_Add() 命令增加了 TLS_VERSION <min> 选项,并支持 CMAKE_TLS_VERSION 变量和 CMAKE_TLS_VERSION 环境变量,用于指定连接到 https:// URL 的最低 TLS 版本。

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

  • FindBLASFindLAPACK 模块增加了对 libblastrampoline 的支持。

  • FindCUDAToolkit 模块现在提供了一个用于 libnvfatbinlibnvfatbin_static 的目标(如果找到)。

  • FindCUDAToolkit 模块现在会搜索 CMAKE_CUDA_COMPILER 变量和 CUDACXX 环境变量,即使 CUDA 语言未启用。

  • FindOpenMP 模块增加了 OpenMP_RUNTIME_MSVC 选项,用于控制与 MSVC 一起使用的 OpenMP 运行时。

  • FindPythonFindPython3 模块增加了对无锁线程 Python 版本的支持。

  • 在 Windows 上,FindPythonFindPython2FindPython3 模块现在为 Python 调试版本提供了更好的支持。

    • 新变量

      • Python_EXECUTABLE_DEBUG

      • Python_INTERPRETER

      • Python_DEBUG_POSTFIX

    • 新目标

      • Python::InterpreterDebug

      • Python::InterpreterMultiConfig

    python_add_library() 命令现在根据 Python_DEBUG_POSTFIX 变量的值来管理 DEBUG_POSTFIX 目标属性。

生成器表达式

CTest

CPack

弃用和移除的功能

其他更改

  • ctest(1) 现在会拒绝未知的命令行参数并报错。以前这些参数会被静默忽略。

  • cmake.org 上提供的预编译 Windows .msi 安装程序,在执行全新安装时,默认会修改系统范围的 PATH。当替换现有 3.30 或更高版本的安装时,默认会保留 PATH 修改的偏好设置。

  • cmake.org 上提供的官方 .zip 源存档现在使用 LF 换行符,而不是 CRLF 换行符,以符合现代惯例。

  • 在“配置完成”和“生成完成”消息之后打印的持续时间现在反映了在生成器特定步骤以及之前未捕获的生成开始时的代码模型评估步骤中花费的时间。打印的持续时间可能比 CMake 以前的版本更长,但更准确。

  • FetchContent 现在更倾向于直接填充内容,而不是使用单独的子构建。这可以显著提高某些系统(尤其是 Windows,以及使用 Xcode 生成器时的 macOS)上的配置时间。 cmake --fresh 还会强制重新执行直接填充依赖项的下载、更新和修补步骤。策略 CMP0168 为仍依赖于使用子构建进行内容填充的项目提供了向后兼容性。

  • FETCHCONTENT_FULLY_DISCONNECTED 设置为 true 时,FetchContent_MakeAvailable() 和单参数形式的 FetchContent_Populate() 要求依赖项的源目录已填充。CMake 3.29 及更早版本不检查此要求,但现在强制执行,受策略 CMP0170 的约束。

更新

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

3.30.1, 3.30.2

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

3.30.3

3.30.4

  • project(<PROJECT-NAME>) 命令仅当 <PROJECT-NAME>_SOURCE_DIR<PROJECT-NAME>_BINARY_DIR<PROJECT-NAME>_IS_TOP_LEVEL 在调用 project() 时已设置为缓存或非缓存变量时,才将它们设置为普通变量。同名的缓存条目始终按原样设置。这改进了 3.30.3 的行为更改,以恢复嵌套目录调用具有相同项目名称的 project() 的行为,但此版本中的实现存在缺陷(此发行说明已追溯更新)。这可能导致首次运行和后续运行之间的行为不同。如果您的项目包含具有相同项目名称的嵌套 project() 调用并且您使用了这些变量,请不要使用 CMake 3.30.4。

3.30.5

3.30.6, 3.30.7, 3.30.8, 3.30.9

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