CMake 3.18 版本说明

自 CMake 3.17 以来的更改包括以下内容。

新特性

语言

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

命令行

  • 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() 命令现在如果在没有 APPEND 的情况下多次使用相同的 FILE,则会引发错误。 请参阅策略 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 选项,如果什么也没找到,它将停止处理并显示错误消息。

  • get_property() 命令使用 SOURCE 范围获得了 DIRECTORYTARGET_DIRECTORY 选项,以从提供的目录范围获取属性。

  • get_source_file_property() 命令获得了 DIRECTORYTARGET_DIRECTORY 选项,以从提供的目录范围获取属性。

  • list() 操作 SORT 获得了 NATURAL 排序选项,以使用自然顺序排序(请参阅 strverscmp(3) 手册)。

  • set_property() 命令使用 SOURCE 范围获得了 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

其他

弃用和移除的特性

  • The Documentation 模块已经被 CMP0106 弃用。这个模块本质上是 VTK 代码,CMake 不应该再发布它了。

  • 针对策略 CMP0070 和策略 CMP0071 新增了一个显式弃用诊断(CMP0069 及以下已经过时)。The cmake-policies(7) 手册解释说,所有策略的 OLD 行为都是过时的,项目应该移植到 NEW 行为。

其他变更

  • 在 Windows 上,The NinjaNinja Multi-Config 生成器,如果没有显式指定编译器,现在会选择 PATH 环境变量中列出的目录中找到的第一个编译器(无论名称)。

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

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

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

  • The FindPackageHandleStandardArgs 模块选项 REQUIRED_VARS 现在是可选的,如果指定了 HANDLE_COMPONENTS

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

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

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

  • cmake-file-api(7) 中,"codemodel" 版本 2 的 version 字段已更新为 2.1。

  • 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 中恢复,但可能会在将来的 CMake 版本中重新引入,并具有兼容性策略。

3.18.2

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

  • 如上所述 (c_restrict),Compile Features 功能已针对 MSVC 19.27 更新。

3.18.3

  • 如上所述 (c_static_assert),Compile Features 功能已针对 MSVC 19.28 更新。