CMake 3.19 发行说明¶
自 CMake 3.18 以来所做的更改包括以下内容。
新功能¶
预设¶
cmake(1)和cmake-gui(1)现在可以识别CMakePresets.json和CMakeUserPresets.json文件(参见:manual:cmake-presets(7 )).
生成器¶
Xcode生成器现在在为 Xcode 12.0 或更高版本生成时使用 Xcode“新构建系统”。请参阅CMAKE_XCODE_BUILD_SYSTEM变量。可以使用-T buildsystem=1切换到遗留构建系统。Xcode生成器通过 Link Binaries With Libraries 构建阶段获得了对链接库和框架的支持,而不是总是通过直接嵌入链接器标志。此行为由新的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 编译器的 Linux、macOS 和 Windows 上的 Makefile Generators 和 Ninja 生成器目前支持ISPC。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" version 2version字段已更新为 2.2。cmake-file-api(7)“codemodel” version 2 “target” 对象在compileGroups对象中获得了一个新的languageStandard字段。
命令行¶
图形用户界面¶
CMake GUI现在有一个环境变量编辑器。
命令¶
add_test()命令现在(正式)支持其创建的测试名称中的空格和其他特殊字符。请参阅政策:policy: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目标属性现在支持generator expressions。添加了
OPTIMIZE_DEPENDENCIES目标属性以避免不必要地为静态库构建依赖项。添加了
PCH_INSTANTIATE_TEMPLATES目标属性以在预编译标头中启用模板实例化。这是默认启用的,可能会显着缩短编译时间。目前仅支持 Clang(版本 11 或更高版本)。WIN32_EXECUTABLE目标属性现在支持generator expressions。
模块¶
添加了 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”的支持,以在每个源的基础上管理输出目录。
C测试¶
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_PRE_BUILD_SCRIPTS、CPACK_POST_BUILD_SCRIPTS和CPACK_PACKAGE_FILES变量。CPack 外部生成器获得了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 以来,该选项无法正常工作。
文档¶
添加了以下指南:
IDE 集成指南导入和导出指南
其他变化¶
为 macOS 构建现在将使用系统上可用的最新 SDK,除非用户明确选择了使用 CMAKE_OSX_SYSROOT 的 SDK。部署目标或系统 macOS 版本不会影响 SDK 的选择。
CMAKE_<LANG>_COMPILER变量现在可用于存储“强制”编译器标志,如CC和其他环境变量。CMAKE_<LANG>_FLAGS_INIT变量现在将在编译器识别检查期间考虑是否未设置其他来源,如CMAKE_<LANG>_FLAGS或CFLAGS。find_program()命令现在需要执行权限,但不需要读取找到的文件。请参阅政策:policy:CMP0109。如果使用位置,则导入的目标缺少其位置属性会在生成过程中失败。请参阅政策:policy:CMP0111。
以下查询目录或文件名组件的基于目标的生成器表达式不再添加对评估目标的依赖性。请参阅政策:policy: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 生成器 不再重复来自目标依赖项的自定义命令。请参阅政策:policy:CMP0113。
步骤目标依赖项的
ExternalProject模块处理已被修改。请参阅政策:policy: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 及以下版本的行为。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¶
预编译的 Linux
aarch64二进制文件现在在cmake.org上提供。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 生成器。它现在已被修复,可以与 Visual Studio 生成器 一起用于更高版本的 VS。
3.19.5¶
当启用:prop_tgt:IOS_INSTALL_COMBINED 并使用:generator:Xcode 生成器时,现在可以通过从命令行。使用 Xcode 新构建系统时,由于 Xcode 的限制,这些是唯一受支持的方法。只有在使用旧版构建系统时才支持通过在 Xcode 中构建“install”或“package”目标来启动这些操作。
作为支持 Xcode 的 Link Binaries With Libraries 构建阶段的一部分,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 Generators,CMAKE_GENERATOR_TOOLSET 字段 version= 现在接受三组件 MSVC 工具集版本,例如 14.28.29910。请参阅
CMAKE_VS_PLATFORM_TOOLSET_VERSION变量。