隐私计算-SecretFlow/SCQL-激活Bazel项目IDE C++开发能力(代码索引、补齐、检查...)

88 阅读4分钟

SCQL是由Bazel构建的多语言项目。其中Engine是由C ++编写而成,由于其不采用常见的cmake形式搭建,在使用IDE进行开发时,默认情况下IDE是无法对代码进行索引、检查等开发操作的。这无疑对开发效率有极大的影响。而实际上,SCQL项目开发团队虽然没有在文档中说明开发路径,但还是实现了Bazel C++项目的解决方案。

Bazel

Bazel是谷歌开发的一款多语言、跨平台的构建工具,主要用于高效构建和测试软件项目。相比于CMake,Bazel:

  • 更适合多语言混合项目,无需为不同语言维护多套构建逻辑;
  • 大型项目中构建效率更高(增量构建、远程缓存);
  • 跨平台一致性更强,避免「在我电脑上能跑」的问题;
  • 配置更结构化,团队协作时维护成本更低

官方开发脚本 + clangd

在官方社区中,提供devtools/refresh-compile-command-bazel-module.py脚本来刷新compile_commands.json文件。compile_commands.json是一个JSON 格式的编译命令数据库文件,主要用于告诉 C/C++ 语言服务器(如 clangd)如何编译项目中的每个源文件。它记录了每个 .c/.cpp 文件对应的编译选项(如头文件路径、宏定义、C++ 标准版本等)。因此这里博主通过clangd来进行项目开发工作。

C/C++ 项目的编译规则往往很复杂(例如通过 Makefile、CMake、Meson 等构建系统定义),不同源文件可能有不同的编译选项(如 -I 指定头文件路径、-D 定义宏、-std=c++20 指定标准版本)。

clangd作为一款基于 Clang 的 C/C++/Objective-C 语言服务器,本身不直接解析构建系统(如 Makefile),但它可以通过 compile_commands.json 获知每个文件的编译参数,从而像编译器一样 “理解” 代码结构(比如某个宏是否生效、某个头文件在哪里),避免出现 “找不到头文件”“符号未定义” 等误报。

执行步骤

前置环境

首先,我们基于之前文章——开发必备-使用DevContainer技术快速搭建团队开发环境进行基础的开发环境搭建,使得结合VSCode有一个独立的开发环境。

安装clangd

我们需要在VSCode安装clangd插件:

image.png

安装后插件实际会提示,它仍然需要一个clangd的服务器(如果你的环境中没有),因此我们需要在环境中安装一下:

apt-get update
apt install clangd

安装好后,我们会发现c++文件开始爆红,说明clangd已经开始工作了;别担心,爆红只是因为现在clangd还缺少compile_commands.json文件,无法指导clangd正确认识项目。

image.png

使用官方脚本

官方脚本的作用是为 Bazel 项目自动生成 compile_commands.json 文件。Bazel 是一种高效的构建系统,但它不会默认生成 compile_commands.json(C/C++ 语言服务器如 clangd 所需的编译命令数据库)。这个脚本通过集成第三方工具 hedron_compile_commands,简化了为 Bazel 项目生成 compile_commands.json 的流程。

脚本会自动向 Bazel 项目的 MODULE.bazel(Bazel 模块配置文件)中添加 hedron_compile_commands 依赖(这是一个专门用于从 Bazel 提取编译命令的工具):

  1. 临时修改构建配置——备份项目原有的 BUILD.bazel(或 BUILD)和 MODULE.bazel 文件,避免修改影响原项目配置;并向 BUILD.bazel 中添加 refresh_compile_commands 规则,用于触发编译命令提取。
  2. 通过 bazelisk run :refresh_compile_commands 调用工具,根据指定的 Bazel 目标(--targets 参数)提取编译命令,并生成 compile_commands.json
  3. 生成完成后,脚本会自动还原被临时修改的 BUILD.bazel 和 MODULE.bazel 文件,确保项目构建配置不受影响。

安装JDK

使用脚本前,你还需要安装脚本的运行依赖JDK:

apt-get update
apt install openjdk-11-jdk

编译项目

如果个人PC性能受限,限制下构建任务数,避免OOM内存爆炸挂掉。

bazelisk build //engine/exe:scqlengine

# 如果个人PC性能受限,限制下构建任务数
bazelisk build //engine/exe:scqlengine -j 2

运行脚本

python refresh-compile-command-bazel-module.py

重启clangd服务器

image.png

此时clangd将会基于compile_commands.json文件索引项目。

image.png

刷新效果

展示一部分效果:

类型推导

image.png

字段展开

image.png

代码补全

image.png

代码检查

image.png

结尾

本文提供Bazel项目中C++项目代码索引问题的一种解决方案,同时希望对想要学习或开发SCQL的开发者们有所帮助:)

我的SCQL系列文章: