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 脚本被包含多次。该命令支持 `DIRECTORY` 和 `GLOBAL` 选项来调整相应的包含保护范围。如果未提供选项,包含保护类似于基于变量的基本检查。

  • 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

  • 当使用多配置生成器(例如 Xcode)并使用 `AUTOMOC` 或 `AUTOUIC` 时,包含的 `*.moc`、`moc_*.cpp` 和 `ui_*.h` 文件将生成在 `/include_` 而不是 `/include`。

  • 当使用 `AUTOMOC` 或 `AUTOUIC` 时,将被标记为 `GENERATED` 的源文件也将被处理。在早期版本中,`AUTOMOC` 和 `AUTOUIC` 会忽略这些文件。请参阅策略 CMP0071

  • 当使用 `AUTOMOC` 时,CMake 会在源文件中搜索 `Q_OBJECT`、`Q_GADGET` 或 `Q_NAMESPACE` 字符串,以确定它是否需要 `moc` 处理。新的 CMAKE_AUTOMOC_MACRO_NAMES 变量和 AUTOMOC_MACRO_NAMES 目标属性可以设置为注册要搜索的其他字符串(宏名称)。

  • 当使用 `AUTOMOC` 时,新的 CMAKE_AUTOMOC_COMPILER_PREDEFINES 变量和 AUTOMOC_COMPILER_PREDEFINES 目标属性指定是否启用或禁用编译器预定义文件 `moc_predefs.h` 的生成。

CTest

  • 添加了 CTEST_LABELS_FOR_SUBPROJECTS CTest 模块变量和 CTest 脚本变量,用于指定应被 CDash 视为子项目的标签列表。要在 CTest 模块和 ctest 命令行 Dashboard Client 模式(例如 `ctest -S`)中使用此值,请在 `CTestConfig.cmake` 配置文件中设置它。

CPack

其他

  • `cmake(1)` 的 `-E` 模式已获得对 `sha1sum`、`sha224sum`、`sha256sum`、`sha384sum` 和 `sha512sum` 的支持。

  • Graphviz 输出现在区分不同依赖类型 `PUBLIC`、`PRIVATE` 和 `INTERFACE`,并在输出图中表示为实线、虚线和点线。

已弃用和已删除的功能

  • 已放弃对使用 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)` 命令现在解释其 `OUTPUT` 和 `INPUT` 参数中给出的相对路径,分别相对于调用者的当前二进制目录和源目录。请参阅策略 CMP0070

  • `get_filename_component()` 命令的 `PROGRAM` 模式语义已修订,不再容忍路径中未引用的空格,同时接受参数。虽然在技术上与旧行为不兼容,但预计在典型用例中,带有正确引用的命令行下的行为不会改变。

更新

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

3.10.1

  • `cmake-server(7)` `codemodel` 响应的 cross-references 字段(由 3.10.0 添加)已因过大的内存使用而被删除。需要另一种方法来提供回溯信息。

3.10.3

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