IDE 集成指南¶
简介¶
集成开发环境 (IDE) 可能希望与 CMake 集成,以改善 CMake 用户的使用体验。本文档概述了此类集成的推荐最佳实践。
捆绑¶
许多 IDE 供应商会希望与其 IDE 捆绑一个 CMake 副本。捆绑 CMake 的 IDE 应向用户提供使用外部 CMake 安装而不是捆绑副本的选项,以防捆绑副本过时而用户想使用新版本。
虽然 IDE 供应商可能会倾向于在其应用程序中捆绑不同版本的 CMake,但不推荐这样做。CMake 对向后兼容性有严格的保证,因此没有理由不使用比项目所需更新的 CMake 版本,或者事实上,就是最新版本。因此,建议捆绑 CMake 的 IDE 供应商在其应用程序中始终包含发布时可用的最新 CMake 修订版本。
作为一项建议,IDE 也可以附带 Ninja 构建系统副本。Ninja 在支持 CMake 的所有平台上都具有高性能且受良好支持。捆绑 Ninja 的 IDE 应使用 Ninja 1.10 或更高版本,其中包含支持 Fortran 构建所需的功能。
预设¶
CMake 支持一种名为 CMakePresets.json 的文件格式,以及其用户特定的对应文件 CMakeUserPresets.json。此文件包含用户可能需要的各种配置预设的信息。每个预设可以有不同的编译器、构建标志等。该格式的详细信息将在 cmake(1) 手册中进行解释。
鼓励 IDE 供应商像 CMake 一样读取和评估此文件,并向用户展示文件中列出的预设。用户应该能够查看(并可能编辑)为给定预设定义的 CMake 缓存变量、环境变量和命令行选项。然后,IDE 应根据这些设置构造适当的 cmake(1) 命令行参数列表,而不是直接使用 --preset= 选项。--preset= 选项仅用于方便命令行用户,IDE 不应使用它。
例如,如果名为 ninja 的预设将 Ninja 指定为生成器,并将 ${sourceDir}/build 指定为构建目录,则 IDE 不应运行
cmake -S /path/to/source --preset=ninja
IDE 而应计算 ninja 预设的设置,然后运行
cmake -S /path/to/source -B /path/to/source/build -G Ninja
在预设包含大量缓存变量,并且将所有这些变量作为 -D 标志传递会导致超出平台命令行长度限制的情况下,IDE 应改为构造一个临时缓存脚本,并使用 -C 标志传递。
虽然读取、解析和评估 CMakePresets.json 的内容是直接的,但并非易事。除了文档之外,IDE 供应商还可以参考 CMake 源代码和测试用例,以便更好地理解如何实现该格式。此文件 提供了 CMakePresets.json 格式的可机器读取的 JSON 模式,IDE 供应商在验证和提供编辑辅助时可能会发现它很有用。
配置¶
调用 cmake(1) 来运行配置步骤的 IDE 可能希望获取有关构建将生成的工件以及用于构建工件的包含目录、编译定义等信息。此类信息可以通过使用 文件 API 来获取。文件 API 的手册页包含有关 API 及其调用方式的更多信息。从 CMake 3.20 开始,服务器 模式 已被移除,不应在 CMake 3.14 或更高版本上使用。
IDE 应避免创建不必要的构建树,并且仅在用户希望切换到不同的编译器、使用不同的编译标志等时才创建多个构建树。特别是,IDE **不应**创建多个单配置构建树,这些树具有相同的属性,但 CMAKE_BUILD_TYPE 不同,从而有效地创建多配置环境。相反,应为此目的使用 Ninja Multi-Config 生成器,并结合 文件 API 来获取构建配置列表。
IDE 不应使用 Makefile 或 Ninja 生成器的“额外生成器”,这些生成器除了 Makefile 或 Ninja 文件外,还会生成 IDE 项目文件。相反,应使用 文件 API 来获取构建工件列表。
构建¶
如果使用 Makefile 或 Ninja 生成器来生成构建树,则不建议直接调用 make 或 ninja。相反,建议 IDE 调用带有 --build 参数的 cmake(1),这将依次调用适当的构建工具。
如果使用 IDE 项目生成器,例如 Xcode 或 Visual Studio 生成器 中的一个,并且 IDE 理解使用的项目格式,则 IDE 应读取项目文件并像平常一样构建它。
文件 API 可用于从构建树获取构建配置列表,IDE 应向用户显示此列表以供选择构建配置。
测试¶
ctest(1) 支持输出 JSON 格式,其中包含有关可用测试和测试配置的信息。希望运行 CTest 的 IDE 应获取此信息并使用它向用户显示测试列表。
IDE 不应调用生成系统的 test 目标。相反,它们应直接调用 ctest(1)。
集成 CMake 的 IDE¶
以下 IDE 原生支持 CMake
此外,CMake 对某些 IDE 具有内置支持
IDE 构建工具生成器:生成 IDE 原生构建系统,例如 Visual Studio 或
Xcode。额外生成器:扩展 命令行构建工具生成器 以生成挂钩到命令行构建系统的 IDE 项目文件。已被
文件 API取代。