CMake 3.15 发行说明

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

新特性

生成器

语言

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

    Swift 支持是实验性的,不被认为是稳定的,并且可能在 CMake 的未来版本中更改。

编译器

  • 现在支持 Windows 上以 MSVC ABI 为目标但具有类 GNU 命令行 的 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 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 模块学习了通过为 python 语言传递 -interface <library_name> 或为 CSharp 语言传递 -dllimport <library_name>SWIG 编译器来管理备用库名称。

生成器表达式

CTest

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

  • ctest_update() 命令学会了使用一个新的变量: CTEST_UPDATE_VERSION_OVERRIDE。 此变量可以用于指定源代码树的当前版本,而不是使用 update 命令来发现已检出的当前版本。

CPack

  • CPack IFW Generator 获得了一个新的 CPACK_IFW_PACKAGE_STYLE_SHEET 变量,用于自定义安装程序样式表。

已弃用和移除的功能

  • cmake-server(7) 模式已被弃用,并将在 CMake 的未来版本中移除。请将客户端移植为使用 cmake-file-api(7)

  • ADDITIONAL_MAKE_CLEAN_FILES 目录属性现已弃用。请使用 ADDITIONAL_CLEAN_FILES 目录属性代替。

  • 变量 CMAKE_AUTOMOC_RELAXED_MODE 被认为是已弃用的。 仍然存在支持,但将在未来的版本中移除。

  • export(PACKAGE) 命令现在不执行任何操作,除非通过 CMAKE_EXPORT_PACKAGE_REGISTRY 启用。 请参阅策略 CMP0090

  • Xcode 生成器现在至少需要 Xcode 5。

  • 为策略 CMP0066 添加了显式的弃用诊断(CMP0065 及更低版本已被弃用)。 cmake-policies(7) 手册解释说,所有策略的 OLD 行为都已被弃用,项目应移植到 NEW 行为。

其他更改

  • 如果 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 中,针对 MSVC ABI 实现的类 GNU Clang 编译器的支持,使用相应的 -std= 标志实现了 CMAKE_CXX_STANDARD 值 98 和 11。 但是,这些模式不适用于 MSVC 标准库。 因此,即使对于 C++98 和 C++11,CMake 3.15.1 也传递 C++14 标准标志。 这与 MSVC 本身一致,MSVC 本身始终在了解 C++14 的模式下运行。

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

3.15.2

  • 在 CMake 3.15.0 和 3.15.1 中,即使没有 REQUIRED 选项,CMAKE_FIND_PACKAGE_PREFER_CONFIG 变量也会导致 find_package() 命令在缺少软件包时失败。 这已被修复。

3.15.3

  • CrayPrgEnv 编译器包装器支持已针对 Cray Programming Environment 的 19.06 版本进行了更新,在该版本中,XC Cray 系统上的默认链接模式现在是动态的而不是静态的。

3.15.4

  • 在 CMake 3.15.0 到 3.15.3 中,EXCLUDE_FROM_ALL 目录属性从 3.14 之前的行为回归,并导致目录中的目标即使从其自身的 "all" 中也被排除。 这已被修复。 该错误也存在于 3.14.0 到 3.14.6 中,并在 3.14.7 中修复。