CMake 3.30 发行说明

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

新特性

预设

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

基于文件的 API

  • cmake-file-api(7) “cmakeFiles” 版本 1 对象的 version 字段已更新至 1.1。它新增了一个 globsDependent 字段,用于报告使用 CONFIGURE_DEPENDSfile(GLOB) 调用。

生成器

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

语言

  • 编译特性 功能现在实现了对 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 版本。

变量

属性

模块

生成器表达式

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() 被调用时,<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

3.30.6, 3.30.7, 3.30.8

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