前面的文章 完美的 c++ 项目代码定义跳转 介绍了对使用 Bazel 进行构建的项目生成
compile_commands.json
。envoy 是使用 Bazel 进行构建的大型 c++ 开源项目,使用
rtags 的代码跳转功能可以方便地调试、阅读 envoy 源代码。
最新的 envoy 已包含创建 compile_commands.json
相关脚本,但是缺乏相关使用文档,这里我们选择为 envoy 1.7.0
手工创建 compile_commands.json
。
下载 envoy 1.7.0 源代码
git clone https://github.com/envoyproxy/envoy.git -b v1.7.0
安装 Bazel
参考 envoy/README.md 安装 Bazelisk 以支持使用任意 Bazel 版本
sudo mkdir -p /opt/local/bin sudo wget -O /opt/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/v0.0.8/bazelisk-linux-amd64 sudo chmod +x /opt/local/bin/bazel export PATH=/opt/local/bin/:$PATH
下载 Bazel_and_CompileCommands
使用 vincent-picaud/Bazel_and_CompileCommands 的 fork 版本,以支持传入构建参数
cd ~/Opensource/
git clone git@github.com:tangxinfa/Bazel_and_CompileCommands.git -b fix-build-arguments
指定 Bazel 版本
Envoy 最新版本通过 .bazelversion
文件指明使用的 Bazel 版本,envoy v1.7.0 需要手工设置。运行命令 ci/run_envoy_docker.sh "bazel version"
得知 envoy
v1.7.0 需要 bazel 0.13.0。
export USE_BAZEL_VERSION=0.13.0
指定 Python 版本
Archlinux 默认的 Python 版本为 python3,需要使用 python2
alias python=python2
安装 gcc5
Envoy v1.7.0 使用最新版本的 gcc 进行编译会有大量的编译错误,改用 gcc5
yaourt -S gcc5
修复 tclap 项目地址错误
tclap 项目已从 http://github.com/eile/tclap 迁到 https://github.com/mirror/tclap
替换 bazel/repositories.bzl
bazel/repository_locations.bzl
中的 eile
为 mirror
修复 gettid 重复定义的错误
编译过程中有几处 gettid
定义错误,如
In file included from /usr/include/unistd.h:1170:0, from external/com_github_grpc_grpc/src/core/lib/gpr/log_linux.cc:41: /usr/include/bits/unistd_ext.h:34:16: note: old declaration '__pid_t gettid()' extern __pid_t gettid (void) __THROW; ^
external/com_github_grpc_grpc/src/core/lib/iomgr/ev_epollex_linux.cc: In function 'long int gettid()': external/com_github_grpc_grpc/src/core/lib/iomgr/ev_epollex_linux.cc:989:24: error: ambiguating new declaration of 'long int gettid()' static long gettid(void) { return syscall(__NR_gettid); } ^
在 ~.cache/bazel
目录下找到对应的文件,并删除 gettid
函数定义
编译 Envoy 生成 compile_commands.json
~/Opensource/Bazel_and_CompileCommands/setup_compile_commands.sh ~/Opensource/Bazel_and_CompileCommands/create_compile_commands.sh \ --action_env CC=/usr/bin/gcc-5 \ --action_env CPP=/usr/bin/cpp-5 \ --action_env CXX=/usr/bin/c++-5 \ --verbose_failures //source/exe:envoy-static