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
变量初始化。Visual Studio Generators for VS 2015 及以上增加了对 Visual Studio Tools for Android 的支持。现在可以将
CMAKE_SYSTEM_NAME
设置为Android
以生成 Android 工具的.vcxproj
文件。
语言¶
CMake 学会支持
ISPC
作为可以始终通过project()
和enable_language()
启用的一流语言。目前,ISPC
由 Makefile Generators 和在 Linux、macOS 和 Windows 上使用 Intel ISPC 编译器的Ninja
发生器提供支持。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
字段。
命令行¶
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
选项。它允许将参数用作程序调用,并且,如果可以找到,它将会将可执行文件解析为完整路径。DIRECTORY
选项set_property()
、get_property()
和get_directory_property()
命令现在接受对二进制目录路径的引用,例如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()
添加源文件。拥有源文件的库将作为构建系统的一部分进行生成。
已弃用和已删除的功能¶
与早于 2.8.12 的 CMake 版本的兼容性现已弃用,并且将在将来的版本中移除。将策略版本设置为旧值的
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
。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
上提供了预编译的 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¶
CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM
变量在 3.19.0 中引入,以前仅适用于Visual Studio 14 2015
生成器。现在已修复,适用于稍后版本的 VS 版本的 Visual Studio 生成器。
3.19.5¶
在启用 和 生成器时,现在可以通过从命令行运行
cmake --install
或cpack
来启动安装或软件包创建。在使用 Xcode 新构建系统时,由于 Xcode 的限制,仅支持这些方法。在使用旧构建系统时,仅通过构建 Xcode 中的install
或package
目标,才能启动这些操作。作为支持 Xcode 的“使用库链接二进制文件”构建阶段的一部分,在 3.19.0 中引入的框架处理中断了在设备与模拟器构建之间切换而无需重新配置的功能。此功能现已恢复。
3.19.6¶
功能不再允许在
CMakePresets.json
或CMakeUserPresets.json
文件中进行注释。由于在 CMake 3.19.0 到 CMake 3.19.5 中的实现错误允许这种情况,因此该错误未记录在文档中。
3.19.7¶
对于适用于 VS 2017 及更高版本的Visual Studio 生成器,字段
version=
现在接受三部分 MSVC 工具集版本,例如14.28.29910
。参见 变量。