将自定义bazel规则的输出作为运行时数据传递给*u二进制规则
我有一个创建文件夹的规则(untars a tar.gz),我想直接使用这个文件夹作为cc_二进制文件的数据。我能找到的唯一方法是创建一个中间文件组,将创建的文件夹作为源 虽然它可以工作,但需要规则的用户创建一个中间文件组,并引入一些命名问题,因为文件组的名称不能与创建的文件夹名称相同 这就是我所拥有的将自定义bazel规则的输出作为运行时数据传递给*u二进制规则,bazel,Bazel,我有一个创建文件夹的规则(untars a tar.gz),我想直接使用这个文件夹作为cc_二进制文件的数据。我能找到的唯一方法是创建一个中间文件组,将创建的文件夹作为源 虽然它可以工作,但需要规则的用户创建一个中间文件组,并引入一些命名问题,因为文件组的名称不能与创建的文件夹名称相同 这就是我所拥有的 # rules.bzl def _untar_impl(ctx): tree = ctx.actions.declare_directory(ctx.attr.out) ctx.
# rules.bzl
def _untar_impl(ctx):
tree = ctx.actions.declare_directory(ctx.attr.out)
ctx.actions.run_shell(
inputs = [ctx.file.src],
outputs = [tree],
command = "tar -C '{out}' -xf '{src}'".format(src=ctx.file.src.path, out=tree.path),
)
return [DefaultInfo(files = depset([tree]))]
untar = rule(
implementation = _untar_impl,
attrs = {
"src": attr.label(mandatory=True, allow_single_file = True),
"out": attr.string(mandatory=True),
},
)
# BUILD
untar(
name = "media",
src = "media.tar.gz",
out = "media",
)
filegroup(
name = "mediafiles",
srcs = ["media"],
data = [":media"],
)
cc_binary(
name = "main",
srcs = ["main.cpp"],
data = [":mediafiles"],
)
有没有办法避免使用中间文件组?根据随后的讨论,我发现我对问题陈述有点误解。您可能仍然希望将tarball(及其整个处理)作为一个外部依赖项和
存储库规则
来处理,但是您需要中间文件组
这一直接问题
如果您注意到,您已经定义了src
和data
来指向媒体标签,这正是执行*\u二进制
规则时缺少的数据位。因为untar
规则返回了文件
的depset
,但是直接使用数据
时会解析为空
如果在规则定义中替换此行:
return [DefaultInfo(files = depset([tree]))]
与:
然后,您可以在构建
文件中说:
cc_binary(
name = "main",
srcs = ["main.cpp"],
data = [":media"],
)
因为untar
规则现在提供了。文件组
通过其数据
属性包装和添加媒体
已经做到了这一点。这种方法的问题是,媒体文件夹中的所有内容都必须是标题或cpp,而我有随机媒体文件错误:工件'…/media.cpp/font.ttf'从目录工件展开“…/media.cpp”既不是头文件,也不是源文件。
将其作为外部依赖项处理也会有好处:您提供了BUILD
文件,以确保仅公开存档中需要/想要的文件。同样,我不知道您的具体情况,但至少从表面上看,以这种方式使用tarball听起来是一种干净的方法。我的tar.gz是由另一条规则生成的,首先获取外部依赖项,然后进行一些预处理以生成tar.gz。tarball包含很多文件,所以我尽量避免列出所有文件。所以,如果你有一个外部dep。。。您的cc_二进制文件需要一些(已处理的;其他规则)输入,使用tarball(混合内容)将一个规则的输出传递给另一个规则,听起来比它应该的要复杂一些。当您获得ext.dep时,听起来任何为cc\u binary
生成输入的东西都应该这样做。。。如果您还希望发布一个tarball,那么它是一个单独的目标(构建树的叶节点)?我遗漏了什么实质性的东西吗?我不确定我是否明白。所以我的设置如下,我有一个外部存储库,里面有一堆加密的文件,我有一个规则,可以解密这些文件并生成一个tar球。我的设置可以正常工作,但我想知道是否可以通过删除中间文件组来简化它。当然,我可以让解密规则直接生成一个文件夹,但我仍然需要中间文件组。谢谢你的帮助(顺便说一句:)
cc_binary(
name = "main",
srcs = ["main.cpp"],
data = [":media"],
)