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生成器增加了通过 *Link Binaries With Libraries* 构建阶段链接库和框架的支持,而不是总是直接嵌入链接器标志。此行为由新的XCODE_LINK_BUILD_PHASE_MODE目标属性控制,该属性由新的CMAKE_XCODE_LINK_BUILD_PHASE_MODE变量初始化。Visual Studio Generators for VS 2015 and above gained support for the Visual Studio Tools for Android. One may now set
CMAKE_SYSTEM_NAMEtoAndroidto generate.vcxprojfiles for the Android tools.
语言¶
CMake 支持将
ISPC作为一等语言,可以通过project()和enable_language()命令启用。ISPC目前支持 Linux、macOS 和 Windows 上的 Makefile Generators 和Ninja生成器,使用 Intel ISPC 编译器。Clang 对
CUDA语言的支持现在包括可分离编译(
CUDA_SEPARABLE_COMPILATION),以及在交叉编译时查找分散的工具包安装。
CUDA语言支持现在可以在 QNX 上运行。
平台¶
现在支持 Apple Silicon(自 CMake 3.19.2 起)
使用
uname -m选择CMAKE_HOST_SYSTEM_PROCESSOR。由于这可能因 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字段。
命令行¶
cmake(1)命令行工具的--install模式增加了--default-directory-permissions选项。cmake(1)增加了一个-E create_hardlink命令行工具,可用于在文件之间创建硬链接。
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。可以通过向CTEST_MEMORYCHECK_COMMAND_OPTIONS变量添加适当的标志来选择compute-sanitizer支持的不同工具(memcheck、racecheck、synccheck和initcheck)。默认标志为--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()添加源文件。具有源文件的接口库将作为构建系统的一部分生成。
已弃用和移除的功能¶
对早于 2.8.12 的 CMake 版本的兼容性现已弃用,并将在未来版本中移除。调用
cmake_minimum_required()或cmake_policy()将策略版本设置为旧值现在会发出弃用诊断。为策略
CMP0071(CMP0071及更低版本已弃用)添加了明确的弃用诊断。cmake-policies(7)手册解释说,所有策略的 OLD 行为都已弃用,项目应迁移到 NEW 行为。不再支持早于 10.5 的 macOS SDK。
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或CFLAGS)未设置,CMAKE_<LANG>_FLAGS_INIT变量现在将在编译器标识检查期间被考虑。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。对于
ASM语言,现在会考虑OSX_ARCHITECTURES目标属性。如果
CUDA编译器检测在用户指定的CMAKE_CUDA_ARCHITECTURES或CMAKE_CUDA_HOST_COMPILER下失败,则会引发错误。
更新¶
自 CMake 3.19.0 以来的更改包括以下内容。
3.19.1¶
CMake 3.19.0 通过传递显式语言标志(如
-x c)来编译具有LANGUAGE属性的源文件。这与属性的文档含义一致,即源文件是用指定的语言编写的。但是,这会破坏仅使用该属性来导致使用指定语言编译器(例如-x cuda)的项目。此更改已被撤销,以恢复 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上提供了预编译的 Linuxaarch64二进制文件。在
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 的限制,这是唯一支持的方法。通过在 Xcode 中构建install或package目标来启动这些操作仅在使用旧版构建系统时才受支持。3.19.0 中为支持 Xcode 的 *Link Binaries With Libraries* 构建阶段而引入的框架处理破坏了在不重新配置的情况下切换设备和模拟器构建的能力。现在已恢复此功能。
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变量。