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 命令行 Dashboard Client 模式(例如 ctest -S)中使用此值,请在 CTestConfig.cmake 配置文件中设置它。

CPack

其他

  • cmake(1) -E 模式获得了对 sha1sumsha224sumsha256sumsha384sumsha512sum 的支持。

  • graphviz 输出现在区分了不同的依赖类型 PUBLICPRIVATEINTERFACE,并在输出图中将它们表示为实线、虚线和点线边。

已弃用和移除的特性

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

  • 已放弃在 HP-UX 上构建 CMake 的支持,等待更好地支持 C++11 和 libuv 的移植。请参阅 CMake Issue 17137。对于 HP-UX 支持,请改用 CMake 3.9 或更低版本。

其他更改

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

  • file(GENERATE) 命令现在相对于调用者的当前二进制目录和源目录分别解释传递给其 OUTPUTINPUT 参数的相对路径。请参阅策略 CMP0070

  • get_filename_component() PROGRAM 模式语义已修订为不容忍程序路径中未加引号的空格,同时接受参数。虽然在技术上与旧行为不兼容,但预计在使用正确引号的命令行的一般用例下的行为没有改变。

更新

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

3.10.1

  • CMake 3.10.0 添加的 cmake-server(7) codemodel 响应交叉引用字段已删除,原因是内存使用过多。将需要另一种方法来提供回溯信息。

3.10.3

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