CMake 3.18 发行说明

自 CMake 3.17 以来的主要更改包括:

新功能

语言

  • 现在可以使用 Clang 在非 Windows 平台编译 CUDA 语言。可分离编译在任何平台上尚不支持。

命令行

  • cmake(1) 通过 --profiling-output--profiling-format 参数增加了对 CMake 脚本进行性能分析的支持。

  • cmake(1) 增加了一个 cat 命令行选项,可用于连接文件并将其打印到标准输出。

命令

  • 命令 add_library()add_executable() 现在可以创建引用非 GLOBAL 导入目标别名目标

  • 添加了 cmake_language() 命令,用于对脚本化或内置命令进行元操作,包括支持 CALL 模式调用其他命令,以及 EVAL CODE 模式原地评估 CMake 脚本。

  • 命令 execute_process() 增加了 ECHO_OUTPUT_VARIABLEECHO_ERROR_VARIABLE 选项。

  • 命令 export() 现在如果使用相同的 FILE 但不使用 APPEND 多次调用,将引发错误。请参阅策略 CMP0103

  • 命令 file() 增加了 ARCHIVE_CREATEARCHIVE_EXTRACT 子命令,将 cmake(1)-E tar 功能暴露给 CMake 脚本代码。

  • 创建了 file(CONFIGURE) 子命令,以在不依赖磁盘上预先存在的文件作为输入的情况下复制 configure_file() 的功能。内容而是通过字符串传递。

  • 命令 file(UPLOAD) 增加了 TLS_VERIFYTLS_CAINFO 选项,用于控制服务器证书验证。

  • 命令 find_program()find_library()find_path()find_file() 增加了新的 REQUIRED 选项,如果找不到任何内容,将停止处理并显示错误消息。

  • 作用域为 SOURCE 的命令 get_property() 增加了 DIRECTORYTARGET_DIRECTORY 选项,以从提供的目录作用域获取属性。

  • 命令 get_source_file_property() 增加了 DIRECTORYTARGET_DIRECTORY 选项,以从提供的目录作用域获取属性。

  • 命令 list()SORT 操作增加了 NATURAL 排序选项,以使用自然顺序进行排序(参见 strverscmp(3) 手册)。

  • 作用域为 SOURCE 的命令 set_property() 增加了 DIRECTORYTARGET_DIRECTORY 选项,以在提供的目录作用域中设置属性。

  • 命令 set_source_files_properties() 增加了 DIRECTORYTARGET_DIRECTORY 选项,以在提供的目录作用域中设置属性。

  • 命令 string() 增加了一个新的 HEX 子命令,用于将字符串转换为其十六进制表示。

变量

属性

模块

  • 添加了模块 CheckLinkerFlag,用于提供检查链接器标志有效性的机制。

  • 模块 ExternalProject 的命令 ExternalProject_Add() 增加了一个新的关键字 GIT_REMOTE_UPDATE_STRATEGY。此关键字可用于指定如何处理 Git 更新期间失败的 rebase 操作。还添加了变量 CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY 作为全局默认值,并且 ExternalProjectFetchContent 模块均支持此变量。

  • 模块 FetchContent 的命令 FetchContent_Declare() 现在支持 SOURCE_SUBDIR 选项。此选项可用于指示 FetchContent_MakeAvailable() 在其他位置查找 CMakeLists.txt 文件。

  • 模块 FindBLAS 现在提供了一个导入的目标。

  • 模块 FindCUDAToolkit

    • 增加了变量 CUDAToolkit_LIBRARY_ROOT,它是包含 nvvm 目录和 version.txt 的目录。

    • CUDA 编译器检测期间使用的工具包和库根。

  • 模块 FindLAPACK 现在提供了一个导入的目标。

  • 模块 FindPython3FindPython2FindPython

    • 增加了为 cmake-gui(1)ccmake(1) 进行交互式编辑的每个工件的缓存变量的可能性。

    • Development 组件下增加了子组件 Development.ModuleDevelopment.Embed

    • 增加了指定要查找的 Python 实现的能力,包括 IronPythonPyPy

  • 模块 FindRuby 的输入和输出变量均已从 RUBY_ 重命名为 Ruby_,以与其他查找模块保持一致。如果提供了旧格式的输入变量,仍将予以支持,并且始终提供旧格式的输出变量。

  • 模块 FindSWIG 现在将目标语言作为 COMPONENTSOPTIONAL_COMPONENTS 参数传递给 find_package

  • 模块 GoogleTest 的命令 gtest_discover_tests()

    • 增加了新的 DISCOVERY_MODE 选项,用于控制测试发现步骤的运行时间。它提供了一个新的 PRE_TEST 设置,可以在测试时而不是构建时运行发现。新的变量 CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE 可用于全局更改默认设置。

    • 增加了可选参数 XML_OUTPUT_DIR。如果设置此参数,JUnit XML 测试结果将存储在该目录中。

  • 模块 FindLibXslt 现在提供导入的目标。

  • 模块 UseSWIG 现在支持 Fortran 作为目标语言,前提是 SWIG_EXECUTABLESWIG-Fortran

