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变量。
命令行¶
当与 Visual Studio 生成器 结合使用,并且项目设置了
VS_PACKAGE_REFERENCES目标属性时,cmake(1)的--build命令现在会自动从 NuGet 恢复包引用。缓存变量CMAKE_VS_NUGET_PACKAGE_RESTORE可用于在构建树中切换此行为。使用--resolve-package-references命令行选项来控制单次调用的行为。CMake 命令行工具
cmake(1)增加了--debug-find-pkg选项,以便在特定的find_package()调用下启用调试消息。CMake 命令行工具
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()命令忽略指定的路径前缀。添加了
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 方案选项属性“GPU Frame Capture”。
模块¶
CheckPIESupported模块现在支持OBJC、OBJCXX、CUDA和HIP语言。它还遵循CMAKE_SYSROOT和CMAKE_OSX_SYSROOT。ExternalProject_Add()命令的ExternalProject模块获得了对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。通过这些变量,现在可以无需管理员权限即可将产品安装到用户的主目录。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变量已被 CMake 3.23.0 中新引入的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:...>生成器表达式。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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。