本页介绍了如何使用宏扩展 BUILD 语言 和规则
Bazel 扩展程序是以 .bzl
结尾的文件。使用
load 语句,以便从扩展程序导入符号。
在学习更高级的概念之前,请先:
了解
BUILD
和.bzl
文件中使用的 Starlark 语言。了解如何共享变量 两个
BUILD
文件之间。
宏和规则
宏是一种用于实例化规则的函数。如果 BUILD
文件过于重复或过于复杂,此方法非常有用,因为它允许您重复使用某些代码。系统会在读取 BUILD
文件后立即对该函数进行求值。评估 BUILD
文件后,Bazel 对宏的了解很少:如果您的宏生成了 genrule
,Bazel 的行为将与您编写 genrule
时一样。因此,bazel query
将仅列出生成的 genrule
。
规则比宏更强大。它可以访问 Bazel 内部信息,并完全控制正在发生的情况。例如,它可能会传递 其他规则的信息
如果您想重复使用简单的逻辑,请先使用宏。如果宏变得复杂,通常最好将其转换为规则。支持新语言 通常是通过规则实现的规则适用于高级用户 用户无需编写任何代码它们只会加载并调用现有 规则。
评估模型
构建过程由三个阶段组成。
加载阶段。首先,加载并评估构建所需的所有扩展程序和所有
BUILD
文件。执行BUILD
文件只是 实例化规则(每次调用规则时,规则都会添加到图表中)。 这是宏的求值位置。分析阶段。系统会执行规则的代码(其
implementation
函数),并实例化操作。“操作”描述的是 一组输入中的一组输出,例如“在 hello.c 上运行 gcc 并获取 hello.o”。您必须在执行实际命令之前明确列出将生成哪些文件。换句话说,分析阶段会获取加载阶段生成的图表,并生成操作图表。执行阶段。当操作的至少一个输出是 必填字段。如果文件缺失,或者某个命令无法生成输出, 构建失败在此阶段,系统也会运行测试。
Bazel 使用并行性来读取、解析和评估 .bzl
文件和 BUILD
文件。系统每进行一次构建最多会读取一次文件,并且会缓存和重复使用评估结果。仅对文件的所有依赖项 (load()
) 进行求值
语句)已解决。根据设计,加载 .bzl
文件时不会显示任何可见的
它只定义值和函数。
Bazel 会尽量发挥聪明才智:它会使用依赖项分析来了解必须加载哪些文件、必须分析哪些规则以及必须执行哪些操作。对于 例如,如果规则生成的操作是当前 build 不需要的操作, 它们就不会执行
创建附加信息
创建您的第一个宏,以便执行以下操作: 重复使用一些代码然后,详细了解宏以及如何使用宏创建“自定义动词”。
在编写您自己的扩展程序时,以下两个链接会非常有用。将它们放在触手可及的位置: