CMake 3.19 发行说明¶
自 CMake 3.18 以来的更改包括以下内容。
新功能¶
预设¶
cmake(1)和cmake-gui(1)现在识别CMakePresets.json和CMakeUserPresets.json文件(请参阅cmake-presets(7))。
生成器¶
为 Xcode 12.0 或更高版本生成时,
Xcode生成器现在使用 Xcode "新构建系统"。请参阅CMAKE_XCODE_BUILD_SYSTEM变量。可以使用-T buildsystem=1切换到旧的构建系统。Xcode生成器增加了通过“链接二进制文件至库”构建阶段链接库和框架的支持,而不是始终直接嵌入链接器标志。此行为由新的XCODE_LINK_BUILD_PHASE_MODE目标属性控制,该属性由新的CMAKE_XCODE_LINK_BUILD_PHASE_MODE变量初始化。Visual Studio Generators for VS 2015 及更高版本增加了对 Visual Studio Android 工具的支持。现在可以将
CMAKE_SYSTEM_NAME设置为Android,以便为 Android 工具生成.vcxproj文件。
语言¶
CMake 现在支持将
ISPC作为一级语言,可以通过project()和enable_language()命令启用。ISPC目前在 Linux、macOS 和 Windows 上支持 Makefile Generators 和Ninja生成器,使用 Intel ISPC 编译器。CUDA语言对 Clang 的支持现在包括可分离编译(
CUDA_SEPARABLE_COMPILATION),以及在交叉编译时查找分散的工具链安装。
CUDA语言支持现在可以在 QNX 上运行。
平台¶
现在支持 Apple Silicon(自 CMake 3.19.2 起)
CMAKE_HOST_SYSTEM_PROCESSOR使用uname -m选择。由于这可能根据 CMake 本身的架构和调用进程树的架构而变化,因此CMAKE_APPLE_SILICON_PROCESSOR变量或CMAKE_APPLE_SILICON_PROCESSOR环境变量可以设置为显式指定主机架构。如果未设置
CMAKE_OSX_ARCHITECTURES,CMake 会添加显式标志以告知编译器为CMAKE_HOST_SYSTEM_PROCESSOR构建,这样工具链就不必根据进程树的架构进行猜测。
基于文件的 API¶
cmake-file-api(7)"codemodel" 版本 2 的version字段已更新为 2.2。cmake-file-api(7)"codemodel" 版本 2 的 "target" 对象在其compileGroups对象中增加了一个新的languageStandard字段。
命令行¶
GUI¶
CMake GUI现在有一个环境变量编辑器。
命令¶
add_test()命令现在(正式)支持其创建的测试名称中的空格和其他特殊字符。请参阅策略CMP0110。cmake_language()命令增加了DEFER模式,以安排命令在处理完目录后执行。configure_file()命令增加了NO_SOURCE_PERMISSIONS选项,以禁止将输入文件的权限复制到输出文件。execute_process()命令增加了COMMAND_ERROR_IS_FATAL选项来指定一个致命错误。file(ARCHIVE_CREATE)命令增加了COMPRESSION_LEVEL选项来指定压缩级别。file(CHMOD)和file(CHMOD_RECURSE)子命令已添加,用于设置文件和目录的权限。file(DOWNLOAD)命令的<file>参数现在是可选的。如果未指定,则不保存文件。file(GENERATE)命令增加了一个新的TARGET关键字,用于支持解析目标依赖的生成器表达式。file()命令增加了一个新的REAL_PATH子命令,用于计算一个已解析符号链接的路径。find_package()命令现在支持处理版本范围。separate_arguments()命令增加了一个新的PROGRAM选项。它允许将参数视为程序调用,并能在找到可执行文件时将其解析为完整路径。set_property()、get_property()和get_directory_property()命令的DIRECTORY选项现在接受指向二进制目录路径的引用,例如CMAKE_CURRENT_BINARY_DIR的值。string()命令增加了一组新的JSON子命令,提供 JSON 解析功能。
变量¶
添加了
CMAKE_CLANG_VFS_OVERLAY变量,用于告诉 Clang 使用 VFS 覆盖来支持 Windows SDK,以应对在具有区分大小写文件系统的宿主上交叉编译的情况。CMAKE_MFC_FLAG变量现在支持生成器表达式。添加了
CMAKE_OPTIMIZE_DEPENDENCIES变量,用于初始化新的OPTIMIZE_DEPENDENCIES目标属性,避免为静态库不必要地构建依赖项。添加了
CMAKE_PCH_INSTANTIATE_TEMPLATES变量,用于初始化新的PCH_INSTANTIATE_TEMPLATES目标属性。添加了
CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM变量,用于告知 Visual Studio Generators 要选择的最大 Windows SDK 版本。
属性¶
EXCLUDE_FROM_ALL目标属性现在支持生成器表达式。添加了
OPTIMIZE_DEPENDENCIES目标属性,以避免为静态库不必要地构建依赖项。添加了
PCH_INSTANTIATE_TEMPLATES目标属性,用于在预编译头中启用模板实例化。此选项默认启用,并且可以显著提高编译时间。目前仅支持 Clang(11.0 或更高版本)。WIN32_EXECUTABLE目标属性现在支持生成器表达式。
模块¶
添加了
CheckCompilerFlag模块,用于将CheckCCompilerFlag和CheckCXXCompilerFlag推广到更多语言。它还支持CUDA和ISPC语言。CheckLinkerFlag模块现在支持CUDA语言。添加了
CheckSourceCompiles模块,用于将CheckCSourceCompiles和CheckCXXSourceCompiles推广到更多语言。它还支持CUDA和ISPC语言。添加了
CheckSourceRuns模块,用于将CheckCSourceRuns和CheckCXXSourceRuns推广到更多语言。它还支持CUDA语言。CMakePackageConfigHelpers模块增加了对版本范围的支持。FindCUDAToolkit模块增加了对查找不包含nvcc的 CUDA 工具链以及在交叉编译时查找分散的工具链安装的支持。FindPackageHandleStandardArgs模块现在支持处理版本范围。它还增加了find_package_check_version()命令,用于根据find_package()命令的版本相关参数检查版本的有效性。FindPython3、FindPython2和FindPython模块增加了处理版本范围的能力。FindPython3、FindPython2和FindPython模块分别提供了变量Python3_LINK_OPTIONS、Python2_LINK_OPTIONS和Python_LINK_OPTIONS用于链接选项。FindSDL模块现在提供一个导入的目标
SDL::SDL。结果变量
SDL_LIBRARIES和SDL_INCLUDE_DIRS。版本变量
SDL_VERSION、SDL_VERSION_MAJOR、SDL_VERSION_MINOR和SDL_VERSION_PATCH。
FindSWIG模块增加了处理版本范围的能力。FindTIFF模块增加了一个CXX组件,用于查找包含 C++ 绑定的tiffxx库。FindVulkan模块现在提供一个Vulkan::glslc导入目标和相关的Vulkan_GLSLC_EXECUTABLE变量,其中包含 GLSL SPIR-V 编译器的路径。UseSWIG模块增加了对新的源文件属性OUTPUT_DIR和OUTFILE_DIR的支持,以便按源文件管理输出目录。
CTest¶
ctest(1)现在支持 CUDAcompute-sanitizer检查器(以前称为cuda-memcheck),作为CTEST_MEMORYCHECK_COMMAND。compute-sanitizer支持的各种工具(memcheck、racecheck、synccheck和initcheck)可以通过向CTEST_MEMORYCHECK_COMMAND_OPTIONS变量添加适当的标志来选择。默认标志为--tool memcheck --leak-check full。
CPack¶
CPack 增加了
CPACK_PRE_BUILD_SCRIPTS、CPACK_POST_BUILD_SCRIPTS和CPACK_PACKAGE_FILES变量。CPack External Generator增加了CPACK_EXTERNAL_BUILT_PACKAGES变量。CPack WIX Generator增加了CPACK_WIX_CUSTOM_XMLNS选项来指定自定义 XML 命名空间。
其他¶
接口库 现在可以通过
add_library()或target_sources()添加源文件。带有源文件的接口库将作为构建系统的一部分进行生成。
已弃用和移除的功能¶
兼容 CMake 版本早于 2.8.12 的行为现已弃用,并将在未来版本中移除。调用
cmake_minimum_required()或cmake_policy()并将策略版本设置为旧值现在会发出弃用诊断。为策略
CMP0071(CMP0071及更低版本已弃用)添加了显式弃用诊断。cmake-policies(7)手册解释说,所有策略的 OLD 行为都已弃用,项目应迁移到 NEW 行为。不再支持 macOS SDK 版本早于 10.5 的版本。
cmake-gui(1)现在需要 Qt5。已移除对使用 Qt4 编译的支持。cmake(1)命令行选项--warn-unused-vars已移除,并被静默忽略。该选项自 CMake 3.3 起便未能正确工作。
文档¶
已添加以下指南
其他更改¶
为 macOS 构建现在将使用系统上可用的最新 SDK,除非用户已通过
CMAKE_OSX_SYSROOT显式选择了 SDK。部署目标或系统 macOS 版本将不影响 SDK 的选择。CMAKE_<LANG>_COMPILER变量现在可以用于存储“强制性”编译器标志,如CC和其他环境变量。CMAKE_<LANG>_FLAGS_INIT变量现在将在编译器标识检查期间被考虑,前提是未设置其他源,如CMAKE_<LANG>_FLAGS或CFLAGS。find_program()命令现在需要执行权限,但不需要读取找到文件的权限。请参阅策略CMP0109。缺少位置属性的导入目标在生成期间如果使用位置信息,将导致错误。请参阅策略
CMP0111。以下查询目录或文件名组件的目标生成器表达式不再添加对已评估目标的依赖。请参阅策略
CMP0112。TARGET_FILE_DIRTARGET_LINKER_FILE_BASE_NAMETARGET_LINKER_FILE_NAMETARGET_LINKER_FILE_DIRTARGET_SONAME_FILE_NAMETARGET_SONAME_FILE_DIRTARGET_PDB_FILE_NAMETARGET_PDB_FILE_DIRTARGET_BUNDLE_DIRTARGET_BUNDLE_CONTENT_DIR
Makefile Generators 不再重复来自目标依赖项的自定义命令。请参阅策略
CMP0113。ExternalProject模块对步骤目标依赖项的处理已得到修订。请参阅策略CMP0114。OSX_ARCHITECTURES目标属性现在对ASM语言生效。如果
CUDA编译器检测在使用用户指定的CMAKE_CUDA_ARCHITECTURES或CMAKE_CUDA_HOST_COMPILER时失败,则会引发错误。
更新¶
自 CMake 3.19.0 以来的更改包括以下内容。
3.19.1¶
CMake 3.19.0 通过传递显式语言标志(例如
-x c)来编译具有LANGUAGE属性的源文件。这与该属性的文档含义一致,即源文件是用指定语言编写的。但是,这会破坏仅使用该属性来触发指定语言的编译器使用的项目。此行为已恢复,以恢复 CMake 3.18 及更早版本的行为。支持 Clang 的 CUDA 11.1。
3.19.2¶
在 cmake.org 上提供的预编译 macOS 二进制文件现在是通用二进制文件,包含
x86_64和arm64架构。它需要 macOS 10.10 或更高版本。包文件名模式已从cmake-$ver-Darwin-x86_64更改为cmake-$ver-macos-universal。更新了 Apple Silicon 主机架构选择支持。CMake 3.19.0 和 3.19.1 始终选择
arm64作为主机架构。CMake 3.19.2 恢复使用uname -m,如 CMake 3.18 及更早版本所做的那样。由于这可能根据 CMake 本身的架构和调用进程树的架构而变化,因此CMAKE_APPLE_SILICON_PROCESSOR变量或CMAKE_APPLE_SILICON_PROCESSOR环境变量可以设置为显式指定主机架构。添加了
CMAKE_ISPC_HEADER_SUFFIX变量和相应的ISPC_HEADER_SUFFIX目标属性,用于控制ISPC编译器生成的头文件所使用的头文件后缀。
3.19.3¶
现在 cmake.org 上提供了一个预编译的 Linux
aarch64二进制文件。现在 cmake.org 上提供了两个预编译的 macOS 二进制文件
文件名模式
cmake-$ver-macos-universal是一个通用二进制文件,包含x86_64和arm64架构。它需要 macOS 10.13 或更高版本。文件名模式
cmake-$ver-macos10.10-universal是一个通用二进制文件,包含x86_64和arm64架构。它需要 macOS 10.10 或更高版本。
3.19.4¶
在 3.19.0 中引入的
CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM变量以前仅适用于Visual Studio 14 2015生成器。现在已修复,使其也能与更高 VS 版本的 Visual Studio Generators 一起工作。
3.19.5¶
当启用
IOS_INSTALL_COMBINED并使用Xcode生成器时,现在可以通过从命令行运行cmake --install或cpack来启动安装或打包创建。在使用 Xcode 新构建系统时,由于 Xcode 的限制,这是唯一支持的方法。在 legacy 构建系统下,可以通过在 Xcode 中构建install或package目标来启动这些操作,这仅在 legacy 构建系统下受支持。在 3.19.0 中为支持 Xcode 的“链接二进制文件至库”构建阶段而引入的框架处理,破坏了在不重新配置的情况下在设备和模拟器构建之间切换的能力。该功能现已恢复。
3.19.6¶
cmake-presets(7)功能不再允许在CMakePresets.json或CMakeUserPresets.json文件中使用注释。CMake 3.19.0 到 3.19.5 的实现错误地允许了这一点,并且未在文档中说明。
3.19.7¶
对于 VS 2017 及更高版本的 Visual Studio Generators,
CMAKE_GENERATOR_TOOLSET字段version=现在接受三组件 MSVC 工具集版本,例如14.28.29910。请参阅CMAKE_VS_PLATFORM_TOOLSET_VERSION变量。