CMake 3.30 版本说明¶
自 CMake 3.29 以来做出的更改包括以下内容。
新功能¶
预设¶
cmake-presets(7)
文件现在支持模式版本9
。include
字段现在扩展所有宏,除了$env{}
和预设特定的宏,即那些从预设定义中的字段派生的宏。
基于文件 API¶
基于文件的 API (cmakeFiles) 版本 1 对象的
version
字段已更新至 1.1。它获得了一个globsDependent
字段来报告file(GLOB)
使用CONFIGURE_DEPENDS
的调用。
生成器¶
Visual Studio 生成器 现在将
UseDebugLibraries
指示符添加到.vcxproj
文件中以指示哪些配置是调试配置。请参阅策略CMP0162
.
语言¶
编译功能 (Compile Features) 功能现在实现了对
cxx_std_26
和cuda_std_26
元功能的支持,以指示编译器模式必须至少为 C++26。这些元功能最初由 CMake 3.25 文档化,但未完全实现。
命令¶
在不支持共享库的平台上,
add_library()
命令现在拒绝创建共享库,而不是自动将它们转换为静态库。请参阅策略CMP0164
.如果在第一个
project()
调用之前调用enable_language()
命令,现在会引发错误。请参阅策略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 生成器 使用自定义 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
模块现在即使在未启用CUDA
语言时,也会搜索CMAKE_CUDA_COMPILER
变量和CUDACXX
环境变量。FindOpenMP
模块新增了OpenMP_RUNTIME_MSVC
选项,用于控制与 MSVC 一起使用的 OpenMP 运行时。FindPython
和FindPython3
模块新增了对免费线程 Python 版本的支持。FindPython
、FindPython2
和FindPython3
模块在 Windows 上现在为 Python 调试变体提供了更好的支持新变量
Python_EXECUTABLE_DEBUG
Python_INTERPRETER
Python_DEBUG_POSTFIX
新目标
Python::InterpreterDebug
Python::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
变量。
弃用和已移除的功能¶
的
FindBoost
模块已被策略CMP0167
移除。将项目移植到上游 Boost 的BoostConfig.cmake
包配置文 件,find_package(Boost)
现在搜索该文件。使用仅依赖项名称调用
FetchContent_Populate()
现在已弃用。项目应改用FetchContent_MakeAvailable()
。请参见策略CMP0169
。使用完整的填充详细信息(而不仅仅是依赖项名称)调用FetchContent_Populate()
仍然完全受支持。的
Visual Studio 9 2008
生成器已被移除。
其他更改¶
在 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(<PROJECT-NAME>)
命令现在仅在<PROJECT-NAME>_SOURCE_DIR
、<PROJECT-NAME>_BINARY_DIR
和<PROJECT-NAME>_IS_TOP_LEVEL
已经作为缓存变量或非缓存变量设置的情况下,才将它们设置为普通变量。同名缓存条目始终如以前一样设置。这细化了 3.30.3 的行为更改,以恢复嵌套目录调用project()
并使用相同项目名称的行为,但此版本的实现存在缺陷(此版本说明已追溯更新)。它会导致第一次运行和后续运行之间的行为不同。如果您的项目包含嵌套调用project()
且使用相同项目名称,并且您使用这些变量,请勿使用 CMake 3.30.4。
3.30.5¶
当
project()
命令被调用时,project(<PROJECT-NAME>)
命令现在仅在<PROJECT-NAME>_SOURCE_DIR
、<PROJECT-NAME>_BINARY_DIR
和<PROJECT-NAME>_IS_TOP_LEVEL
已经作为非缓存变量设置的情况下,才将它们设置为非缓存变量。同名缓存条目始终如以前一样设置。这细化了 3.30.3 的行为更改,以恢复嵌套目录调用project()
并使用相同项目名称的行为,并且它解决了 3.30.4 中引入的实现错误。