在Skylark中 - 给定标签 - 如何阅读原始规则的标签

时间:2017-04-02 13:59:11

标签: bazel

在我的skylark(bazel)规则实现中,我有一个File objects的depset,我从中提取了Label Objects的depset。

在常见属性中,我发现所有的云雀规则都可能有tags属性,我可以在其中给出一个自由字符串列表。

我有什么方法可以达到原规则的标签吗?

(我的最终目标是从原始depset中提取源自带有标记“X”的规则的文件。)

1 个答案:

答案 0 :(得分:2)

规则通过 Providers 向下游传播信息(根据规则传播到规则)。提供者是规则可以返回或不返回的信息(结构)。我发现将Providers视为规则可以选择实现的接口很有用。例如,返回cc提供程序的Skylark规则可以被视为实现了C ++规则接口,因此我们可以预期它将成为C ++规则和任何恰好读取的规则的有意义的依赖关系{{1提供者。如果规则没有实现cc提供程序,那么我们就不能指望它作为java规则的依赖项工作。

规则只能访问其直接依赖关系中的信息,并且只能通过提供者访问。因此,要访问依赖项的java,依赖项必须使用该信息公开提供程序。 AFAIK那里没有规则可以公开的提供者,但是如果依赖规则(你想要提取的tags)也是Skylark规则并且你可以修改它们的实现,那么只需返回一个自定义提供者他们的tags已经完成了。

但是,如果您希望依赖本机tags规则(通常使用*_test的规则),则需要使用包装器。

基本思想是写一个Skylark macro来包装这些规则。而不是写例如在BUILD文件中tags,您需要撰写cc_test(..., tags=...)

宏的实现将实例化两个规则:my_macro(..., tags=...)和一个简单的Skylark规则(你必须实现),它只有native.cc_test属性和一个标签属性测试规则。宏将tags传递给两个规则(以及其余属性到tags),并且Skylark规则依赖于测试规则,因此它可以访问其文件的depset,并且可以返回自定义提供程序,在一个结构中包含depset和标记数据。