本页介绍了如何使用宏扩展 BUILD 语言 和规则
Bazel 扩展程序是以 .bzl
结尾的文件。使用
load 语句,以便从扩展程序导入符号。
在学习更高级的概念之前,请先:
了解 Starlark 语言,该语言在
BUILD
和.bzl
文件。了解如何共享变量 两个
BUILD
文件之间。
宏和规则
宏是用于对规则进行实例化的函数。它在以下情况中非常有用:
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 不需要的操作, 它们就不会执行
创建附加信息
创建您的第一个宏,以便执行以下操作: 重复使用一些代码然后,详细了解宏和 使用它们来创建“自定义动词”。
在自行编写扩展程序时,以下两个链接将非常有用。保留 :