CMake 3.25 发布说明

自 CMake 3.24 起进行的更改包括:

新功能

预设

语言

  • 现在可以通过 CXX_STANDARDCUDA_STANDARDHIP_STANDARDOBJCXX_STANDARD 目标属性来指定 C++26 编译器模式。

  • 使用 `nvcc` 时,`CUDA` 语言支持现已包含设备链接时优化。`CMAKE_INTERPROCEDURAL_OPTIMIZATION` 变量和相关的 `INTERPROCEDURAL_OPTIMIZATION` 目标属性将激活设备 LTO。

命令行

  • 添加了 `cmake --workflow --preset` 模式,以通过单个命令驱动配置、构建、测试和打包操作序列。

  • `cmake -E capabilities` 命令新增了 `tls` 字段,用于指示 TLS 是否已启用。

  • `cmake -E env` 命令行工具新增了 `--modify` 标志,以支持 `ENVIRONMENT_MODIFICATION` 操作。

  • `cmake --debug-trycompile` 选项现在会打印日志消息,报告每次 try-compile 检查的执行目录。

编译器

  • 增加了对 Tasking 编译器工具集(SmartCode, TriCore, Standalone: ARM, MCS, 8051)的支持,编译器 ID 为 `Tasking`。请参见 `CMAKE_TASKING_TOOLSET` 变量。

命令

  • `add_subdirectory()` 命令新增了 `SYSTEM` 选项,用于在子目录中启用 `SYSTEM` 目录属性。

  • 添加了 `block()` 和 `endblock()` 命令,用于管理特定范围(策略或变量)的命令块。

  • `cmake_language()` 命令新增了 `GET_MESSAGE_LOG_LEVEL` 子命令,可用于查询当前消息日志级别。

  • `find_file()`、`find_path()`、`find_library()` 和 `find_program()` 命令新增了 `VALIDATOR` 选项,用于指定一个函数,该函数将针对每个候选项进行调用以验证它。

  • `find_package()` 命令在搜索包配置文件时,现在会考虑 `/*/(cmake|CMake)/*/` 形式的路径。

  • `return()` 命令新增了 `PROPAGATE` 选项,用于将变量传播到控制返回的作用域。请参见策略 `CMP0140`。

  • `try_compile()` 和 `try_run()` 命令新增了新的签名,这些签名更一致地使用关键字分派,并且不需要指定二进制目录。此外,这些签名为每次调用使用一个唯一的目录,这使得在使用 `cmake --debug-trycompile` 时可以保留多个输出。

  • `try_compile()` 和 `try_run()` 命令新增了 `NO_CACHE` 选项,用于将结果存储在普通变量中。

  • `try_run()` 命令新增了 `RUN_OUTPUT_STDOUT_VARIABLE` 和 `RUN_OUTPUT_STDERR_VARIABLE` 选项,用于将 stdout 和 stderr 与编译程序的输出分开捕获。

变量

  • 当目标或主机系统是 BSD 时,`BSD` 和 `CMAKE_HOST_BSD` 变量现在被设置为一个字符串值。

  • 当目标或主机系统是 Linux 时,`LINUX` 和 `CMAKE_HOST_LINUX` 变量现在被设置为 true。

  • 引入了 `CMAKE_MSVC_DEBUG_INFORMATION_FORMAT` 变量和 `MSVC_DEBUG_INFORMATION_FORMAT` 目标属性,用于为针对 MSVC ABI 的编译器选择调试信息格式。请参见策略 `CMP0141`。

  • 添加了 `CMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION` 变量和相应的 `XCODE_SCHEME_ENABLE_GPU_API_VALIDATION` 目标属性,用于告知 Xcode 生成器在方案中设置 `Metal: API Validation`。

  • 添加了 `CMAKE_XCODE_SCHEME_ENABLE_GPU_SHADER_VALIDATION` 变量和相应的 `XCODE_SCHEME_ENABLE_GPU_SHADER_VALIDATION` 目标属性,用于告知 Xcode 生成器在方案中设置 `Metal: Shader Validation`。

  • 添加了 `CMAKE_XCODE_SCHEME_LAUNCH_MODE` 变量和相应的 `XCODE_SCHEME_LAUNCH_MODE` 目标属性,用于告知 Xcode 生成器在方案的“Launch”模式设置中放入什么。

  • 添加了 `CMAKE_XCODE_SCHEME_LAUNCH_CONFIGURATION` 变量和相应的 `XCODE_SCHEME_LAUNCH_CONFIGURATION` 目标属性,用于告知 Xcode 生成器在方案的 Launch 操作中放入什么配置。

