CMake 3.30 发行说明¶
自 CMake 3.29 以来的更改包括以下内容。
新特性¶
预设¶
cmake-presets(7)
文件现在支持模式版本9
。include
字段现在展开除了$env{}
和预设特定宏之外的所有宏,即那些从预设定义内部字段派生的宏。
基于文件的 API¶
cmake-file-api(7)
“cmakeFiles” 版本 1 对象的version
字段已更新至 1.1。它新增了一个globsDependent
字段,用于报告使用CONFIGURE_DEPENDS
的file(GLOB)
调用。
生成器¶
Visual Studio 生成器 现在向
.vcxproj
文件添加UseDebugLibraries
指示器,以表示哪些配置是调试配置。请参阅策略CMP0162
。
语言¶
编译特性
功能现在实现了对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
变量,用于描述所选编译器支持的最新<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
传播到使用 whole-project signature 的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 生成器
现在可在非 Windows 主机上使用。CPack NuGet 生成器
新增了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 生成器
现在可以为框架特定的依赖项生成依赖项组。添加了CPACK_NUGET_PACKAGE_TFMS
变量,用于指定应为其生成组的目标框架 Moniker (TFM) 列表。CPack WIX 生成器
增加了对 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()
被调用时,<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-NAME>)
命令现在仅当project()
被调用时,<PROJECT-NAME>_SOURCE_DIR
、<PROJECT-NAME>_BINARY_DIR
和<PROJECT-NAME>_IS_TOP_LEVEL
已经被设置为非缓存变量时,才将它们设置为非缓存变量。 同名的缓存条目始终像以前一样设置。 此更改改进了 3.30.3 的行为更改,以恢复调用具有相同项目名称的project()
的嵌套目录的行为,并解决了 3.30.4 中引入的实现错误。
3.30.6, 3.30.7, 3.30.8¶
这些版本未对已记录的功能或接口进行任何更改。 进行了一些实现更新,以支持生态系统变化和/或修复回归。