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 编译器模式。CUDA
语言支持现在包括使用nvcc
时进行设备链接时优化。变量CMAKE_INTERPROCEDURAL_OPTIMIZATION
和关联的目标属性INTERPROCEDURAL_OPTIMIZATION
会激活设备 LTO。
命令行¶
已添加
cmake --workflow --preset
模式,以通过单个命令驱动一系列配置、生成、测试和打包操作。cmake -E capabilities
命令获得了一个新的tls
字段,用于指示 TLS 是否已启用。cmake -E env
命令行工具获得了一个--modify
标志,以支持ENVIRONMENT_MODIFICATION
操作。cmake --debug-trycompile
选项现在会打印日志消息,报告执行每次尝试编译检查的目录。
编译器¶
已添加对 Tasking 编译器工具集(SmartCode、TriCore、Stand Alone: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
选项,以将变量传播到控制返回到的作用域。请参阅策略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
生成器要在方案的“启动”模式设置中放置哪些内容。变量
CMAKE_XCODE_SCHEME_LAUNCH_CONFIGURATION
和对应的XCODE_SCHEME_LAUNCH_CONFIGURATION
目标属性已添加,用于告知Xcode
生成器要在方案的启动操作中放置哪些配置。
属性¶
现在,
<LANG>_COMPILER_LAUNCHER
目标属性支持generator expressions
。已添加
EXPORT_NO_SYSTEM
目标属性,用于指定install(EXPORT)
和export()
命令将生成具有SYSTEM
属性OFF
的导入目标。已添加
SYSTEM
目标属性,用于指定目标是否应被视为系统库(即,其 include 目录在编译使用者时自动SYSTEM
)。如果没有设置,则默认值为之前的行为:对于导入目标,默认为 on,对于其他目标默认为 off。
模块¶
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¶
现在,
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 操作的证书颁发机构。如果
<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¶
此版本未对已记录功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。