建立目标后,我可以让bazel触发额外的动作吗?

时间:2019-10-10 13:02:57

标签: bazel

我有一个产生伪像的bazel规则。我应该如何添加将生成的工件作为依赖项的后处理步骤?

我们有一个大型构建系统,其中的宏用于多个BUILD文件中。因此,现在我需要添加另一个步骤,该步骤将使用由特定宏产生的工件来创建另一个工件,并且希望不必更新所有BUILD文件。

在非bazel上下文中,我可能会使用触发额外步骤的内容,但是在bazel上下文中,我想到的最好的办法就是添加一个新的宏,该宏使用由另一个创建的规则宏作为依赖项。

今天是这样的:
宏M1生成规则R1-产生伪像A。
Buildfile B使用宏M1,并且在构建目标时会生成工件A。

因此,我现在可以添加一个生成规则R2的宏M2,该规则会生成工件B。
工件A是此规则的依赖项。
用户将改为使用宏M2。

但是我可以通过其他方式做到这一点吗?

用例的例子可能是我有一个产生二进制文件的宏,现在我想添加例如签名。 “用户”仍将希望构建该二进制文件,并且签名的工件被创建为对用户几乎没有兴趣的副产品。

1 个答案:

答案 0 :(得分:0)

您可以将M1更新为呼叫M2。

调用M2的M1仅声明规则。通常,宏如下所示:

def M1(name, arg1, ...):
    R1(name=name, arg1=arg1, ...)

构建M1规则“ // foo:bar”时,实际上是构建名为“ // foo:bar”的R1。因此,您必须使用名称以外的其他名称更新M1以调用R1,例如name + "dep",并使用name调用M2并将R1的name作为依赖项传递。因此,如果您构建“ // foo:bar”,则将构建M2的基础规则(R2),该规则取决于R1,因此Bazel首先构建R1(并生成A),然后构建R2(使用A)。

另一件事:Bazel将宏预处理为实际规则,然后再将规则加载到BUILD文件中。您可以检查此预处理的结果,以查看包中实际包含的规则,如下所示:

bazel query --output=build //foo:*