关于envoy:笔记-Envoy-bazel-学习-踩坑

21次阅读

共计 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.modgo.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.modgo.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

最初

记录下,我这边能够残缺工作的环境:

  1. g++ 11
  2. gdb 11

在这个环境下,gdb 是能够残缺工作的,局部变量都能够看。

之前在一个比拟老的版本上,工作是不太顺利的。

如果感觉有意思,欢送关注我的公众号「豆浆大叔」~

正文完
 0