如何在Bazel中的其他规则中创建规则

时间:2018-04-17 18:45:23

标签: bazel

情况

我有两个Skylark扩展规则:blah_libraryblah_binary。所有blah_library的传递依赖关系都会通过返回provider(transitive_deps=...)进行传播,并由任何最终的依赖blah_binary目标进行适当处理。

我想做什么

我希望每个blah_library也创建一个filegroup,其中包含上面提到的所有传递依赖项,以便我可以单独访问它们。例如,我希望能够将它们作为数据依赖项传递给cc_binary。换句话说:

# Somehow have this automatically create a target named `foo__trans_deps`?
blah_library(
    name = "foo",
    srcs = [...],
    deps = [...],
)

cc_binary(
    ...,
    data = [":foo__trans_deps"],
)

我该怎么做?任何帮助将不胜感激!

我尝试了什么

制作一个宏

我尝试制作一个像这样的宏:

_real_blah_library = rule(...)

def blah_library(name, *args, **kwargs):
    native.filegroup(
        name = name + "__trans_deps",
        srcs = ???,
    )
    _real_blah_library(name=name, *args, **kwargs)

但我不确定如何从宏中访问provider提供的_real_blah_library,因此我不知道如何填充filegroup的{​​{1} }} field ...

修改srcs规则的实施

现在我有类似的东西:

blah_library

我尝试将以下内容添加到_blah_provider = provider(fields=['transitive_deps']) def _blah_library_impl(ctx): ... trans_deps = [] for dep in ctx.attr.deps: trans_deps += dep[_blah_provider].trans_deps return _blah_provider(trans_deps=trans_deps) blah_library = rule(impl=_blah_library_impl, ...) ,但它不起作用,因为显然_blah_library_impl无法在规则的实现中调用(“native.filegroup”):

filegroup() cannot be called during the analysis phase

2 个答案:

答案 0 :(得分:1)

您无法轻松创建这样的文件组,但您仍然可以实现您想要的目标。

如果您要使用genrule.srcsfilegroup.srcscc_binary.data等规则,请返回DefaultInfo提供商(以及_blah_provider)并将files字段设置为文件的传递闭包。

如果您在规则处于data属性时需要一组不同的文件而不是其他任何文件(例如srcs),则可以优化解决方案:还可以设置与运行文件相关的文件DefaultInfo中的成员。 (坦率地说,我不知道它们之间的区别,我只是将所有runfiles-fields设置为相同的值。)

答案 1 :(得分:0)

我最终制定了自己的特殊SELECT top 100 Id FROM TestTable where (Code like 'a000' + '%' or contains(Desc , 'a000*' ) ) AND (Active!='N' or Active is null) ORDER BY Code - 类似规则,正如@ Laszlo的答案中的评论中所讨论的那样。这是原始代码,以防它对任何人都是一个有用的起点:

filegroup