CMake 3.19 发行说明¶
自 CMake 3.18 以来的更改包括以下内容。
新特性¶
预设¶
cmake(1)
和cmake-gui(1)
现在识别CMakePresets.json
和CMakeUserPresets.json
文件(参见cmake-presets(7)
)。
生成器¶
Xcode
生成器在为 Xcode 12.0 或更高版本生成时,现在使用 Xcode “新的构建系统”。请参阅CMAKE_XCODE_BUILD_SYSTEM
变量。可以使用-T buildsystem=1
切换到旧的构建系统。Xcode
生成器增加了对通过链接二进制文件与库构建阶段而不是总是直接嵌入链接器标志来链接库和框架的支持。此行为由新的XCODE_LINK_BUILD_PHASE_MODE
目标属性控制,该属性由新的CMAKE_XCODE_LINK_BUILD_PHASE_MODE
变量初始化。用于 VS 2015 及更高版本的 Visual Studio 生成器 增加了对 Visual Studio Tools for Android 的支持。现在可以将
CMAKE_SYSTEM_NAME
设置为Android
以生成 Android 工具的.vcxproj
文件。
语言¶
CMake 学会了支持
ISPC
作为第一类语言,可以通过project()
和enable_language()
命令启用。ISPC
目前由 Makefile 生成器 和 Linux、macOS 和 Windows 上使用 Intel ISPC 编译器的Ninja
生成器支持。Clang 的
CUDA
语言支持现在包括可分离编译 (
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 生成器 要选择的 Windows SDK 的最大版本。
属性¶
EXCLUDE_FROM_ALL
目标属性现在支持生成器表达式
。添加了
OPTIMIZE_DEPENDENCIES
目标属性,以避免不必要地构建静态库的依赖项。添加了
PCH_INSTANTIATE_TEMPLATES
目标属性,以启用预编译头文件中的模板实例化。默认情况下启用此功能,并且可以显着提高编译时间。目前仅支持 Clang(版本 11 或更高版本)。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()
添加源文件。具有源文件的接口库将作为构建系统的一部分生成。
已弃用和移除的特性¶
与 CMake 2.8.12 之前版本的兼容性现在已弃用,并将从未来版本中移除。将策略版本设置为旧值的
cmake_minimum_required()
或cmake_policy()
调用现在会发出弃用诊断信息。为策略
CMP0071
添加了显式弃用诊断信息(CMP0071
及以下版本已弃用)。cmake-policies(7)
手册解释说,所有策略的旧行为都已被弃用,项目应移植到新行为。不再支持早于 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_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 生成器 不再重复来自目标依赖项的自定义命令。请参阅策略
CMP0113
。ExternalProject
模块对步骤目标依赖项的处理已修订。请参阅策略CMP0114
。现在,
ASM
语言也支持OSX_ARCHITECTURES
目标属性。如果使用用户指定的
CMAKE_CUDA_ARCHITECTURES
或CMAKE_CUDA_HOST_COMPILER
导致CUDA
编译器检测失败,则会引发错误。
更新¶
自 CMake 3.19.0 以来的更改包括以下内容。
3.19.1¶
CMake 3.19.0 使用
LANGUAGE
属性编译源文件,方法是传递显式语言标志,例如-x c
。这与该属性的文档化含义一致,即源文件以指定的语言编写。但是,这可能会破坏仅使用该属性来导致使用指定语言的编译器的项目。这已恢复为 CMake 3.18 及更低版本的行为。CUDA 11.1 支持 Clang。
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 生成器 一起使用。
3.19.5¶
当启用
IOS_INSTALL_COMBINED
并且使用Xcode
生成器时,现在可以通过从命令行运行cmake --install
或cpack
来启动安装或包创建。当使用 Xcode 新构建系统时,由于 Xcode 的限制,这些是唯一支持的方法。仅当使用旧构建系统时,才支持通过在 Xcode 中构建install
或package
目标来启动这些操作。作为支持 Xcode 的链接二进制文件与库构建阶段的一部分,在 3.19.0 中引入的框架处理破坏了在设备和模拟器构建之间切换而无需重新配置的功能。该功能现已恢复。
3.19.6¶
cmake-presets(7)
功能不再允许在CMakePresets.json
或CMakeUserPresets.json
文件中添加注释。CMake 3.19.0 至 CMake 3.19.5 中的实现错误地允许了这一点,并且未记录在文档中。
3.19.7¶
对于 VS 2017 及更高版本的 Visual Studio 生成器,
CMAKE_GENERATOR_TOOLSET
字段version=
现在接受三组件 MSVC 工具集版本,例如14.28.29910
。请参阅CMAKE_VS_PLATFORM_TOOLSET_VERSION
变量。