CMake 3.25 发行说明

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

新功能

预设

语言

  • Compile Features 功能现在可以识别 C++26,并定义了``cxx_std_26`` 元特征。 C++26 编译器模式也可以通过 CXX_STANDARD、CUDA_STANDARD、HIP_STANDARD 或 OBJCXX_STANDARD 目标属性指定。

  • CUDA 语言支持现在包括使用 nvcc 时的设备链接时间优化。 CMAKE_INTERPROCEDURAL_OPTIMIZATION 变量和关联的 INTERPROCEDURAL_OPTIMIZATION 目标属性将激活设备 LTO。

命令行

编译器

  • 添加了对 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() 命令现在在搜索包配置文件时考虑格式为``<prefix>/<name>*/(cmake|CMake)/<name>*/`` 的路径。

  • return() 命令获得了一个 PROPAGATE 选项,可以将变量传播到控制返回的范围。请参阅政策:policy:CMP0140

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

  • try_compile()try_run() 命令获得了选项 NO_CACHE 以将结果存储在普通变量中。

  • try_run() 命令获得了``RUN_OUTPUT_STDOUT_VARIABLE`` 和``RUN_OUTPUT_STDERR_VARIABLE`` 选项以从编译程序的输出中分别捕获标准输出和标准错误。

变量

特性

  • <LANG>_COMPILER_LAUNCHER 目标属性现在支持 generator expressions

  • 添加了 EXPORT_NO_SYSTEM 目标属性以指定:command:install(EXPORT)export() 命令将生成具有 SYSTEM 属性 OFF 的导入目标。

  • 添加了 SYSTEM 目标属性以指定目标是否应被视为系统库(即,其包含目录在编译消费者时自动为 SYSTEM)。如果未设置,则默认为以前的行为:对导入的目标打开,对其他目标关闭。

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

模块

  • FetchContent 模块的 FetchContent_Declare() 命令获得了一个 SYSTEM 选项,它在 FetchContent_MakeAvailable() 创建的子目录上设置 SYSTEM 目录属性。

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

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

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

    • 支持版本范围。

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

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

  • 添加了 FindOpenSP 模块以查找 OpenSP 库。

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

    dxc

    DirectX 着色器编译器。

    大众

    Volk 开源 vulkan 元加载器。

包装

  • 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 的位置。

弃用和删除的功能

其他变化

  • SSL_CERT_FILESSL_CERT_DIR 环境变量现在可用于覆盖在哪里可以找到 TLS/SSL 操作的证书颁发机构。

  • 如果 <LANG>_CLANG_TIDY 包含一个 -p` 参数,则完整的编译器命令行不再附加在 -- 之后。

  • Xcode 生成器不再将每个配置后缀 $(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 添加到库搜索路径。请参阅政策:policy: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 编译器,因为它的 GNU-like 命令行尚未被 CMake 支持。

3.25.3

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