CMake 3.15 版本说明

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

新特性

生成器

语言

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

    Swift 支持属于实验性支持,尚未稳定,并且可能在未来的 CMake 版本中发生改变。

编译器

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

  • 添加了基于 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 Library1 Library2

  • 添加了 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 模块经过重新设计,以在其“配置”和“模块”模式之间以及与其他查找模块之间呈现更加一致的用户体验。

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

    • 添加了新的输出变量 Boost_VERSION_MACROBoost_VERSION_MAJORBoost_VERSION_MINORBoost_VERSION_PATCHBoost_VERSION_COUNT

    • 传递给 find_package()QUIET 参数在配置模式下不再被忽略。请注意,随 Boost 1.70.0 一起提供的 CMake 软件包会忽略传递给 find_package()QUIET 参数。这已在 Boost 的下一个版本中得到修复。

    • 输入开关 Boost_DETAILED_FAILURE_MSG 已被移除。

    • Boost_VERSION 现以 x.y.z 格式在模块模式中报告该版本。参阅策略 CMP0093

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

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

  • FindGLEW 模块现提供了一个界面,其与上游 GLEW 在其自己的 CMake 包文件中提供的更为一致。

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

  • FindPostgreSQL 模块已学会分别查找调试和发行变量。

  • 模块 FindPython3FindPython2FindPython 已经获得额外的查找策略和控件,以及新的默认设置。参阅策略 CMP0094

  • 模块 FindPythonFindPython2FindPython3 增加了一个新目标(分别为 Python::ModulePython2::ModulePython3::Module),可用于开发 Python 模块。

  • 模块 FindPython3FindPython2FindPython 具备了控制如何处理虚拟环境的能力。

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

生成器表达式

CTest

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

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

CPack

已过时和移除的功能

其他更改

  • 如果通过 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。请参阅策略 CMP0092

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

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

更新

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

3.15.1

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

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

3.15.2

3.15.3

  • CrayPrgEnv 编译器封装已针对 19.06 版 Cray 编程环境更新,在 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 中修复。