CMake 3.15 发行说明

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

新功能

生成器

语言

  • Swift 语言的初步支持已添加到 Ninja 生成器中:

    Swift 支持是实验性的,不被认为是稳定的,并且可能会在未来的 CMake 版本中发生变化。

编译器

  • 现在支持针对 MSVC ABI 但具有类似 GNU 命令行的 Windows 上的 Clang 编译器变体。

  • 添加了对基于 Clang 的 ARM 编译器的支持,编译器 ID 为“ARMClang”。

  • 添加了对 IAR 编译器架构 Renesas RX、RL78、RH850 和 Texas Instruments MSP430 的支持。

  • 添加了对为 Linux 构建的 IAR 编译器 (IAR BuildLx) 的支持。

命令行

  • 添加了 CMAKE_GENERATOR 环境变量,以指定在运行 cmake(1) 时没有使用 -G 选项时使用的默认生成器。此外,还创建了环境变量 CMAKE_GENERATOR_PLATFORMCMAKE_GENERATOR_TOOLSETCMAKE_GENERATOR_INSTANCE 来配置生成器。

  • cmake(1) --build 工具 --target 参数获得了对多个目标的支持,例如``cmake --build 。 --target Library1 Library2``。它现在也有一个简短的“-t”别名,例如``cmake --build 。 -t 图书馆 1 图书馆 2``。

  • cmake(1) 命令获得了一个新的 --install 选项。这可以在构建项目后使用,以在不使用生成的构建系统或本机构建工具的情况下运行安装。

  • cmake(1) 命令学习了一个新的 CLI 选项 --loglevel

  • cmake(1) -E remove_directory 命令行工具学会了支持删除多个目录。

  • cmake(1) -E tar` 工具已得到改进:

    • 它现在继续将文件添加到存档中,即使某些文件不可读。此行为与经典的“tar”工具更一致。

    • 它现在解析所有标志,如果提供了无效标志,则会发出警告。

    • 如果未指定操作标志,它现在会显示错误,并显示可能的操作列表:``t``(列表)、``c``(创建)或 ``x``(提取)。

    • 它现在支持仅提取(-x)或列出(-t)特定文件或目录。

    • 它现在支持带有 --zstd 选项的 Zstandard 压缩。 Zstandard 旨在提供与 DEFLATE (zip) 算法相当的压缩率,但速度更快,尤其是对于解压缩。

命令

  • add_custom_command()add_custom_target() 命令获得了一个新的 JOB_POOL 选项,该选项与 Ninja 生成器一起使用以在构建语句中设置池变量。

  • add_library() 命令 ALIAS 选项学会了支持 UNKNOWN 类型的导入库。

  • cmake_parse_arguments() 命令获得了一个额外的``<prefix>_KEYWORDS_MISSING_VALUES`` 输出变量来报告调用者提供的没有值的关键字参数。

  • execute_process() 命令获得了 COMMAND_ECHO 选项并支持 CMAKE_EXECUTE_PROCESS_COMMAND_ECHO 变量以在执行前启用命令行字符串的回显。

  • file(INSTALL) 命令学习了一个新参数,FOLLOW_SYMLINK_CHAIN,可用于递归解析和安装符号链接。

  • list() 学习了新的子命令:PREPENDPOP_FRONTPOP_BACK

  • message() 命令学习了新类型:NOTICEVERBOSEDEBUGTRACE

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

变量

特性

模块

  • FindBoost 模块经过重新设计,以在其“Config”和“Module”模式之间以及与其他一般查找模块之间提供更一致的用户体验。

    • 现在定义了一个新的导入目标“Boost::headers”(与“Boost::boost”相同)。

    • 添加了新的输出变量“Boost_VERSION_MACRO”、“Boost_VERSION_MAJOR”、“Boost_VERSION_MINOR”、“Boost_VERSION_PATCH”和“Boost_VERSION_COUNT”。

    • 传递给 find_package()QUIET 参数在配置模式下不再被忽略。请注意,Boost 1.70.0 附带的 CMake 包会忽略传递给 find_package 的 QUIET 参数。这将在下一个 Boost 版本中修复。

    • 输入开关“Boost_DETAILED_FAILURE_MSG”已被删除。

    • Boost_VERSION 现在在模块模式下以 x.y.z 格式报告版本。请参阅政策:policy:CMP0093

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

  • 添加了 FindEnvModules 模块以在 CTest Scripts 中使用基于 Lua 和 TCL 的环境模块。

  • FindGLEW 模块现在提供的接口与上游 GLEW 在其自己的 CMake 包文件中提供的接口更加一致。

  • FindPkgConfig 现在使用其他(非库)链接器标志填充导入目标的 INTERFACE_LINK_OPTIONS 属性。

  • FindPostgreSQL 模块学会了分别查找调试和发布变体。

  • 模块 FindPython3FindPython2FindPython 获得了额外的查找策略和控制,以及一个新的默认值。请参阅政策:policy:CMP0094

  • 模块 FindPythonFindPython2FindPython3 获得一个新目标(分别是 Python::ModulePython2::ModulePython3:: Module) 可用于开发 Python 模块。

  • 模块 FindPython3、FindPython2 和 FindPython 获得控制虚拟环境处理方式的能力。

  • UseSWIG 模块学会了通过为 python 语言传递 -interface <library_name> 或为 CSharp 语言传递 -dllimport <library_name> 来管理备用库名称``SWIG`` 编译器。

生成器表达式

C测试

  • ctest_submit() 命令学习了一个新选项:BUILD_ID。这可用于将 CDash 分配给此构建的 ID 存储到变量中。

  • ctest_update() 命令学习了一个新变量: CTEST_UPDATE_VERSION_OVERRIDE。这可用于指定源代码树的当前版本,而不是使用更新命令来发现签出的当前版本。

包装

弃用和删除的功能

其他变化

  • 如果 target_compile_features() 指定的功能在编译器的默认标准级别可用,CMake 3.14 及以下版本会错误地添加不必要的 -std= 标志,这可能会降低标准级别。此错误已在 CMake 3.15 中修复。此行为更改可能会暴露现有项目中的错误,这些错误依赖于未记录的实施细节。指定编译功能只能确保编译器在具有这些功能的模式下运行,而不是使用任何特定的标准级别或传递明确的“-std=”标志。

  • CMake 学习了如何使用 IBM AIX XL 编译器和 SunPro 编译器编译 C++14,以及如何使用 AppleClang 编译器编译 C++20。

  • 对于类似 MSVC 的编译器,CMAKE_<LANG>_FLAGS 的值默认不再包含警告标志,如 /W3`。请参阅政策:policy:CMP0092

  • 定义 __ibmxl__ 的基于 IBM Clang 的 XL 编译器现在使用编译器 ID XLClang 而不是 XL。请参阅政策:policy:CMP0089

  • file(REMOVE)file(REMOVE_RECURSE) 命令已更改为忽略带有警告的空参数,而不是将它们视为相对路径并删除当前目录的内容。

更新

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

3.15.1

  • 在 CMake 3.15.0 中,支持针对 MSVC ABI 的类 GNU Clang 编译器实现 CMAKE_CXX_STANDARD 值 98 和 11 使用相应的 -std= 标志。但是,这些模式不适用于 MSVC 标准库。因此,CMake 3.15.1 通过了 C++14 标准标志,即使对于 C++98 和 C++11。这与 MSVC 本身一致,MSVC 始终以 C++14 感知模式运行。

  • 3.15.0 中添加的初步 Swift 支持已更新。

3.15.2

3.15.3

  • CrayPrgEnv 编译器包装器支持已针对 Cray 编程环境的 19.06 版本更新,XC Cray 系统上的默认链接模式现在是动态的而不是静态的。

3.15.4

  • 在 CMake 3.15.0 到 3.15.3 中, EXCLUDE_FROM_ALL 目录属性从 3.14 之前的行为中退化,导致目录中的目标甚至被排除在它自己的“全部”之外。这已得到修复。该错误也存在于 3.14.0 到 3.14.6 中,并在 3.14.7 中得到修复。