CMake 3.10 发行说明

自 CMake 3.9 以来做出的更改包括以下内容。

新增功能

平台

  • 现已支持 flang Fortran 编译器,编译器 ID 为 Flang

  • 已添加 Midipix 的新的最小平台文件。

  • 已添加对 MSVC ARM64 架构的支持。Visual Studio 2017 Update 4 及以上版本提供了 ARM64 工具链。

  • 对 IAR ARM 编译器的支持已经得到改善。

生成器

命令

  • cmake_host_system_information() 命令已经了解更多有关处理器功能和主机操作系统版本信息的获取密钥。

  • configure_file() 命令学习通过缩进的 #  cmakedefine#  cmakedefine01。在 # 字符与 cmakedefine/cmakedefine01 词之间的空格和/或制表符现在可以在输出中理解并保留。

  • execute_process() 命令获得了 RESULTS_VARIABLE 选项,以收集来自一个进程管道中所有子项的结果列表,当提供多个 COMMAND 参数时。

  • include_guard() 命令已引入,允许保护 CMake 脚本不包含多次。该命令支持 DIRECTORYGLOBAL 选项,以调整相应的包含保护范围。如果没有给出选项,则包含保护类似于基本的基于变量的检查。

  • string() 命令学习了一个新的 PREPEND 子命令。

  • string(TIMESTAMP) 命令现在支持 %A 表示全星期名称和 %B 表示全月名称。

变量

属性

模块

  • FindCurses模块获取了CURSES_NEED_WIDE选项来请求宽字符变体。

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

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

  • FindMPI获取了许多新特性,包括

    • 模块中已添加特定于语言的组件。

    • 现在支持更多 MPI 环境。

    • 已经改进了对 Fortran 的环境支持。

    • 用户现在可以精细地控制 MPI 选择流程,包括将自定义参数传递给 MPI 编译器。

    • 现已公开实现的 MPI 标准的版本。

    • 现在可以检测 MPI-2 C++ 绑定,并在需要时对其进行禁止。

    • 现已检测并验证可用 Fortran 绑定。

    • 可以请求各种 MPI-3 信息,包括库版本和各绑定程序的 Fortran 功能。

    • 支持静态链接的 MPI 实现。

  • 一个 FindOpenACC 模块被添加到检测对 OpenACC 的编译器支持。目前仅支持 PGI、GNU 和 Cray 编译器。

  • FindOpenGL 模块获得了对 Linux 上的 GLVND 的支持。

  • FindOpenMP 模块获得了对特定于语言的组件的支持。

  • 一个 FindPatch 模块被添加到查找 patch 命令行可执行文件。

  • FindProtobuf 模块 protobuf_generate_cpp() 命令获取 DESCRIPTORS 选项以生成描述符文件。

  • GoogleTest 模块获取一个新命令 gtest_discover_tests() 实现动态(构建时)测试发现。不同于源解析方法,动态发现会在构建时执行测试(在“列出可用测试”模式中)以发现测试。这对于标注测试的异常方法是可靠的,为参数化测试等高级功能提供了更好的支持,并且不需要重新运行 CMake 即可检测测试可执行文件中添加或删除的测试。请注意, CMake 3.10.3 中进行了破坏性更改,以解决 TIMEOUT 关键字的歧义(请参阅 3.10.3)。

  • InstallRequiredSystemLibraries 模块获得了安装 Intel 编译器运行时的支持。

Autogen

CTest

  • CTEST_LABELS_FOR_SUBPROJECTS CTest 模块变量和 CTest 脚本变量被添加以指定一组 CDash 将其视为子项目的标签。要在 CTest 模块以及 控制面板客户端 模式(例如 ctest -S)中使用此值,在 CTestConfig.cmake 配置文件中进行设置。

CPack

其他信息

  • cmake(1) -E 模式支持 sha1sumsha224sumsha256sumsha384sumsha512sum

  • graphviz 输出现在可区分不同类型依赖项 PUBLICPRIVATEINTERFACE,并在输出图形中用实线、虚线和点线表示它们。

已弃用和已移除特性

  • 放弃使用 C++98 编译器构建 CMake 本身。现使用 C++11 实现 CMake。

  • 放弃在 HP-UX 上构建 CMake,直到 C++11 和 libuv 端口获得更好的支持。请参见 CMake 问题 17137。请改用 CMake 3.9 或更低版本以支持 HP-UX。

其他更改

  • 在 FreeBSD 上,C++ 编译器命名为 c++ 现在是首选默认值。

  • file(GENERATE) 命令现在相对于调用方的当前二进制和源目录解释提供给其 OUTPUTINPUT 参数的相对路径。请参见策略 CMP0070

  • get_filename_component() PROGRAM 模式语义已经过修订,在接受参数的同时不容忍程序路径中出现未加引号的空格。虽然技术上与旧行为不兼容,但预计采用带引号正确命令行的典型用例下的行为未发生变化。

更新

自 CMake 3.10.0 以来所做的变更包括以下内容。

3.10.1

  • cmake-server(7) codemodel 响应交叉引用字段(由 3.10.0 添加)现已废除,原因是内存使用过多。需要采用其他方法来提供回溯信息。

3.10.3

  • CMake 3.10.1 添加了一个 TIMEOUT 选项到 gtest_discover_tests() 中,该选项来自 GoogleTest 模块。该关键字与 TIMEOUT 测试属性冲突,该属性是使用命令的 PROPERTIES 关键字设置的常见属性之一,这通常会导致合法但非预期的行为。在 CMake 3.10.3 中,该关键字被更改为 DISCOVERY_TIMEOUT,以解决此问题。3.10.1 和 3.10.2 中 gtest_discover_tests() 命令的 TIMEOUT 关键字的不明确行为尚未保留。