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 生成器 支持使用未在 VS 安装程序中注册的可移植版 Visual Studio。请参阅
CMAKE_GENERATOR_INSTANCE变量。
命令行¶
当与 Visual Studio 生成器 一起使用,并且项目设置了
VS_PACKAGE_REFERENCES目标属性时,cmake(1)的--build命令现在会自动从 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" 版本 2 的version字段已更新为2.4。cmake-file-api(7)"codemodel" 版本 2 的directory对象installers字段增加了一个新的fileSet安装程序类型以及相关的fileSetName、fileSetType、fileSetDirectories和fileSetTarget字段。
命令¶
define_property()命令增加了一个新的INITIALIZE_FROM_VARIABLE选项,用于在创建目标时从变量初始化目标属性。install(TARGETS)命令增加了一个新的FILE_SET参数,可用于安装与目标关联的头文件集。string(TIMESTAMP)和file(TIMESTAMP)命令现在支持毫秒的%f指定符。target_sources()命令增加了一个新的FILE_SET模式,可用于将头文件添加为目标的头文件专属源文件。
变量¶
CMAKE_CUDA_ARCHITECTURES变量和相关的CUDA_ARCHITECTURES目标属性现在支持 CUDA toolkit 7.0+ 的all和all-major值。添加了
CMAKE_IGNORE_PREFIX_PATH和CMAKE_SYSTEM_IGNORE_PREFIX_PATH变量,以指示find_package()、find_program()、find_library()、find_path()和find_file()命令忽略指定的 Prefixes。添加了
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生成器哪些目标应放入“嵌入插件”构建阶段。添加了目标属性
XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE和支持的变量CMAKE_XCODE_SCHEME_ENABLE_GPU_FRAME_CAPTURE_MODE,用于告知Xcode生成器启用指定 Xcode scheme 选项属性“GPU 帧捕获”。
模块¶
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变量,用于向 Distribution XML 添加 domains 元素。使用这些变量,现在可以安装产品到用户的家庭目录,而无需管理员权限。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编译器检测现在在所有情况下,当无法计算所需的默认架构时,都会发出错误(参见
CMP0104),在 Clang 上处理
CMAKE_CUDA_ARCHITECTURES的OFF值,支持多个默认架构的理论情况,以及
尝试检测无效架构并发出错误。
Clang 上的
CUDA现在实现了策略CMP0105以及$<DEVICE_LINK:...>和$<HOST_LINK:...>生成器表达式。define_property()命令的BRIEF_DOCS和FULL_DOCS参数现在是可选的。现在可以在 Windows 上启用
ccmake(1)(当从源代码构建 CMake 时)。这是实验性的,因此未包含在官方发行版中。
更新¶
自 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¶
CMake 3.23.0 中,
CPack.distribution.dist.in模板文件中使用的CPACK_PACKAGEMAKER_CHOICES变量被新的CPACK_APPLE_PKG_INSTALLER_CONTENT变量替换。这破坏了那些提供了自己的模板文件但仍期望CPACK_PACKAGEMAKER_CHOICES变量被定义的项目。旧的CPACK_PACKAGEMAKER_CHOICES变量现在也设置为与以前相同的内容,但它已被正式弃用。
3.23.3, 3.23.4, 3.23.5¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。