扩展程序概览

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 条 · 6.4

本页介绍了如何使用宏扩展 BUILD 语言 和规则

Bazel 扩展程序是以 .bzl 结尾的文件。使用 load 语句,以便从扩展程序导入符号。

在学习更高级的概念之前,请先:

宏和规则

是用于对规则进行实例化的函数。它在以下情况中非常有用: BUILD 文件变得过于重复或过于复杂,因为它允许您重复使用 一些代码。系统会在读取 BUILD 文件后立即对该函数进行求值。更新后 评估 BUILD 文件时,Bazel 几乎没有关于宏的信息: 如果您的宏生成了 genrule,则 Bazel 的行为方式就像您编写了 genrule。因此,bazel query 将仅列出生成的 genrule

规则比宏更强大。它可以访问 Bazel 并能完全掌控一切。例如,它可能会传递 其他规则的信息

如果您想重复使用简单的逻辑,请从宏入手。如果宏 通常比较好的做法是制定规则。支持新语言 通常是通过规则实现的规则适用于高级用户 用户无需编写任何代码它们只会加载并调用现有 规则。

评估模型

build 由三个阶段组成。

  • 加载阶段。首先,加载并评估所有扩展程序和所有 BUILD 构建所需的文件执行 BUILD 文件只是 实例化规则(每次调用规则时,规则都会添加到图表中)。 这是对宏求值的位置。

  • 分析阶段。系统会执行规则的代码(其 implementation 函数),且操作已实例化。“操作”描述的是 一组输入中的一组输出,例如“在 hello.c 上运行 gcc 并获取 hello.o”。您必须明确列出在生成代码之前 执行实际命令的过程。换句话说,分析阶段 加载阶段生成的图表,并生成操作图。

  • 执行阶段。当操作的至少一个输出是 必填字段。如果文件缺失,或者某个命令无法生成输出, 构建失败在此阶段,系统也会运行测试。

Bazel 使用并行性来读取、解析和评估 .bzl 文件和 BUILD 文件。每个构建最多读取一次文件,评估结果为 缓存和重复使用仅对文件的所有依赖项 (load()) 进行求值 语句)已解决。根据设计,加载 .bzl 文件时不会显示任何可见的 它只定义值和函数。

Bazel 力求巧妙:它通过依赖关系分析来了解哪些文件必须 哪些规则必须分析,以及必须执行哪些操作。对于 例如,如果规则生成的操作是当前 build 不需要的操作, 它们就不会执行

创建附加信息

在自行编写扩展程序时,以下两个链接将非常有用。保留 :

更进一步

除了规则之外,您可能还需要编写 方面仓库规则