CMake 3.23 发行说明¶
自 CMake 3.22 以来的变更包括以下内容。
新特性¶
预设¶
cmake-presets(7)
文件现在支持 schema 版本4
。cmake-presets(7)
文件现在有一个可选的include
字段,允许文件包含其他文件。cmake-presets(7)
文件现在支持${fileDir}
宏,其中包含预设文件所在的目录。cmake-presets(7)
增加了对在构建预设中指定resolvePackageReferences
命令行选项的支持,以控制从外部包管理器恢复包引用的行为。目前,这仅在 Visual Studio 生成器中受支持,以支持从 NuGet 恢复包。其他生成器会忽略此选项。
生成器¶
用于 VS 2019 及更高版本的 Visual Studio 生成器 学习了支持 C# 项目的 .NET SDK 风格项目文件 (
.csproj
)。请参阅DOTNET_SDK
目标属性和相应的CMAKE_DOTNET_SDK
变量。add_custom_command()
在 .NET SDK 风格的项目中尚不支持。用于 VS 2017 及更高版本的 Visual Studio 生成器 学习了使用 Visual Studio 的便携实例,这些实例不为 VS 安装程序所知。请参阅
CMAKE_GENERATOR_INSTANCE
变量。
命令行¶
当与 Visual Studio 生成器 一起使用时,
cmake(1)
--build
命令在设置了VS_PACKAGE_REFERENCES
目标属性的项目上,现在会自动从 NuGet 恢复包引用。缓存变量CMAKE_VS_NUGET_PACKAGE_RESTORE
可以设置为切换构建树中的此行为。使用--resolve-package-references
命令行选项来控制一次调用时的行为。cmake(1)
命令行工具增加了一个--debug-find-pkg
选项,以启用特定find_package()
调用下的调试消息。cmake(1)
命令行工具增加了一个--debug-find-var
选项,以启用使用特定结果变量的find_*
调用的调试消息。
编译器¶
现在支持基于 LLVM 的 IBM Open XL C/C++ 编译器,编译器 ID 为
IBMClang
。现在支持 MCST LCC 编译器,编译器 ID 为
LCC
。请参阅策略CMP0129
。
基于文件的 API¶
cmake-file-api(7)
"codemodel" 版本 2version
字段已更新为2.4
。cmake-file-api(7)
"codemodel" 版本 2directory
对象installers
字段增加了一个新的fileSet
安装程序类型。
命令¶
define_property()
命令增加了一个新的INITIALIZE_FROM_VARIABLE
选项,以使目标属性在创建目标时从变量初始化。install(TARGETS)
命令增加了一个新的FILE_SET
参数,可用于安装与目标关联的头文件集。string(TIMESTAMP)
和file(TIMESTAMP)
命令现在支持微秒的%f
说明符。target_sources()
命令增加了一个新的FILE_SET
模式,可用于将头文件添加为目标的仅头文件源文件。
变量¶
CMAKE_CUDA_ARCHITECTURES
变量和关联的CUDA_ARCHITECTURES
目标属性现在支持 CUDA 工具包 7.0+ 的all
和all-major
值。添加了
CMAKE_IGNORE_PREFIX_PATH
和CMAKE_SYSTEM_IGNORE_PREFIX_PATH
变量,以告知find_package()
,find_program()
,find_library()
,find_path()
和find_file()
命令忽略指定的 prefix。添加了
CMAKE_LINK_LIBRARIES_ONLY_TARGETS
变量和相应的LINK_LIBRARIES_ONLY_TARGETS
目标属性,以可选地要求所有可以作为目标名称的链接项实际上是现有目标的名称。
属性¶
添加了
HEADER_SETS
和INTERFACE_HEADER_SETS
只读目标属性,以列出与目标关联的头文件集。添加了
HEADER_SET
和HEADER_SET_<NAME>
目标属性,以分别列出默认头文件集和命名头文件集中的文件。添加了
HEADER_DIRS
和HEADER_DIRS_<NAME>
目标属性,以分别指定默认头文件集和命名头文件集的基本目录。添加了
IMPORTED_NO_SYSTEM
目标属性,以指定 导入的目标 不应被视为系统库(即,其包含目录不会自动成为SYSTEM
)。添加了
XCODE_EMBED_PLUGINS
目标属性,以告知Xcode
生成器将哪些目标放入Embed PlugIns
构建阶段。添加了
XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE
目标属性和支持的CMAKE_XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE
变量,以告知Xcode
生成器启用指定 Xcode scheme 选项属性GPU Frame Capture
。
模块¶
CheckPIESupported
模块现在支持OBJC
、OBJCXX
、CUDA
和HIP
语言。它现在还遵循CMAKE_SYSROOT
和CMAKE_OSX_SYSROOT
。ExternalProject
模块的ExternalProject_Add()
命令增加了对USES_TERMINAL_PATCH
选项的支持,以使 patch 步骤获得独占终端访问权限。FindCUDAToolkit
模块现在为libcufft_static_nocallback
提供目标(如果找到)。FindGLUT
模块现在提供GLUT_INCLUDE_DIRS
结果变量,以符合cmake-developer(7)
手册中记录的命名约定。这取代了旧的GLUT_INCLUDE_DIR
变量。FindGTest
模块现在为 GMock 提供目标(如果找到)。FindVulkan
模块现在提供报告版本号的Vulkan_VERSION
结果变量。
CTest¶
ctest(1)
增加了一个新的CTEST_SUBMIT_INACTIVITY_TIMEOUT
变量,可用于指定提交不活动的超时时间。
CPack¶
CPack productbuild Generator
增加了新的CPACK_PRODUCTBUILD_DOMAINS
,CPACK_PRODUCTBUILD_DOMAINS_ANYWHERE
,CPACK_PRODUCTBUILD_DOMAINS_USER
和CPACK_PRODUCTBUILD_DOMAINS_ROOT
变量,用于将 domains 元素添加到 Distribution XML。使用这些变量,现在可以将产品安装到用户的 home 目录,而无需管理权限。CPack productbuild Generator
增加了一个新变量CPACK_PRODUCTBUILD_IDENTIFIER
,用于自定义与产品关联的唯一产品标识符。CPack.distribution.dist.in
模板(由CPack productbuild Generator
和 CPackPackageMaker
生成器使用)已更新为使用新的CPACK_APPLE_PKG_INSTALLER_CONTENT
变量作为其主要内容。这取代了之前未记录且现在已弃用的CPACK_PACKAGEMAKER_CHOICES
变量。CPack IFW Generator
增加了新的CPACK_IFW_ARCHIVE_FORMAT
和CPACK_IFW_ARCHIVE_COMPRESSION
变量,用于设置打包新组件数据存档时使用的格式,并选择使用的压缩级别。这些功能适用于 QtIFW 4.2 及更高版本。CPack IFW Generator
增加了新的CPACK_IFW_PACKAGE_DISABLE_COMMAND_LINE_INTERFACE
变量,以防止用户向安装程序传递任何消费者命令,例如install
、update
和remove
。此功能适用于 QtIFW 4.0 及更高版本。CPack IFW Generator
增加了新的CPACK_IFW_PACKAGE_PRODUCT_IMAGES
变量,用于添加要在PerformInstallationPage
上显示的图像列表。此功能适用于 QtIFW 4.0 及更高版本。CPack IFW Generator
增加了新的CPACK_IFW_PACKAGE_RUN_PROGRAM
,CPACK_IFW_PACKAGE_RUN_PROGRAM_ARGUMENTS
和CPACK_IFW_PACKAGE_RUN_PROGRAM_DESCRIPTION
变量,用于在安装程序完成后,如果用户接受该操作,则执行命令。此功能适用于 QtIFW 4.0 及更高版本。CPack IFW Generator
增加了新的CPACK_IFW_PACKAGE_SIGNING_IDENTITY
变量,用于指定用于签署生成的应用程序捆绑包的代码签名身份。此功能仅在 macOS 上可用,并且适用于 QtIFW 3.0 及更高版本。新的
CPack WIX 生成器
获得了一个新的变量,CPACK_WIX_SKIP_WIX_UI_EXTENSION
,用于跳过 WixUIExtensions 的包含。
已弃用和移除的功能¶
cmake(1)
现在会在指定多个源路径时发出警告,例如cmake -S src1 src2
。这从未被正式记录或支持过,但旧版本意外地接受了多个源路径并使用了最后一个指定的路径。请更新脚本以避免传递多个源路径参数。已移除
cpack(1)
未文档化的OSXX11
生成器。先前未文档化的
CPACK_PACKAGEMAKER_CHOICES
变量(在CPack.distribution.dist.in
模板中使用)已被新的CPACK_APPLE_PKG_INSTALLER_CONTENT
变量取代。这仅影响那些提供自定义CPack.distribution.dist.in
模板文件,但仍依赖于CPACK_PACKAGEMAKER_CHOICES
设置的项目。这些自定义模板文件应更新为使用CPACK_APPLE_PKG_INSTALLER_CONTENT
,或完全定义所有模板文件的内容,而不依赖于任何变量的替换。
其他更改¶
除非通过
CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE
选项显式激活,否则CPack DragNDrop 生成器
不再将CPACK_RESOURCE_FILE_LICENSE
作为许可协议附加到生成的.dmg
中。在 CMake 项目中,CPack
模块默认启用此选项以实现兼容性。CUDA
目标现在可以同时启用CUDA_SEPARABLE_COMPILATION
和CUDA_PTX_COMPILATION
。CUDA
编译器检测现在在所有无法计算默认架构(如果需要)的情况下发出错误(参见
CMP0104
),处理 Clang 上
CMAKE_CUDA_ARCHITECTURES
的OFF
,支持多个默认架构的理论情况,以及
尝试检测无效架构并发出错误。
带有 Clang 的
CUDA
现在实现了策略CMP0105
以及$<DEVICE_LINK:...>
和$<HOST_LINK:...>
生成器表达式。define_property()
命令的BRIEF_DOCS
和FULL_DOCS
参数现在是可选的。从源代码构建 CMake 时,现在可以在 Windows 上启用
ccmake(1)
。 这是实验性的,因此未包含在官方发行版中。
更新¶
自 CMake 3.23.0 以来的更改包括以下内容。
3.23.1¶
CMake 3.23.0 中添加的
target_sources()
FILE_SET
功能尚未将头文件正确放置在 AppleFRAMEWORK
目标中。在 CMake 未来版本中进行进一步工作之前,现在将类型为HEADERS
的FILE_SET
添加到 Apple 平台上的此类目标是错误的。CMake 3.23.0 中添加的
HEADER_SETS
和INTERFACE_HEADER_SETS
目标属性现在是由target_sources()
命令创建的头文件集的只读记录。
3.23.2¶
在 CMake 3.23.0 中,
CPACK_PACKAGEMAKER_CHOICES
变量(在CPack.distribution.dist.in
模板文件中使用)被新的CPACK_APPLE_PKG_INSTALLER_CONTENT
变量取代。这破坏了那些提供自己的模板文件但仍期望定义CPACK_PACKAGEMAKER_CHOICES
变量的项目。旧的CPACK_PACKAGEMAKER_CHOICES
变量现在也被设置为与之前相同的内容,但它已被正式弃用。
3.23.3、3.23.4、3.23.5¶
这些版本未对已文档化的功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。