CMake 3.30 发行说明¶
自 CMake 3.29 以来的更改包括以下内容。
新功能¶
Presets¶
cmake-presets(7)文件现已支持9模式版本。include字段现在会展开除$env{}和特定于 preset 的宏(即源自 preset 定义字段的宏)之外的所有宏。
基于文件的 API¶
CMake 文件 API
cmake-file-api(7)的 "cmakeFiles" 版本 1 对象中的version字段已更新为 1.1。它增加了一个globsDependent字段,用于报告使用CONFIGURE_DEPENDS的file(GLOB)调用。
Generators¶
Visual Studio Generators 现在会向
.vcxproj文件添加UseDebugLibraries指示符,以表示哪些配置是调试配置。请参阅策略CMP0162。
Languages¶
Compile Features功能现在实现了对cxx_std_26和cuda_std_26元特征的支持,以指示编译器模式必须至少为 C++26。这些元特征最早由 CMake 3.25 文档化,但尚未完全实现。
命令¶
在不支持共享库的平台上,
add_library()命令现在会拒绝创建共享库,而不是自动将其转换为静态库。请参阅策略CMP0164。enable_language()命令现在在首次调用project()调用之前调用时会报错。请参阅策略CMP0165。file(DOWNLOAD)和file(UPLOAD)命令增加了TLS_VERSION <min>选项,用于指定连接到https://URL 的最低 TLS 版本。
变量¶
添加了
CMAKE_<LANG>_STANDARD_LATEST变量,用于描述 CMake 为选定的编译器支持的最新<LANG>语言标准。添加了
CMAKE_TLS_VERIFY环境变量作为现有CMAKE_TLS_VERIFY变量的回退。它指定是否默认验证https://URL 的服务器证书。添加了
CMAKE_TLS_VERSION变量和CMAKE_TLS_VERSION环境变量,用于指定file(DOWNLOAD)和file(UPLOAD)命令连接到https://URL 的默认最低 TLS 版本。添加了
CMAKE_VS_USE_DEBUG_LIBRARIES变量和相应的VS_USE_DEBUG_LIBRARIES目标属性,以显式控制.vcxproj文件中的UseDebugLibraries指示符。
属性¶
源文件属性
GENERATED现在在所有目录中都可见。请参阅策略CMP0163。策略CMP0118的文档已修订,以描述其实际效果。全局属性
PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE可用于将CMAKE_PROJECT_TOP_LEVEL_INCLUDES传播到使用 整个项目签名 的try_compile()调用中。这主要用作依赖项提供者在此类try_compile()调用中启用的方式。添加了
VS_FILTER_PROPS目标属性,用于告知 Visual Studio Generators 使用自定义 MSBuild 过滤器.props文件。
模块¶
ExternalProject模块的ExternalProject_Add()命令增加了TLS_VERSION <min>选项,并支持CMAKE_TLS_VERSION变量和CMAKE_TLS_VERSION环境变量,用于指定连接到https://URL 的最低 TLS 版本。FindBacktrace模块现在提供了一个导入目标。FindBLAS和FindLAPACK模块增加了对libblastrampoline的支持。FindCUDAToolkit模块现在提供了一个用于libnvfatbin和libnvfatbin_static的目标(如果找到)。FindCUDAToolkit模块现在会搜索CMAKE_CUDA_COMPILER变量和CUDACXX环境变量,即使CUDA语言未启用。FindOpenMP模块增加了OpenMP_RUNTIME_MSVC选项,用于控制与 MSVC 一起使用的 OpenMP 运行时。FindPython和FindPython3模块增加了对无锁线程 Python 版本的支持。在 Windows 上,
FindPython、FindPython2和FindPython3模块现在为 Python 调试版本提供了更好的支持。新变量
Python_EXECUTABLE_DEBUGPython_INTERPRETERPython_DEBUG_POSTFIX
新目标
Python::InterpreterDebugPython::InterpreterMultiConfig
python_add_library()命令现在根据Python_DEBUG_POSTFIX变量的值来管理DEBUG_POSTFIX目标属性。
生成器表达式¶
添加了
<LANG>_COMPILER_FRONTEND_VARIANT生成表达式系列,用于访问相关CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT变量的值。链接功能(如使用
LINK_LIBRARY生成表达式)现在可以通过指定CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES或CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES变量来添加描述其行为的属性。添加了
QUOTE生成表达式,用于求值为"。TARGET_PROPERTY生成表达式学会了评估由新的TRANSITIVE_COMPILE_PROPERTIES和TRANSITIVE_LINK_PROPERTIES目标属性定义的 自定义传递属性。TARGET_PROPERTY生成表达式现在正确地求值为INTERFACE_LINK_OPTIONS、INTERFACE_LINK_DIRECTORIES和INTERFACE_LINK_DEPENDS目标属性,通过跟踪静态库的私有依赖项。请参阅策略CMP0166。
CTest¶
ctest_submit()命令和ctest -T Submit步骤增加了TLSVersion和TLSVerify选项,以控制与https://URL 的协商。请参阅CTEST_TLS_VERSION和CTEST_TLS_VERIFY变量。
CPack¶
CPack Inno Setup Generator现在可以在非 Windows 主机上使用。CPack NuGet Generator增加了CPACK_NUGET_PACKAGE_README、CPACK_NUGET_PACKAGE_REPOSITORY_URL、CPACK_NUGET_PACKAGE_REPOSITORY_TYPE、CPACK_NUGET_PACKAGE_REPOSITORY_BRANCH和CPACK_NUGET_PACKAGE_REPOSITORY_COMMIT变量。CPack NuGet Generator现在可以为特定框架的依赖项生成依赖项组。添加了CPACK_NUGET_PACKAGE_TFMS变量,用于指定要为其生成组的目标框架名称(TFM)列表。CPack WIX Generator增加了对 WiX Toolset v4 的支持。请参阅CPACK_WIX_VERSION变量。
弃用和移除的功能¶
根据策略
CMP0167,已移除FindBoost模块。项目应迁移到上游 Boost 的BoostConfig.cmake包配置文件,find_package(Boost)现在会搜索该文件。使用仅包含依赖项名称的
FetchContent_Populate()调用已被弃用。项目应改用FetchContent_MakeAvailable()。请参阅策略CMP0169。使用完整的填充详细信息而不是仅依赖项名称调用FetchContent_Populate()仍然完全受支持。已移除
Visual Studio 9 2008生成器。
其他更改¶
ctest(1)现在会拒绝未知的命令行参数并报错。以前这些参数会被静默忽略。在 cmake.org 上提供的预编译 Windows
.msi安装程序,在执行全新安装时,默认会修改系统范围的PATH。当替换现有 3.30 或更高版本的安装时,默认会保留PATH修改的偏好设置。在 cmake.org 上提供的官方
.zip源存档现在使用 LF 换行符,而不是 CRLF 换行符,以符合现代惯例。在“配置完成”和“生成完成”消息之后打印的持续时间现在反映了在生成器特定步骤以及之前未捕获的生成开始时的代码模型评估步骤中花费的时间。打印的持续时间可能比 CMake 以前的版本更长,但更准确。
FetchContent现在更倾向于直接填充内容,而不是使用单独的子构建。这可以显著提高某些系统(尤其是 Windows,以及使用 Xcode 生成器时的 macOS)上的配置时间。cmake --fresh还会强制重新执行直接填充依赖项的下载、更新和修补步骤。策略CMP0168为仍依赖于使用子构建进行内容填充的项目提供了向后兼容性。当
FETCHCONTENT_FULLY_DISCONNECTED设置为 true 时,FetchContent_MakeAvailable()和单参数形式的FetchContent_Populate()要求依赖项的源目录已填充。CMake 3.29 及更早版本不检查此要求,但现在强制执行,受策略CMP0170的约束。
更新¶
自 CMake 3.30.0 以来的更改包括以下内容。
3.30.1, 3.30.2¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。
3.30.3¶
project(<PROJECT-NAME>)命令现在将<PROJECT-NAME>_SOURCE_DIR、<PROJECT-NAME>_BINARY_DIR和<PROJECT-NAME>_IS_TOP_LEVEL设置为普通变量,除此之外还将其设置为缓存条目。这对于在策略CMP0169的 NEW 行为下保留某些FetchContent用例的支持是必需的。FindPython和FindPython3模块现在分别在 Windows 上定义了Python_DEFINITIONS和Python3_DEFINITIONS变量,以支持使用无锁线程版本的 Python 进行开发。这些模块提供的各种目标还定义了INTERFACE_COMPILE_DEFINITIONS目标属性。
3.30.4¶
project(<PROJECT-NAME>)命令仅当<PROJECT-NAME>_SOURCE_DIR、<PROJECT-NAME>_BINARY_DIR和<PROJECT-NAME>_IS_TOP_LEVEL在调用project()时已设置为缓存或非缓存变量时,才将它们设置为普通变量。同名的缓存条目始终按原样设置。这改进了 3.30.3 的行为更改,以恢复嵌套目录调用具有相同项目名称的project()的行为,但此版本中的实现存在缺陷(此发行说明已追溯更新)。这可能导致首次运行和后续运行之间的行为不同。如果您的项目包含具有相同项目名称的嵌套project()调用并且您使用了这些变量,请不要使用 CMake 3.30.4。
3.30.5¶
project(<PROJECT-NAME>)命令仅当<PROJECT-NAME>_SOURCE_DIR、<PROJECT-NAME>_BINARY_DIR和<PROJECT-NAME>_IS_TOP_LEVEL在调用project(<PROJECT-NAME>)时已设置为非缓存变量时,才将它们设置为普通变量。同名的缓存条目始终按原样设置。这改进了 3.30.3 的行为更改,以恢复嵌套目录调用具有相同项目名称的project()的行为,并解决了 3.30.4 中引入的实现错误。
3.30.6, 3.30.7, 3.30.8, 3.30.9¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。