CMake 3.23 发行说明¶
自 CMake 3.22 以来所做的更改包括以下内容。
新功能¶
预设¶
cmake-presets(7)文件现在支持架构版本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变量。 .NET SDK 样式的项目尚不支持add_custom_command()。VS 2017 及更高版本的 Visual Studio 生成器 学会了使用 VS 安装程序不知道的 Visual Studio 的可移植实例。请参阅
CMAKE_GENERATOR_INSTANCE变量。
命令行¶
cmake(1)--build命令,当与 Visual Studio 生成器 一起用于设置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”。请参阅政策:policy:CMP0129。
基于文件的 API¶
cmake-file-api(7)“代码模型”版本 2version字段已更新为2.4。cmake-file-api(7)"codemodel" version 2directoryobjectinstallers字段获得了新的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()和: command:find_file 命令忽略指定的前缀。添加了
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目标属性以指定:ref:Imported Target <Imported Targets> 不应被视为系统库(即它的包含目录不会自动成为SYSTEM)。XCODE_EMBED_PLUGINS目标属性被添加来告诉Xcode生成器在Embed PlugIns构建阶段放置什么目标。XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE目标属性和支持CMAKE_XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE变量被添加来告诉Xcode生成器启用指定 Xcode 方案选项属性``GPU Frame Capture``。
模块¶
CheckPIESupported模块现在支持OBJC、OBJCXX、CUDA和HIP语言。它现在也支持CMAKE_SYSROOT和CMAKE_OSX_SYSROOT。ExternalProject模块的ExternalProject_Add()命令获得了对USES_TERMINAL_PATCH选项的支持,以赋予补丁步骤独占终端访问权限。FindCUDAToolkit模块现在为libcufft_static_nocallback提供了一个目标(如果找到的话)。FindGLUT 模块现在提供 GLUT_INCLUDE_DIRS 结果变量,以符合 cmake-developer(7) 手册中记录的命名约定。这取代了遗留的
GLUT_INCLUDE_DIR变量。FindGTest模块现在为 GMock 提供目标(如果找到的话)。FindVulkan模块现在提供报告版本号的Vulkan_VERSION结果变量。
C测试¶
ctest(1)获得了一个新的CTEST_SUBMIT_INACTIVITY_TIMEOUT变量,可用于指定提交不活动的超时时间。
包装¶
The
CPack productbuild Generatorgained the newCPACK_PRODUCTBUILD_DOMAINS,CPACK_PRODUCTBUILD_DOMAINS_ANYWHERE,CPACK_PRODUCTBUILD_DOMAINS_USER, andCPACK_PRODUCTBUILD_DOMAINS_ROOTvariables for adding the domains element to the Distribution XML .使用这些变量,现在无需管理权限即可将产品安装到用户的主目录。CPack productbuild Generator获得了一个新变量CPACK_PRODUCTBUILD_IDENTIFIER,用于自定义与产品关联的唯一产品标识符。CPack productbuild Generator和 CPackPackageMaker生成器使用的``CPack.distribution.dist.in`` 模板已更新为使用新的``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 Generator获得了一个新变量CPACK_WIX_SKIP_WIX_UI_EXTENSION,以跳过包含 WixUIExtensions。
弃用和删除的功能¶
cmake(1)现在在指定多个源路径时发出警告,如在cmake -S src1 src2中。这从未被正式记录或支持,但旧版本意外地接受了多个源路径并使用了最后指定的路径。更新脚本以避免传递多个源路径参数。cpack(1)未记录的OSXX11生成器已被删除。CPack.distribution.dist.in模板中使用的先前未记录的CPACK_PACKAGEMAKER_CHOICES变量已被新的CPACK_APPLE_PKG_INSTALLER_CONTENT变量替换。这只会影响那些提供自己的自定义“CPack.distribution.dist.in”模板文件的项目,但仍然依赖于“CPACK_PACKAGEMAKER_CHOICES”的设置。这些自定义模板文件应该更新为使用“CPACK_APPLE_PKG_INSTALLER_CONTENT”,或者完全定义所有模板文件的内容而不依赖于任何一个变量的替换。
其他变化¶
CPack DragNDrop Generator不再附加CPACK_RESOURCE_FILE_LICENSE作为生成的.dmg中的许可协议,除非由CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE选项明确激活。在 CMake 项目中,CPack模块默认启用该选项以实现兼容性。CUDA目标现在可以同时启用CUDA_SEPARABLE_COMPILATION和CUDA_PTX_COMPILATION。CUDA编译器检测现在:如果需要,在无法计算默认架构的所有情况下都会发出错误(请参阅:policy:CMP0104),
在 Clang 上为
CMAKE_CUDA_ARCHITECTURES处理OFF,支持多个默认架构的理论案例,并且
尝试检测无效架构并发出错误。
带有 Clang 的
CUDA现在实现策略:policy:CMP0105 和:genex:$<DEVICE_LINK:...> 和:genex:$<HOST_LINK:...> 生成器表达式。define_property()命令的BRIEF_DOCS和FULL_DOCS参数现在是可选的。ccmake(1)现在可以在从源代码构建 CMake 时在 Windows 上启用。这是实验性的,因此不包含在官方发行版中。
更新¶
自 CMake 3.23.0 以来所做的更改包括以下内容。
3.23.1¶
CMake 3.23.0 中添加的
target_sources()FILE_SET功能尚未在 AppleFRAMEWORK目标中正确放置头文件。在 CMake 的未来版本中等待进一步的工作,现在在 Apple 平台上向此类目标添加类型为“HEADERS”的“FILE_SET”是错误的。CMake 3.23.0 中添加的
HEADER_SETS和INTERFACE_HEADER_SETS目标属性现在是target_sources()命令创建的标头集的只读记录。
3.23.2¶
CPack.distribution.dist.in模板文件中使用的``CPACK_PACKAGEMAKER_CHOICES`` 变量在 CMake 3.23.0 中被新的``CPACK_APPLE_PKG_INSTALLER_CONTENT`` 变量替换。这破坏了提供自己的模板文件但仍期望定义“CPACK_PACKAGEMAKER_CHOICES”变量的项目。旧的CPACK_PACKAGEMAKER_CHOICES变量现在也设置为与以前相同的内容,但已正式弃用。
3.23.3、3.23.4、3.23.5¶
这些版本未对记录的功能或界面进行任何更改。进行了一些实施更新以支持生态系统更改和/或修复回归。