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 选项。

  • 如果多次使用相同的 FILE 而没有 APPENDexport() 命令现在会引发错误。请参阅策略 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 选项,以从提供的目录作用域获取属性。

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

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

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

  • 具有 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 模块现在接受目标语言作为 find_packageCOMPONENTSOPTIONAL_COMPONENTS 参数。

  • GoogleTest 模块 gtest_discover_tests() 命令

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

    • 获得了一个新的可选参数 XML_OUTPUT_DIR。设置后,JUnit XML 测试结果将存储在该目录中。

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

  • 如果 SWIG_EXECUTABLESWIG-FortranUseSWIG 模块现在支持 Fortran 作为目标语言。

生成器表达式

CTest

CPack

其他

已弃用和移除的特性

  • Documentation 模块已通过 CMP0106 弃用。此模块本质上是 VTK 代码,CMake 不应再附带它。

  • 为策略 CMP0070 和策略 CMP0071 添加了显式弃用诊断(CMP0069 及以下版本已被弃用)。cmake-policies(7) 手册解释说,所有策略的 OLD 行为都已弃用,项目应移植到 NEW 行为。

其他更改

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

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

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

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

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

  • 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

  • 如上所述,编译特性 功能已针对 MSVC 19.27 进行了更新 (c_restrict)。

3.18.3

  • 如上所述,编译特性 功能已针对 MSVC 19.28 进行了更新 (c_static_assert)。