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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。