CMake 3.29 发布说明

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

新功能

命令行

  • cmake(1) -E cat 现在可以通过传递 - 参数来打印标准输入。

生成器

基于文件的 API

编译器

  • 现在可以使用 Windows 上的 LLVM/Clang 类 GNU 前端 (clang++) 来编译 CUDA 语言源文件。

  • 现在可以使用面向 Windows 上的 GNU ABI (MinGW) 的编译器来编译 Objective C (OBJC) 和 Objective C++ (OBJCXX)。这些编译器包括 GNU 编译器 (gccg++) 以及 LLVM/Clang 类 GNU 前端 (clangclang++)。

  • 现在通过 compiler id TIClang 支持 TI Clang 编译器。

命令

  • add_custom_command(TARGET) 签名现在支持通过 别名目标 添加构建事件。

  • 新增了 cmake_language(EXIT) 子命令,用于以指定退出码终止 cmake -P 脚本。

  • 新增了 export(SETUP) 子命令,用于配置导出集。其 TARGET 选项的 XCFRAMEWORK_LOCATION 设置指定了一个 .xcframework 的位置,该位置可以替换已安装的目标。

  • if() 命令新增了 IS_READABLEIS_WRITABLEIS_EXECUTABLE 测试,用于检查文件或目录权限。

  • try_compile()try_run() 命令新增了 LINKER_LANGUAGE 选项,用于在生成的测试项目中指定 LINKER_LANGUAGE 目标属性。

变量

属性

模块

CTest

  • ctest(1) 新增了 --http-header 选项,用于在提交到 CDash 时添加自定义标头。

  • ctest(1) 新增了 --tests-from-file--exclude-from-file 选项,用于从文件中读取要运行或排除的测试。

  • ctest(1) 在 POSIX 系统上现在支持 作业服务器集成

  • 现在可以不带值地使用 ctest -j 选项,让 ctest 选择默认并行级别,或者使用 0 来让 ctest 使用无限制的并行。如果设置为空字符串,对应的 CTEST_PARALLEL_LEVEL 环境变量现在等同于传递不带值的 -j

  • ctest_test() 命令新增了 INCLUDE_FROM_FILEEXCLUDE_FROM_FILE 选项,用于从文件中读取要运行或排除的测试。

CPack

其他更改

  • CMake 现在可以根据链接器的能力对链接行中的库进行去重。请参见策略 CMP0156

  • add_test() 命令仅在交叉编译时才遵循 CMAKE_CROSSCOMPILING_EMULATOR。请参见策略 CMP0158

  • 在 Windows 上,当针对 MSVC ABI 时,find_library() 命令现在在首先考虑 .lib 文件名之后,可以接受 .a 文件名。这与针对 GNU ABI 的现有行为是对称的,在 GNU ABI 的情况下,该命令在首先考虑 .a 之后接受 .lib 文件名。

  • 在 Windows 上,当针对 MSVC ABI 时,find_library() 命令现在在考虑 .lib 之前,会考虑 .dll.lib 文件名。这是 Rust 工具链为 MSVC ABI 创建的 DLL 导入库的默认后缀。

  • 当使用 IntelLLVM (2021.4 及以上版本) 时,NinjaNMake Makefiles 生成器现在在系统包含中使用 -external:I 标志。从 2022.2 版本开始,还使用了 -external:W0 标志。

  • create_test_sourcelist() 命令现在为生成的驱动程序源文件提供完整路径。

  • CPACK_PRODUCTBUILD_DOMAINS 变量现在默认为 true。请参见策略 CMP0161

更新

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

3.29.1

3.29.2, 3.29.3, 3.29.4

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

3.29.5

  • CPack WIX Generator 中于 3.29 版本新增的 CPACK_WIX_INSTALL_SCOPE 变量现在默认为 NONE。这恢复了与 3.28 及以下版本的兼容性:在没有自定义 WiX 模板的情况下,即使安装程序会为所有用户安装,但仅为当前用户创建开始菜单和卸载条目。

    在 3.29.0 至 3.29.4 版本中,CPACK_WIX_INSTALL_SCOPE 默认为 perMachine。这会创建默认情况下为所有用户创建开始菜单和卸载条目的 MSI 安装程序。虽然此行为本身更好,但这些安装程序无法与 3.28 及以下版本生成的 MSI 安装程序创建的现有安装进行干净替换。3.29.5 版本为了兼容性将默认值恢复。项目可以自行安排过渡到 perMachine,方法是设置 CPACK_WIX_INSTALL_SCOPE

3.29.6, 3.29.7, 3.29.8, 3.29.9

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