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 生成器用于生成构建树,则不建议直接调用 make
或 ninja
。而建议 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 具有内置支持
IDE 构建工具生成器:生成原生构建系统,例如 Visual Studio 或 Xcode。
其他生成器:扩展 命令行构建工具生成器 以生成连接到命令行构建系统的 IDE 项目文件。已被
文件 API
取代。