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 目标属性支持 generator expressions

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

  • 已添加 SYSTEM 目标属性,用于指定目标是否应被视为系统库(即,其 include 目录在编译使用者时自动 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 提交哈希)。

  • 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

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

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

3.25.3

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