CMake 3.18 发行说明

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

新功能

语言

  • 现在可以在非 Windows 平台上使用 Clang 编译 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() 命令现在会在没有 APPEND 的情况下多次使用相同的 FILE 时引发错误。请参阅政策:policy: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 子命令,它将字符串转换为十六进制表示。

变量

  • 添加了 CMAKE_CUDA_ARCHITECTURES 变量以指定 CUDA 输出架构。鼓励用户使用它而不是手动指定选项,因为这种方法与编译器无关。当 CMAKE_CUDA_COMPILER_IDNVIDIA 时,该变量会自动初始化。该变量用于初始化新的 CUDA_ARCHITECTURES 目标属性。请参阅政策:policy:CMP0104

  • 添加了 CMAKE_PCH_WARN_INVALID 变量来初始化 PCH_WARN_INVALID 目标属性,以允许删除预编译标头无效警告。

特性

模块

  • 添加了 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.Module`` 和``Development.Embed``。

    • 获得了指定要查找哪些 Python 实现的能力,包括“IronPython”和“PyPy”。

  • 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 模块现在提供导入的目标。

  • 如果 SWIG_EXECUTABLE 是 SWIG-Fortran,那么 UseSWIG 模块现在支持 Fortran 作为目标语言。

生成器表达式

C测试

  • ctest(1) 获得了一个新的 CTEST_RESOURCE_SPEC_FILE 变量,可用于指定:ref:资源规范文件 <ctest-resource-specification-file>

  • ctest(1) 获得了一个 --stop-on-failure 选项,可以用来在测试失败后停止运行测试。

  • ctest_test() 命令获得了一个 STOP_ON_FAILURE 选项,该选项可用于在测试失败后停止运行测试。

  • CTestCoverageCollectGCOV 模块 ctest_coverage_collect_gcov() 命令获得了一个 TARBALL_COMPRESSION 选项来控制对收集结果的 tarball 的压缩。

包装

其他

弃用和删除的功能

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

  • 为策略“CMP0070”和策略“CMP0071”添加了明确的弃用诊断(“CMP0069”及以下已弃用)。 cmake-policies(7) 手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。

其他变化

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

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

  • 创建覆盖现有目标的“ALIAS”目标现在会引发错误。请参阅政策:policy:CMP0107

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

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

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

  • ctest(1) 现在记录它为每个测试设置的环境变量,这可能是由于 ENVIRONMENT 属性或 resource allocation 特性,和将此日志提交给 CDash。它不会记录在 CTest 之外设置的环境变量。

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

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

  • cmake-file-api(7) “codemodel” version 2 “target” 对象在 compileGroups 对象中获得了一个新的 precompileHeaders 字段。

更新

自 CMake 3.18.0 以来所做的更改包括以下内容。

3.18.1

  • Xcode 生成器,当 CMAKE_OSX_ARCHITECTURES 未定义时,现在选择 $(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 中,默认值也更改为“关闭”。

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

3.18.3

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