跳到主要内容

生成 compile_commands.json

背景

compile_commands.json 是 clangd 用来索引项目代码的文件,用于代码跳转,代码补全,代码重构等功能。许多 IDE 和编辑器使用基于 clangd 的 LSP 来支持 C/C++ 项目,envoy 是基于 C++ 的大型项目,想要对 envoy 源码进行索引,就需要先生成 compile_commands.json,本文介绍如何生成。

编译 envoy

修改 bazel/repositories_extra.bzl,将 ignore_root_user_error = False 改为 ignore_root_user_error = True:

def envoy_dependencies_extra(
python_version = PYTHON_VERSION,
ignore_root_user_error = True):

启动 envoy 的 编译容器一次:

./ci/run_envoy_docker.sh bash

然后退出容器,用刚启动的容器对应的镜像再手动拉起一个容器:

docker run --rm -it -v /data:/data envoyproxy/envoy-build-ubuntu:41c5a05d708972d703661b702a63ef5060125c33 bash

注意替换镜像的 tag

我将源码存放到 /data 数据盘目录,避免占用系统盘空间。

进入项目目录,执行编译:

bazel build envoy 

不加 -c opt 编译来优化编译,加快编译速度,耐心等待几小时

生成compile_commands.json

TEST_TMPDIR=/tmp ./tools/gen_compilation_database.py

执行完后在项目根目录会生成 compile_commands.json,用于 clangd 对项目代码进行索引,这样才能正常跳转代码。

解决 unknown argument

查看代码时,第一行可能会报 unknown argument: xxx 之类的错,解决方法是在项目根目录创建 .clangd 文件,加入以下内容:

CompileFlags:
Add: -Wno-unknown-warning-option
Remove: [-m*, -f*]

其它

清理cache:

bazel clean --expunge