共计 2139 个字符,预计需要花费 6 分钟才能阅读完成。
原文地址:Envoy bazel 学习 & 踩坑
近一年有开始折腾 Envoy 了,在 bazel 这块踩了一些坑,总结记录下的,次要是集体的体感,不肯定精确,欢送批评指正。
bazel 是个啥
编译构建工具,跟罕用的 Makefile 是相似的。
只是,bazel 更简单,上手门槛更高,以我的集体的体验来看,次要是为了晋升表达能力,可编程能力更强。
Makefile 通常是用于简略的形容,偶然会搞个函数啥的;然而在 bazel 里,会看到大面积的自定义函数。
为啥 Envoy 须要 bazel
Envoy 是个 C++ 我的项目,C/C++ 这种比拟老的语言,没有内置依赖包管理器这种先进个性(相比较而言,Go 语言在这块就先进了许多)。
我的了解,对于 Envoy 来说,bazel 一个次要的作用就是,补齐了依赖包治理。如果仅仅是编译,Makefile 之类的简略工具,应该也够用了。
几个概念
有几个罕用的基本概念,先理解一下的
WORKSPACE
在我的项目的根目录,会有一个 WORKSPACE
文件,用于形容整个我的项目的,最次要是形容了依赖库,比拟相似于 Go 语言中的 go.mod
,go.sum
。
比方 Envoy 的 WORKSPACE
文件中,有这样的形容:
load("//bazel:repositories.bzl", "envoy_dependencies")
envoy_dependencies()
其中,具体依赖库的详细信息,在 bazel/repository_locations.bzl
文件里。
比方上面这个示例:
boringssl = dict(
project_name = "BoringSSL",
project_url = "https://github.com/google/boringssl",
version = "098695591f3a2665fccef83a3732ecfc99acdcdd",
sha256 = "e141448cf6f686b6e9695f6b6459293fd602c8d51efe118a83106752cf7e1280",
strip_prefix = "boringssl-{version}",
urls = ["https://github.com/google/boringssl/archive/{version}.tar.gz"],
),
形容的是依赖库 boringssl
,是不是很像 go.mod
,go.sum
。
另外,在这里还能够频繁看到 @envoy
@envoy_api
这种,这里也示意的一个依赖库的作用域。
BUILD
BUILD 文件会有很多个,用于形容一个指标的编译过程,相似于 Makefile 中形容一个指标的构建过程。
比方,这样子的:
envoy_cc_library(
name = "lua_filter_lib",
srcs = ["lua_filter.cc"],
hdrs = ["lua_filter.h"],
deps = [
":wrappers_lib",
"//envoy/http:codes_interface",
"@envoy_api//envoy/extensions/filters/http/lua/v3:pkg_cc_proto",
],
)
.bazelrc
这也是在我的项目根目录下的,用于形容 bazel 的默认配置。
比方,这个:
build:linux --copt=-Wno-deprecated-declarations
能够指定一些编译参数之类的。
执行
有了下面这些形容信息之后,最终要执行编译构建的命令就简略许多了
比方:
bazel build envoy
这里的构建指标 envoy
,来自我的项目根目录下的 BUILD
文件。
也能够是这样子的:
bazel build //source/exe:envoy
此时的构建指标 //source/exe:envoy
,来自我的项目根目录下的 source/exe/BUILD
文件了。
踩过的坑
除了下面这些一手体感,还有一些坑,也记录下的
变更编译器版本
有一次,想换个高版本的 gcc,然而批改了 PATH
后从新构建,始终不失效。
原来是,bazel 是增量编译的,所以会应用上一次编译时应用编译器,以保障整个我的项目是应用的同一个编译器。
所以,如果想更换编译器,须要清空下缓存:
bazel clean --expunge
split DWARF
较新版的 Envoy,启用了 -gsplit-dwarf
这个个性,也就是将调试符号放到独立的 .dwo
文件里了,以缩小生成的二进制文件大小。
不过呢,这个个性还比拟新,可能会有一些坑,至多在我的环境下(gdb 11
,这个版本也不低了),就有 .dwo
读取谬误。
比方这样子的:
DW_FORM_strp pointing outside of .debug_str section
所以,罗唆关掉这个个性,就一切正常了(次要是 bt full
这类查看局部变量的性能)。
具体操作是,正文掉 .bazelrc
中的这一行:
# build:linux --features=per_object_debug_info
最初
记录下,我这边能够残缺工作的环境:
- g++ 11
- gdb 11
在这个环境下,gdb 是能够残缺工作的,局部变量都能够看。
之前在一个比拟老的版本上,工作是不太顺利的。
如果感觉有意思,欢送关注我的公众号「豆浆大叔」~