CMake 3.25 发布说明¶
自 CMake 3.24 起进行的更改包括:
新功能¶
预设¶
已将
cmake-presets(7)
模式版本升级至6
。cmake-presets(7)
格式现在支持packagePresets
字段,用于为cpack --preset
指定模式。cmake-presets(7)
格式现在支持workflowPresets
字段,用于为cmake --workflow
指定模式。cmake-presets(7)
格式现在支持outputJUnitFile
字段,用于在测试模式中指定 JUnit 输出。
语言¶
现在可以通过
CXX_STANDARD
、CUDA_STANDARD
、HIP_STANDARD
或OBJCXX_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¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。