在 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),
},
)
我有一个使用运行文件的 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),
},
)