首页 > 解决方案 > 如何读取 Bazels 二进制构建事件协议文件?

问题描述

我想用 Bazel(基于 Bazel 的构建)实现编译器警告的获取。我知道有些文件已经可以用于此。这些文件位于:

$PROJECT_ROOT/bazel-out/_tmp/action_outs/

并命名为 stderr-XY。

Bazel 能够将所有构建事件保存在指定文件中。请注意,目前(Bazel 0.14)该指定文件支持 3 种格式,它们是:文本文件、JSON 文件和二进制文件。这个问题只与二进制文件有关。

如果我正确理解了Google 的协议缓冲区,那么它们的实现和工作流程是:

  1. 您可以通过在 .proto 文件中定义协议缓冲区消息类型来指定您希望序列化信息的结构方式。
  2. 一旦定义了消息,就可以在 .proto 文件上运行应用程序语言的协议缓冲区编译器 (protoc) 以生成数据访问类。
  3. 在项目中包含生成的文件并在代码中使用生成的类。使用它意味着填充、序列化和检索协议缓冲区消息(即,对于我使用的编程语言 C++,可以对此类任务使用SerializeToOstreamParseFromIstream方法)

结束这个问题:

如此处所述 “通过指定选项 --build_event_binary_file=/path/to/file,让 Bazel 将协议缓冲区消息序列化到一个文件中。该文件将包含序列化的协议缓冲区消息,每条消息都是长度分隔的。”

我没有看到避免这样一个事实的方法,即想要使用 Bazel 的功能在二进制文件中编写构建事件的开发人员需要知道“格式”,或者更简洁地说类架构来读取该二进制文件。我在这里错过了什么吗?所有这些都可以做到吗?如何做到?

另外,我尝试使用protoc --decode_raw < bazelbepbinary.bin它,它说:

无法解析输入。

所有这些都是在 Ubuntu 16.04 上完成的,目前我不确定 GCC 版本是什么,但是当我必须访问该信息时,我会在问题中添加 GCC 版本。

我的问题是:是否可以仅捕获反映构建警告的那些构建事件(不使用某种过滤器,例如grep在生成的文件上?)我已阅读文档并使用:

bazel help build --long | grep "relevant_build_event_protocol_keywords"

并且无法在 API 中找到类似的内容。

标签: c++protocol-buffersbazelproto

解决方案


推荐阅读