CMake 3.30 版本说明

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

新功能

预设

  • cmake-presets(7) 文件现在支持模式版本 9include 字段现在扩展所有宏,除了 $env{} 和预设特定的宏,即那些从预设定义中的字段派生的宏。

基于文件 API

  • 基于文件的 API (cmakeFiles) 版本 1 对象的 version 字段已更新至 1.1。它获得了一个 globsDependent 字段来报告 file(GLOB) 使用 CONFIGURE_DEPENDS 的调用。

生成器

  • Visual Studio 生成器 现在将 UseDebugLibraries 指示符添加到 .vcxproj 文件中以指示哪些配置是调试配置。请参阅策略 CMP0162.

语言

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

命令

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

  • 如果在第一个 project() 调用之前调用 enable_language() 命令,现在会引发错误。请参阅策略 CMP0165.

  • file(DOWNLOAD)file(UPLOAD) 命令获得了一个 TLS_VERSION <min> 选项,用于指定与 https:// URL 连接的最小 TLS 版本。

变量

属性

模块

生成器表达式

CTest

CPack

弃用和已移除的功能

其他更改

  • 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(<PROJECT-NAME>) 命令现在仅在 <PROJECT-NAME>_SOURCE_DIR<PROJECT-NAME>_BINARY_DIR<PROJECT-NAME>_IS_TOP_LEVEL 已经作为缓存变量或非缓存变量设置的情况下,才将它们设置为普通变量。同名缓存条目始终如以前一样设置。这细化了 3.30.3 的行为更改,以恢复嵌套目录调用 project() 并使用相同项目名称的行为,但此版本的实现存在缺陷(此版本说明已追溯更新)。它会导致第一次运行和后续运行之间的行为不同。如果您的项目包含嵌套调用 project() 且使用相同项目名称,并且您使用这些变量,请勿使用 CMake 3.30.4。

3.30.5