IDE 集成指南

简介

集成开发环境 (IDE) 可能想与 CMake 集成以提升 CMake 用户的开发体验。此文档阐述对此类集成推荐的最佳实践。

捆绑

许多 IDE 供应商会希望将 CMake 副本与其 IDE 捆绑在一起。捆绑 CMake 的 IDE 应向用户展示使用外部 CMake 安装而非捆绑安装的选项,以防捆绑副本过时且用户想使用较新版本。

虽然 IDE 供应商可能会倾向于将其应用程序与不同版本的 CMake 捆绑在一起,但这种做法不推荐。CMake 对向后兼容性有强有力的保障,并且没有理由不使用比项目要求的较新 CMake 版本,或者最新版本。因此,建议与应用程序捆绑 CMake 的 IDE 供应商始终在发布时加入可用的最新补丁版本的 CMake。

作为建议,IDE 也可能会与 CMake 一起提供 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

而应计算 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 可能希望接收构建将生成的内容以及构建内容所用的包含目录、编译定义等的信息。File API 可用于获取此类信息。File API 的手册页包含有关 API 及如何调用的详细信息。从 CMake 3.20 开始,Server mode 已被移除,请勿在 CMake 3.14 或更高版本中使用。

IDE 应该避免创建多余的构建树,并且仅在用户希望切换到其他编译器、使用不同的编译标志时创建多个构建树。特别是,不应创建多个单配置构建树,它们除了不同的 CMAKE_BUILD_TYPE 以外属性均相同,这实际上会创建一个多配置环境。而是 Ninja Multi-Config 生成器与 File API(以获取构建配置的列表)结合使用,应将其用于此目的。

IDE 不应使用 Makefiles 或 Ninja 生成器的“附加生成器”,这些生成器在 Makefile 或 Ninja 文件中生成 IDE 项目文件。而是 File API 可用于获取构建项目列表。

构建

如果 Makefiles 或 Ninja 生成器用于生成构建树,则不建议直接调用 makeninja。而建议 IDE 调用 cmake(1) 及其 --build 自变量,后者将反过来调用相应的构建工具。

如果使用 IDE 项目生成器(如 Xcode 或 Visual Studio 生成器之一)并且 IDE 了解所使用的项目格式,那么 IDE 应读取项目文件并照常构建项目文件。

可以使用 File API 从构建树中获取构建配置的列表,并且 IDE 应将该列表呈现给用户,以便选择构建配置。

测试

ctest(1) 支持以 JSON 格式输出有关可用测试和测试配置的信息。想要运行 CTest 的 IDE 应获取此信息并使用它向用户展示测试列表。

IDE 不应调用生成的构建系统的 test 目标。相反,它们应该直接调用 ctest(1)

带有 CMake 集成的 IDE

以下 IDE 本机支持 CMake

此外,CMake 对某些 IDE 具有内置支持