CMake 3.15 版本说明

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

新功能

生成器

语言

  • Ninja 生成器添加了对 Swift 语言的初步支持

    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)特定文件或目录。

    • 它现在支持 Zstandard 压缩,并带有 --zstd 选项。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_MACROBoost_VERSION_MAJORBoost_VERSION_MINORBoost_VERSION_PATCHBoost_VERSION_COUNT

    • 传递给 find_package()QUIET 参数在配置模式下不再被忽略。请注意,CMake 随 Boost 1.70.0 提供的包会忽略传递给 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 模块增加了管理替代库名称的功能,通过为 python 语言传递 -interface <library_name> 或为 CSharp 语言传递 -dllimport <library_name>SWIG 编译器。

生成器表达式

CTest

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

  • ctest_update() 命令现在可以识别一个新变量:CTEST_UPDATE_VERSION_OVERRIDE。这可以用来指定源代码树的当前版本,而不是使用 update 命令来发现当前签出的版本。

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__ 的基于 Clang 的 IBM XL 编译器现在使用编译器 ID XLClang 而不是 XL。请参阅策略 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++98 和 C++11 也传递 C++14 标准标志。这与 MSVC 本身一致,它总是以感知 C++14 的模式运行。

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

3.15.2

3.15.3

  • Cray PrgEnv 编译器包装器支持已为 Cray 编程环境的 19.06 版本进行了更新,该版本在 XC Cray 系统上默认的链接模式已从静态改为动态。

3.15.4

  • 在 CMake 3.15.0 到 3.15.3 版本中,目录属性 EXCLUDE_FROM_ALL 相对于 3.14 之前的行为出现了回归,导致目录内的目标即使在其自身的“all”目标中也被排除。此问题已修复。此 bug 也存在于 3.14.0 至 3.14.6 版本中,并在 3.14.7 版本中修复。