在 genrule 构建期间访问运行文件

Accessing runfiles during build in genrule

我有一个使用运行文件的 cc_binary 目标。我想使用 genrule 将可执行文件和所有运行文件压缩到一个存档中。

类似于:

genrule(
  name = "zip_binary"
  srcs = [
    ":binary",
  ],
  outs = [
    "binary.zip",
  ],
  cmd = "zip -r $(OUTS) $(locations :binary)",
)

但是,这只包括二进制文件,不包括 binary.runfiles 目录。

如何让 bazel 在 src 中包含运行文件?

Genrules 无权访问足够的信息来执行此操作。有了完整的 custom rule 就很容易了。像这样:

def _zipper_impl(ctx):
    inputs = ctx.runfiles(files = ctx.files.srcs)
    inputs = inputs.merge_all([a[DefaultInfo].default_runfiles for a in ctx.attr.srcs])
    ctx.actions.run_shell(
        outputs = [ctx.output.out],
        inputs = inputs.files,
        command = " ".join(["zip", "-r", ctx.output.out.path] +
            [i.path for i in inputs.files.to_list()]),
    )
    return [DefaultInfo(files = depset(ctx.output.out))]

zipper = rule(
    impl = _zipper_impl,
    attrs = {
        "out": attr.output(mandatory = True),
        "srcs": attr.label_list(allow_files = True),
    },
)