生成器表达式

CTest

CPack

其他

已弃用和已删除的特性

  • 模块 Documentation 已通过策略 CMP0106 弃用。该模块本质上是 VTK 代码,CMake 不应再分发。

  • 为策略 CMP0070CMP0071CMP0069 及更早版本已弃用)添加了明确的弃用诊断。手册 cmake-policies(7) 解释了所有策略的 OLD 行为已被弃用,项目应迁移到 NEW 行为。

其他更改

  • 在 Windows 上,当未明确指定编译器时,NinjaNinja Multi-Config 生成器现在选择 PATH 环境变量列出的目录中找到的第一个编译器(不考虑名称)。

  • 目标属性 LINK_OPTIONSINTERFACE_LINK_OPTIONS 现在用于设备链接步骤。请参阅策略 CMP0105

  • 创建覆盖现有目标的 ALIAS 目标现在将引发错误。请参阅策略 CMP0107

  • 将目标链接到自身(通过别名)现在将引发错误。请参阅策略 CMP0108

  • 模块 FindPackageHandleStandardArgs 的选项 REQUIRED_VARS 在指定 HANDLE_COMPONENTS 时现在是可选的。

  • 命令 source_group() 现在将正斜杠(/)也识别为子分组分隔符,而不仅仅是反斜杠(\)。

  • ctest(1) 现在会记录其为每个测试设置的环境变量,无论是由于 ENVIRONMENT 属性还是 资源分配 功能,并将此日志提交给 CDash。它不会记录在 CTest 外部设置的环境变量。

  • 当从源代码构建 CMake 本身且未使用系统提供的 libcurl 时,现在为支持通过 http(s) 进行网络通信的命令(如 file(DOWNLOAD)file(UPLOAD)ctest_submit())启用了 HTTP/2 支持。在 cmake.org 上提供的预编译二进制文件现在支持 HTTP/2。

  • 文件 API cmake-file-api(7) 的 "codemodel" 版本 2 的 version 字段已更新至 2.1。

  • 文件 API cmake-file-api(7) 的 "codemodel" 版本 2 的 "target" 对象在 compileGroups 对象中增加了新的 precompileHeaders 字段。

更新

自 CMake 3.18.0 以来的更改包括:

3.18.1

  • CMAKE_OSX_ARCHITECTURES 未定义时,Xcode 生成器现在默认选择 $(NATIVE_ARCH_ACTUAL) 作为架构(Xcode 的 ARCHS 设置)。这对于 Xcode 12 选择主机架构是必需的,旧版本的 Xcode 默认会这样做。

  • 在 CMake 3.18.0 中,命令 add_test() 支持测试名称中的特殊字符。此项被意外地从发行说明中遗漏了。不幸的是,此修复破坏了先前使用手动引用或转义来规避限制的现有项目。此修复已在 3.18.1 中回滚,但将来可能会在兼容性策略下重新引入。

3.18.2

  • CMAKE_AUTOMOC_PATH_PREFIX 的默认值已更改为 OFF,因为此功能可能会破坏在不同包含目录中具有相同名称的头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。默认值在 3.16.9 和 3.17.5 中也已更改为 OFF

  • 如上所述(c_restrict),MSVC 19.27 的 编译功能 已更新。

3.18.3

  • 如上所述(c_static_assert),MSVC 19.28 的 编译功能 已更新。