CMake 4.2 发行说明¶
自 CMake 4.1 以来的变更包括以下内容。
新功能¶
基于文件的 API¶
cmake-file-api(7)的“codemodel”版本 2 中的version字段已更新至 2.9。cmake-file-api(7)的“codemodel”版本 2 中的“target”和“directory”对象新增了一个codemodelVersion字段。cmake-file-api(7)的“codemodel”版本 2 现在在其回复中包含导入目标(imported targets)和所有接口库目标(interface library targets)。此前,导入目标被忽略,且仅包含那些参与构建系统的接口目标。以下变更为这些新增内容提供了支持:“target”对象新增了
imported、local和abstract字段。“target”对象的
type字段现在也可以包含UNKNOWN_LIBRARY值。“codemodel”对象的
configurations条目新增了一个abstractTargets数组。“codemodel”对象的
configurations条目中,directories和projects数组中的条目新增了一个abstractTargetIndexes数组。
cmake-file-api(7)的“codemodel”版本 2 “target”对象新增了linkLibraries、interfaceLinkLibraries、compileDependencies、interfaceCompileDependencies、objectDependencies和orderDependencies字段。
生成器¶
新增了
Visual Studio 18 2026生成器。新增了
FASTBuild生成器。
平台¶
CMake 现在支持通过简单的工具链文件进行 Emscripten 交叉编译。
命令行¶
cmake(1)命令行工具现在支持cmake -E copy_if_newer和cmake -E copy_directory_if_newer子命令,用于基于时间戳比较而非内容比较来复制文件。与通过比较文件内容来判断的copy_if_different相比,这些命令仅在源文件比目标文件更新时才进行复制,从而为构建系统提供了更好的性能。
命令¶
新增了
cmake_language(TRACE)命令,用于在脚本执行期间启用或禁用追踪功能。新增了
set(CACHE{<variable>})和unset(CACHE{<variable>})命令,用于显式设置和取消设置缓存条目。新增了
string(REGEX QUOTE)命令,用于生成能够精确匹配指定字符串的正则表达式。
变量¶
新增了
CMAKE_CXX_STDLIB_MODULES_JSON变量,用于设置标准库import std元数据文件的路径,而非依赖编译器来查找其位置。新增了
CMAKE_INTERMEDIATE_DIR_STRATEGY变量及相应的CMAKE_INTERMEDIATE_DIR_STRATEGY环境变量,用于更改命名目标文件及其他关联目标元数据所需的中间目录的策略。新增了
CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY变量及相应的CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY环境变量,用于更改命名Qt Autogen文件中间目录的策略。新增了
CMAKE_SKIP_LINTING变量和相应的SKIP_LINTING目标属性,用于通知 命令行构建工具生成器 跳过对目标中所有源文件的 Lint 检查。
属性¶
新增了
INSTALL_OBJECT_NAME源文件属性,用于控制特定编译源文件的已安装对象文件的名称。新增了
INSTALL_OBJECT_NAME_STRATEGY目标属性,用于控制已安装对象文件的命名策略。新增了
INSTALL_OBJECT_ONLY_USE_DESTINATION目标属性,用于更精确地控制对象文件的安装路径。新增了
JOB_POOL_COMPILE源文件属性,用于将单个源文件的编译任务分配给JOB_POOLS。新增了
OBJECT_NAME源文件属性,用于控制编译后源文件的对象名称。新增了
UNITY_BUILD_FILENAME_PREFIX目标属性,用于控制由UNITY_BUILD生成的源文件的名称。
模块¶
几乎所有的查找模块现在都提供一个名为
<PackageName>_VERSION的结果变量,其大小写与模块名称一致。现有的变体(如<PackageName>_VERSION_STRING和全大写的<PACKAGENAME>_VERSION)已被弃用。详情请参阅各查找模块的文档。CheckTypeSize模块的check_type_size()命令新增了一个RESULT_VARIABLE关键字,用于自定义结果变量名称,而非默认的HAVE_<size-var>。ExternalProject模块的ExternalProject_Add()和ExternalProject_Add_Step()命令现在提供了在配置、构建、安装和测试步骤中设置环境变量的选项。FindPython3、FindPython2和FindPython模块不再使NumPy依赖于Development.Module。请参阅策略CMP0201。GoogleTest模块的gtest_discover_tests()命令现在会在 gtest 支持--gtest_output=json选项的情况下,为每个发现的测试设置DEF_SOURCE_LINE测试属性。某些 IDE 使用此测试属性来定位每个测试的源代码。UseSWIG模块的swig_add_library()命令新增了一个DEBUG_POSTFIX选项,用于控制DEBUG_POSTFIX目标属性。
生成器表达式¶
新增了
<LANG>_COMPILER_LINKER_ID和<LANG>_COMPILER_LINKER_FRONTEND_VARIANT系列生成器表达式,用于访问关联的CMAKE_<LANG>_COMPILER_LINKER_ID和CMAKE_<LANG>_COMPILER_LINKER_FRONTEND_VARIANT变量的值。TARGET_FILE_BASE_NAME、TARGET_IMPORT_FILE_BASE_NAME、TARGET_LINKER_FILE_BASE_NAME、TARGET_LINKER_LIBRARY_FILE_BASE_NAME、TARGET_LINKER_IMPORT_FILE_BASE_NAME和TARGET_PDB_FILE_BASE_NAME生成器表达式新增了一个POSTFIX选项,用于控制将<CONFIG>_POSTFIX目标属性包含在对应文件的基本名称中。新增了
TARGET_INTERMEDIATE_DIR生成器表达式,用于引用构建树中目标的中间文件目录。
CPack¶
新增了
CPack AppImage 生成器。CPACK_PACKAGE_CHECKSUM变量现在支持多个值。CPack NSIS 生成器新增了一个CPACK_NSIS_CRC_CHECK变量,用于设置CRCCheck属性。CPack WIX 生成器新增了一个CPACK_WIX_CAB_PER_COMPONENT变量,以实现每个组件使用一个.cab文件。
已弃用和已删除的特性¶
所有查找模块现在都提供一个名为
<PackageName>_FOUND的结果变量,其大小写与模块名称一致。现有的变体(如全大写的<PACKAGENAME>_FOUND)在适当情况下已被弃用。详情请参阅各查找模块的文档。FindwxWidgets模块的结果变量wxWidgets_USE_FILE现已被弃用,建议直接包含UsewxWidgets模块。Visual Studio 14 2015生成器现已被弃用,并将于未来版本的 CMake 中移除。
其他更改¶
$<CONFIG:cfgs>生成器表达式在应用于导入目标时,已修复为不会匹配不适用的配置。请参阅策略CMP0199。导入目标的配置选择和定位现在更加一致。请参阅策略
CMP0200。处理
CMakeLists.txt文件时,不再定义CMAKE_PARENT_LIST_FILE变量。请参阅策略CMP0198。对于针对 MSVC ABI 的构建,所有生成器现在在编译源文件时,若未发现
_UNICODE或_SBCS,都会添加_MBCS预处理器定义。请参阅策略CMP0204。对于针对 MSVC ABI 的构建,所有生成器现在在编译共享库中的源文件时,都会添加
_WINDLL预处理器定义。请参阅策略CMP0203。Visual Studio 生成器 现在会抑制 Visual Studio 的默认标志
-fp:precise、-Gd和-GS(如果项目或用户未指定它们)。这使得构建过程与其他生成器保持一致,并符合项目和用户实际指定的配置。
更新¶
自 CMake 4.2.0 以来的变更包括以下内容。
4.2.1¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。
4.2.2¶
策略
CMP0199的 NEW 行为已被部分回退。在 4.2.0 和 4.2.1 中,$<CONFIG:cfgs>仅匹配被消费目标的配置。这破坏了依赖于匹配消费目标配置的既有用例,因此该行为已被部分回退,使其能够像 CMake 4.1 及更早版本一样匹配任意一种配置。
4.2.3¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。