CMake 3.29 发布说明

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

新功能

命令行

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

生成器

基于文件的 API

  • 基于文件的 API 的 "codemodel" 版本 2 的 version 字段已更新至 2.7。cmake-file-api(7)

  • 基于文件的 API 的 "codemodel" 版本 2 的 "target" 对象增加了 "launchers" 字段。cmake-file-api(7)

编译器

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

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

  • 现在支持 TI Clang 基于编译器的 compiler id TIClang

命令

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

  • 添加了 cmake_language(EXIT) 子命令以终止 cmake -P 脚本,并指定退出码。

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

  • if() 命令增加了新的测试 IS_READABLEIS_WRITABLEIS_EXECUTABLE 来检查文件或目录权限。if()

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

变量

属性

模块

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 选项,用于运行或排除文件中命名的测试。ctest_test()

CPack

其他更改

  • CMake 已学会根据链接器功能对链接行上的库进行去重。参见策略 CMP0156

  • 在跨平台编译时,add_test() 命令现在只尊重 CMAKE_CROSSCOMPILING_EMULATOR。参见策略 CMP0158add_test()

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

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

  • 当使用 IntelLLVM(版本 2021.4 及以上)时,NinjaNMake Makefiles 生成器现在对系统 include 使用 -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 GeneratorCPACK_WIX_INSTALL_SCOPE 变量(在 3.29 中新增)现在默认为 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

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