属性

  • `_COMPILER_LAUNCHER` 目标属性现在支持“生成器表达式”。

  • 添加了 `EXPORT_NO_SYSTEM` 目标属性,用于指定 `install(EXPORT)` 和 `export()` 命令将生成一个 `SYSTEM` 属性为 `OFF` 的导入目标。

  • 添加了 `SYSTEM` 目标属性,用于指定一个目标是否应被视为系统库(即,其包含目录在编译消费者时自动为 `SYSTEM`)。如果未设置,则默认行为是:导入目标为 `ON`,其他目标为 `OFF`。

  • 添加了 `SYSTEM` 目录属性,用于初始化该目录中创建的目标的 `SYSTEM` 目标属性。

模块

  • `FetchContent` 模块的 `FetchContent_Declare()` 命令新增了 `SYSTEM` 选项,该选项为 `FetchContent_MakeAvailable()` 创建的子目录设置 `SYSTEM` 目录属性。

  • `FindCUDAToolkit` 模块现在为 CUDA 10.0+ 的 `nvtx3` 提供了一个目标,该目标取代了 `nvToolsExt`。当使用 `nvToolsExt` 且项目要求 CMake 3.25 和 CUDA 10.0+ 时,会发出弃用警告。

  • 改进了 `FindDoxygen` 模块的版本处理。

    • 如果需要,现在将考虑多个候选安装来满足版本约束。以前,只考虑遇到的第一个。

    • 支持版本范围。

    • 现在能够容忍 Doxygen 报告的版本格式的差异(例如,末尾的 git commit hash)。

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

  • 添加了 `FindOpenSP` 模块,用于查找 OpenSP 库。

  • `FindVulkan` 模块增加了对新组件的支持。

    dxc

    DirectX Shader Compiler。

    volk

    Volk 开源 Vulkan 元加载器。

CPack

  • `CPack Archive Generator` 新增了 `CPACK_ARCHIVE_FILE_EXTENSION` 变量,用于控制包文件名扩展。

  • `CPack NSIS Generator` 新增了两个变量 `CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS` 和 `CPACK_NSIS_EXECUTABLE_POST_ARGUMENTS`,用于在调用 nsis 可执行文件时提供参数。

  • `CPack` 模块新增了 `CPACK_READELF_EXECUTABLE`、`CPACK_OBJCOPY_EXECUTABLE` 和 `CPACK_OBJDUMP_EXECUTABLE` 变量,用于控制 cpack(1) 使用的 binutils 的位置。

已弃用和已删除的功能

  • `IMPORTED_NO_SYSTEM` 目标属性已被弃用,建议使用 `SYSTEM` 和 `EXPORT_NO_SYSTEM`。

  • 已移除 `Visual Studio 10 2010` 生成器。

  • `Visual Studio 11 2012` 生成器现已弃用,将在 CMake 未来版本中移除。

其他更改

  • 现在可以使用 `SSL_CERT_FILE` 和 `SSL_CERT_DIR` 环境变量来覆盖 TLS/SSL 操作的证书颁发机构查找位置。

  • 如果 `_CLANG_TIDY` 包含 `-p` 参数,则不再将完整的编译器命令行追加到 `--` 之后。

  • Xcode 生成器不再向库搜索路径添加每个配置的后缀 `$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)`。请参见策略 `CMP0142`。

更新

自 CMake 3.25.0 起进行的更改包括:

3.25.1

  • 在 Windows 上,当针对 MSVC ABI 时,`find_library()` 命令不再接受 `.a` 文件名。此行为在 CMake 3.25.0 中添加,但已被撤销,因为在某些情况下会找到之前未找到的 GNU-ABI 库。

3.25.2

  • CUDA 语言级别 20(对应 C++20)现在支持 NVCC 12.0 及以上版本。

  • 在 Windows 上,Intel oneAPI 2023.0 及以上版本提供的 `icpx` 编译器不再被选中,因为其类 GNU 的命令行尚未被 CMake 支持。

3.25.3

  • 此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。