集成开发环境集成指南

介绍

集成开发环境 (IDE) 可能希望与 CMake 集成以改善 CMake 用户的开发体验。本文档列出了此类集成的推荐最佳实践。

捆绑

许多集成开发环境供应商希望将 CMake 的副本与他们的集成开发环境捆绑在一起。捆绑 CMake 的集成开发环境应该向用户提供使用外部 CMake 安装而不是捆绑的选项,以防捆绑的副本过时并且用户想要使用更新的版本。

虽然集成开发环境供应商可能会尝试将不同版本的 CMake 与他们的应用程序捆绑在一起,但不推荐这种做法。 CMake 具有很强的向后兼容性保证,没有理由不使用比项目所需的更新版本的 CMake,或者实际上是最新版本。因此,建议将 CMake 与其应用程序捆绑在一起的集成开发环境供应商始终包含在发布时可用的最新补丁版本的 CMake。

作为建议,集成开发环境还可以随 CMake 一起提供 Ninja 构建系统的副本。 Ninja 在支持 CMake 的所有平台上都具有高性能和良好的支持。捆绑 Ninja 的集成开发环境应该使用 Ninja 1.10 或更高版本,其中包含支持 Fortran 构建所需的功能。

预设

CMake 支持一种名为“CMakePresets.json”的文件格式,以及它的用户特定对应格式“CMakeUserPresets.json”。该文件包含有关用户可能需要的各种配置预设的信息。每个预设可能有不同的编译器、构建标志等。此格式的详细信息在 cmake(1) 手册中进行了解释。

鼓励集成开发环境供应商以与 CMake 相同的方式阅读和评估此文件,并向用户提供文件中列出的预设。用户应该能够看到(并可能编辑)为给定预设定义的 CMake 缓存变量、环境变量和命令行选项。然后,集成开发环境应该根据这些设置构建适当的 cmake(1) 命令行参数列表,而不是直接使用 --preset= 选项。 --preset= 选项仅用作命令行用户的方便前端,不应由集成开发环境使用。

例如,如果名为“ninja”的预设指定“Ninja”作为生成器,“${sourceDir}/build”作为构建目录,而不是运行:

cmake -S /path/to/source --preset=ninja

集成开发环境应该计算 ninja 预设的设置,然后运行:

cmake -S /path/to/source -B /path/to/source/build -G Ninja

如果预设包含大量缓存变量,并且将它们全部作为 -D 标志传递会导致超过平台的命令行长度限制,集成开发环境应该构造一个临时缓存脚本并使用 -C 标志传递它。

虽然读取、解析和评估 CMakePresets.json 的内容很简单,但并不简单。除了文档之外,集成开发环境供应商还可能希望参考 CMake 源代码和测试用例,以便更好地了解如何实现该格式。 此文件CMakePresets.json 格式提供机器可读的 JSON 模式,集成开发环境供应商可能会发现它对验证和提供编辑很有用协助。

配置

调用 cmake(1) 来运行配置步骤的集成开发环境可能希望接收有关构建将产生的工件的信息,以及用于构建工件的包含目录、编译定义等。此类信息可以通过使用 文件应用编程接口 获得。文件 API 的手册页包含有关 API 以及如何调用它的更多信息。 服务器模式 已从 CMake 3.20 中删除,不应在 CMake 3.14 或更高版本上使用。

集成开发环境应避免创建不必要的构建树,并且仅在用户希望切换到不同的编译器、使用不同的编译标志等时才创建多个构建树。特别是,集成开发环境不应创建多个单一配置的构建树,这些构建树都具有除了不同的 CMAKE_BUILD_TYPE 之外,它们具有相同的属性,有效地创建了一个多配置环境。相反, Ninja Multi-Config 生成器,结合 文件应用编程接口 来获取构建配置列表,应该用于此目的。

集成开发环境不应将“额外生成器”与 Makefile 或 Ninja 生成器一起使用,它们会生成集成开发环境项目文件以及 Makefile 或 Ninja 文件。相反,应该使用 文件应用编程接口 来获取构建工件列表。

构建

如果使用 Makefile 或 Ninja 生成器生成构建树,不建议直接调用 makeninja 。相反,建议集成开发环境使用 --build 参数调用 cmake(1) ,这将依次调用适当的构建工具。

如果使用集成开发环境项目生成器,例如 Xcode 或虚拟实验室生成器之一,并且集成开发环境理解所使用的项目格式,则集成开发环境应该读取项目文件并按照与其他方式相同的方式构建它。

文件应用编程接口 可用于从构建树中获取构建配置列表,集成开发环境应将此列表呈现给用户以选择构建配置。

测试

ctest(1) 支持输出包含可用测试和测试配置信息的 JSON 格式。想要运行 CTest 的集成开发环境应该获取此信息并使用它向用户提供测试列表。

集成开发环境不应调用生成的构建系统的“测试”目标。相反,他们应该直接调用 ctest(1)

集成 CMake 的集成开发环境

以下集成开发环境原生支持 CMake:

此外,CMake 内置了对某些集成开发环境的支持: