CMake 3.25 发行说明

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

新特性

预设

语言

命令行

编译器

命令

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

  • 添加了 block()endblock() 命令,用于管理包含命令块的特定作用域(策略或变量)。

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

  • find_file()find_path()find_library()find_program() 命令新增了 VALIDATOR 选项,用于指定为每个候选项目调用的函数以对其进行验证。

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

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

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

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

  • try_run() 命令新增了 RUN_OUTPUT_STDOUT_VARIABLERUN_OUTPUT_STDERR_VARIABLE 选项,用于从已编译程序的输出中分别捕获 stdout 和 stderr。

变量

属性

  • <LANG>_COMPILER_LAUNCHER 目标属性现在支持 生成器表达式

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

  • 添加了 SYSTEM 目标属性,用于指定是否应将目标视为系统库(即,其包含目录在编译使用者时自动为 SYSTEM)。如果未设置,则默认行为与之前相同:对于导入目标为 on,对于其他目标为 off。

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

模块

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

  • FindCUDAToolkit 模块现在为 CUDA 10.0+ 提供了 nvtx3 的目标,它取代了 nvToolsExt。如果项目需要 CMake 3.25 并且使用 CUDA 10.0+,则在使用 nvToolsExt 时会发出弃用警告。

  • FindDoxygen 模块的版本处理已得到改进

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

    • 支持版本范围。

    • 现在可以容忍 Doxygen 报告的版本格式的变化(例如,尾随 git 提交哈希)。

  • FindOpenAL 模块现在提供导入的目标。

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

  • FindVulkan 模块获得了对新组件的支持

    dxc

    DirectX Shader Compiler。

    volk

    Volk 开源 vulkan 元加载器。

CPack

已弃用和移除的特性

其他更改

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

  • 如果 <LANG>_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

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

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

3.25.3

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