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_DIR
TARGET_LINKER_FILE_BASE_NAME
TARGET_LINKER_FILE_NAME
TARGET_LINKER_FILE_DIR
TARGET_SONAME_FILE_NAME
TARGET_SONAME_FILE_DIR
TARGET_PDB_FILE_NAME
TARGET_PDB_FILE_DIR
TARGET_BUNDLE_DIR
TARGET_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
变量。