扩展程序概览

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。
报告问题 查看源代码

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

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

在学习更高级的概念之前,请先执行以下操作:

宏和规则

是用于实例化规则的函数。当 BUILD 文件重复或过于复杂时,这会很有用,因为它可以让您重复使用某些代码。读取 BUILD 文件后,系统会立即评估该函数。在对 BUILD 文件求值后,Bazel 几乎没有关于宏的信息:如果您的宏生成了 genrule,Bazel 的行为就如同您编写了 genrule。因此,bazel query 将仅列出生成的 genrule

规则比宏更强大。它可以访问 Bazel 内部资源,并完全掌控发生的情况。例如,它可以将信息传递给其他规则。

如果您想重复使用简单的逻辑,请先使用宏。如果某个宏变得复杂,通常最好使其成为规则。对新语言的支持通常通过规则来实现。规则适用于高级用户,大多数用户永远都不需要编写规则;他们只需加载和调用现有规则。

评估模型

一个 build 包含三个阶段。

  • 加载阶段。首先,加载并评估构建所需的所有扩展程序和所有 BUILD 文件。BUILD 文件的执行只是实例化规则(每次调用规则时,系统都会将其添加到图表中)。系统会在此处评估宏。

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

  • 执行阶段。当需要至少一个输出时,执行操作。如果文件缺失或某个命令无法生成一项输出,构建将会失败。在此阶段还会运行测试。

Bazel 使用并行处理来读取、解析和评估 .bzl 文件和 BUILD 文件。每次构建最多读取一个文件,系统会缓存并重复使用评估结果。只有在解析文件的所有依赖项(load() 语句)后,系统才会对文件进行评估。根据设计,加载 .bzl 文件不会产生明显的附带效应,而是仅定义值和函数。

Bazel 会尝试做出巧妙的决策:它使用依赖项分析来确定必须加载哪些文件、必须分析哪些规则以及必须执行哪些操作。例如,如果规则生成当前构建不需要的操作,系统将不会执行这些操作。

创建附加信息

下面两个链接在编写您自己的扩展程序时非常有用。触手可及:

更进一步

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