CMake 3.24 发布说明¶
自 CMake 3.23 以来的更改包括以下内容。
新功能¶
预设¶
cmake-presets(7)文件现支持 schema 版本5。cmake-presets(7)文件现支持${pathListSep}宏,该宏会根据平台展开为:或;。cmake-presets(7)文件新增了在测试预设中指定testOutputTruncation字段的支持,该字段指定了达到最大测试输出大小时的截断模式。
生成器¶
Green Hills MULTI生成器现为任何 CMake 文件更新时生成重新运行 CMake 的构建规则。Visual Studio 生成器 在使用 VS 2019 Update 11 或更高版本时,现支持
SYSTEM头文件。
命令行¶
cmake(1)新增了--fresh命令行选项,用于在配置构建树时移除任何现有的CMakeCache.txt文件及相关的CMakeFiles/目录,从而如同构建树是新创建的一样开始新的配置。cmake(1)新增了--compile-no-warning-as-error命令行选项,该选项会忽略COMPILE_WARNING_AS_ERROR目标属性和CMAKE_COMPILE_WARNING_AS_ERROR变量的效果。cmake(1)--trace=json-v1跟踪格式新增了global_frame和line_end字段。cmake(1)的-E命令cat和env现可识别双破折号 (--) 参数,该参数用作选项结束的定界符。任何后续参数均被视为操作数/位置参数,即使它们以破折号-开头。
编译器¶
LLVM 的 flang Fortran 编译器现已在某些平台上受支持,编译器 ID 为
LLVMFlang。
ADSP 编译器支持(SHARC 和 Blackfin)现已覆盖 CCES 和 VDSP++ 安装,所需的配置现已在编译器模块本身完成,而非
Generic-ADSP平台模块中。
平台¶
已添加专用的
ADSP平台以取代现有的Generic-ADSP实现。该平台具备根据CMAKE_SYSTEM_PROCESSOR变量自动检测最新 CCES/VDSP++ 安装和编译器选择(cc21kvs.ccblkfn)的功能。
命令¶
cmake_host_system_information()命令在 Windows 上新增了QUERY WINDOWS_REGISTRY模式。请参阅其 查询 Windows 注册表 部分。cmake_language()命令新增了SET_DEPENDENCY_PROVIDER子命令。设置依赖项提供程序后,对find_package()和FetchContent_MakeAvailable()的调用可以通过自定义命令重定向,该命令可以选择直接满足请求、修改请求处理方式,或将其留给内置实现来满足。请参阅 依赖项提供程序。file(DOWNLOAD)命令新增了RANGE_START和RANGE_END选项,用于指定要下载的字节范围。这对于下载大型二进制文件的一部分很有用。find_file()、find_path()、find_library()、find_program()和find_package()命令新增了NO_CMAKE_INSTALL_PREFIX选项,用于控制对CMAKE_INSTALL_PREFIX的搜索。find_file()、find_path()、find_library()、find_program()和find_package()命令新增了指定必须查询的 Windows 注册表视图的功能。find_package()命令新增了GLOBAL选项,允许在find_package()调用期间将导入的目标提升到全局作用域。
变量¶
新增了
CMAKE_COLOR_DIAGNOSTICS变量,用于控制编译器生成的彩色诊断信息。该变量还通过 Makefile 生成器 控制彩色构建系统消息,取代了CMAKE_COLOR_MAKEFILE。新增了
CMAKE_COLOR_DIAGNOSTICS环境变量,用于设置CMAKE_COLOR_DIAGNOSTICS的默认值。新增了
CMAKE_COMPILE_WARNING_AS_ERROR变量和相应的COMPILE_WARNING_AS_ERROR目标属性,以启用使用特定编译器标志(如-Werror)将警告视为错误进行编译。CMAKE_CUDA_ARCHITECTURES变量和相关的CUDA_ARCHITECTURES目标属性现在支持特殊的native值,用于为主机的 GPU 编译。新增了
CMAKE_FIND_PACKAGE_TARGETS_GLOBAL变量,用于切换find_package()命令新的GLOBAL选项的行为。新增了
CMAKE_FIND_USE_INSTALL_PREFIX变量,用于切换find_file()、find_library()、find_path()、find_package()和find_program()命令新的NO_CMAKE_INSTALL_PREFIX选项的行为。新增了
CMAKE_PROJECT_TOP_LEVEL_INCLUDES变量,允许在第一个project()调用处,在确定主机和目标平台详细信息后注入自定义代码。新增了
CMAKE_TRY_COMPILE_NO_PLATFORM_VARIABLES变量,用于告知try_compile()命令不将任何平台变量传递给测试项目。新增了
CMAKE_VERIFY_INTERFACE_HEADER_SETS变量和相应的VERIFY_INTERFACE_HEADER_SETS目标属性,以启用构建规则来验证头文件集中的所有头文件是否可以独立使用。新增了
CMAKE_VS_NO_COMPILE_BATCHING变量和相应的VS_NO_COMPILE_BATCHING目标属性,用于告知 Visual Studio 生成器 是否禁用编译器并行性,一次调用一个源文件来编译。引入了
CMAKE_WATCOM_RUNTIME_LIBRARY变量和WATCOM_RUNTIME_LIBRARY目标属性,以选择面向 Watcom ABI 的编译器使用的运行时库。请参阅策略CMP0136。新增了
CMAKE_XCODE_XCCONFIG变量和相应的XCODE_XCCONFIG目标属性,用于告知Xcode生成器处理xcconfig文件。
属性¶
新增了
INTERFACE_LINK_LIBRARIES_DIRECT和INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE目标属性,用于表达影响使用者直接链接依赖项的使用要求。新增了
INTERFACE_HEADER_SETS_TO_VERIFY目标属性,用于指定哪些头文件集应由VERIFY_INTERFACE_HEADER_SETS进行验证。LINK_LIBRARIES目标属性现在支持$<LINK_ONLY:...>生成器表达式。请参阅策略CMP0131。新增了
VS_DOTNET_STARTUP_OBJECT目标属性,用于告知 Visual Studio 生成器 在程序或项目执行时使用哪个启动类。当托管 .NET 项目中存在多个static void Main(string[])函数签名时,这是必需的。
模块¶
ExternalProject模块的ExternalProject_Add()命令新增了DOWNLOAD_EXTRACT_TIMESTAMP选项,用于控制在使用URL下载方法时,是否将提取内容的的时间戳设置为与归档中的时间戳匹配。新增了策略CMP0135以默认启用该选项。FetchContent模块和find_package()命令现在支持集成功能。FetchContent_MakeAvailable()现在可以首先尝试调用find_package()来满足依赖项。新的FETCHCONTENT_TRY_FIND_PACKAGE_MODE变量控制是默认对所有依赖项执行此操作、按依赖项选择加入,还是完全禁用。find_package()可以重定向为调用FetchContent_MakeAvailable()。新的只读CMAKE_FIND_PACKAGE_REDIRECTS_DIR变量指向一个目录,其中可以找到配置文件包,以方便这些重定向调用。
FindJNI模块现提供导入的目标。FindMatlab模块的matlab_add_mex()函数新增了NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES选项,用于禁用对 MATLAB 库的自动链接。FindVulkan模块现在支持组件,除了 Vulkan SDK 头文件和库外,还可以选择查找哪些 VulkanSDK 工具和库。FindZLIB新增了ZLIB_USE_STATIC_LIBS变量,用于仅搜索静态库。
生成器表达式¶
新增了
LINK_LIBRARY生成器表达式,用于管理链接步骤中库的指定方式。变量CMAKE_<LANG>_LINK_LIBRARY_USING_<FEATURE>和CMAKE_LINK_LIBRARY_USING_<FEATURE>用于定义可由LINK_LIBRARY生成器表达式使用的特性。此外,还提供了LINK_LIBRARY_OVERRIDE和LINK_LIBRARY_OVERRIDE_<LIBRARY>目标属性来解决不兼容的特性。LINK_LIBRARY生成器表达式在面向Apple平台时,可以以多种方式链接框架。新增了以下特性:FRAMEWORKNEEDED_FRAMEWORKREEXPORT_FRAMEWORKWEAK_FRAMEWORK
LINK_LIBRARY生成器表达式在面向Apple平台时,可以以多种方式链接库。新增了以下特性:NEEDED_LIBRARYREEXPORT_LIBRARYWEAK_LIBRARY
LINK_LIBRARY生成器表达式新增了WHOLE_ARCHIVE特性,用于强制加载静态库中的所有成员。该特性支持以下目标平台:所有
Apple变体Linux所有
BSD变体SunOSWindowsCYGWINMSYS
新增了
LINK_GROUP生成器表达式,用于管理链接步骤中库的分组。变量CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>和CMAKE_LINK_GROUP_USING_<FEATURE>用于定义可与LINK_GROUP生成器表达式一起使用的特性。此版本定义了RESCAN特性,用于处理使用 Linux、BSD、SunOS 和 Windows GNU 工具链的工具链时静态库之间的循环引用。新增了
PATH生成器表达式,用于管理路径。新增了
PATH_EQUAL生成器表达式,用于管理路径比较。新增了
TARGET_BUNDLE_DIR_NAME生成器表达式,用于评估给定包目标(bundle target)的包目录名称。
CTest¶
ctest(1)新增了--test-output-truncation选项(和相应的CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION变量),用于在达到最大测试输出大小时指定截断模式。可能的值为tail(默认)、middle或head。
CPack¶
CPack WIX Generator新增了变量CPACK_WIX_ARCHITECTURE,用于指定安装程序架构,以支持运行 Windows for ARM 的计算机。CPack 现在支持使用 libarchive 3.6 或更高版本编译时的
zstd压缩的CPACK_THREADS选项。官方 CMake 二进制文件在 cmake.org 上也支持此功能。
已弃用和已移除的功能¶
CPack模块在CPack DragNDrop Generator中不再默认启用 SLA。请参阅策略CMP0133和CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE变量。已移除已弃用的
CPack PackageMaker Generator。FindGLUT模块不再提供未文档化的GLUT_LIBRARY和GLUT_INCLUDE_PATH结果变量。FindVulkan模块不再默默忽略find_package(Vulkan REQUIRED ...)调用请求的未知组件。随着组件支持的增加,未知组件的请求现在会产生错误。
其他更改¶
CMake 在构建目录的首次 CMake 运行时,不再设置环境变量(如
CC、CXX等)来启用相应语言。请参阅策略CMP0132。CheckIPOSupported模块的check_ipo_supported()命令现在使用调用方的CMAKE_<LANG>_FLAGS和CMAKE_<LANG>_FLAGS_<CONFIG>值。请参阅策略CMP0138。MSYS Makefiles和MinGW Makefiles生成器在未显式指定编译器时,现会选择在PATH环境变量列出的目录中找到的第一个编译器(不限名称)。try_compile()命令的 整个项目 签名现在会传播平台变量。请参阅策略CMP0137。在 cmake.org 上提供的预编译 macOS 二进制文件不再将 SLA 附加到
.dmg包。这是因为 macOS 12 已弃用用于附加.dmg资源的工具。在 cmake.org 上现已提供预编译的 Windows
arm64二进制文件。
更新¶
自 CMake 3.24.0 以来的更改包括以下内容。
3.24.1, 3.24.2¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。
3.24.3¶
3.24.0 中新增的
LLVMFlangFortran 编译器支持已得到扩展:现已支持 Fortran 与 C 或 CXX 之间的混合语言链接。
现已支持 Windows 上的 GNU ABI(MinGW),但尚未支持 MSVC ABI。
进行了一些实现更新,以支持生态系统更改和/或修复回归。
3.24.4¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。