gpt4 book ai didi

bazel - 如何从 Bazel 中的另一个规则中创建规则

转载 作者:行者123 更新时间:2023-12-03 09:34:21 25 4
gpt4 key购买 nike

情况

我有两个 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 提供从宏内部,所以我不知道如何填充 filegroupsrcs field ...

修改 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”):
def _blah_library_impl(ctx):
...

trans_deps = []
for dep in ctx.attr.deps:
trans_deps += dep[_blah_provider].trans_deps

native.filegroup(
name = ctx.attr.name + "__trans_deps",
srcs = trans_deps,
)

return _blah_provider(trans_deps=trans_deps)

最佳答案

您不能轻松地创建这样的文件组,但您仍然可以实现您想要的。

如果你想使用genrule.srcs中的规则, filegroup.srcs , cc_binary.data等,然后返回 DefaultInfo provider(连同 _blah_provider )并设置 files字段到文件的传递关闭。

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

关于bazel - 如何从 Bazel 中的另一个规则中创建规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49885381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com