二进制shell规则依赖

时间:2018-02-28 07:03:24

标签: bazel

我们正在使用Bazel来包装和组织我们用于项目的一些构建系统。因为,每个项目都有自己的构建系统(例如bitbake),我们不能将Bazel用于实际构建(例如创建包含所有源代码的cc_binary和cc_library规则)。但我们确实将它用于包装和制作API。

我想创建一个依赖于另一个shell脚本(B)的shell脚本(A),我想这样做,这样B将在A之前运行。因为我们在BUILD文件中有一些配置,我可以'只需从命令行B然后运行A.我需要Bazel这样做,并将配置注入两个脚本。类似的东西:

在一个组件的BUILD文件中:

sh_binary(
name = "bazel_build_multivisor",
srcs = ["bazel-build-multivisor.sh"],
data = ["wrkspceinfo"],
deps = ["//core-build/components/bazel-pull:bazel_pull_multivisor"])

在第二个组件的BUILD文件中,负责从git中提取:

sh_binary(
name = "bazel_pull_multivisor",
srcs = ["pull_repo_repository.sh"],
data = ["wrkspceinfo", "pull_repo_repository.sh"],
args = [ARGS, "NAME=multivisor_repo;MODULE_NAME=*;GIT_BRANCH=*;MANIFEST=*.xml;PULL_PARAMS=8,8,8"],)

意思是,我希望sh_binary规则依赖于不同的sh_binary规则。

这可能吗?这样做有更好的方法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

考虑使用genrule

您可以在genrule.tools属性中指定两个sh_binary目标,然后在genrule.cmd属性中指定按顺序调用它们的shell命令。

例如,

genrule(
    name = "pull_and_build",
    srcs = "some_config_file.txt",
    outs = ["built_project.tar.gz"]
    tools = [":pull_sh", ":build_sh"],
    cmd = """
$(location :pull_sh) $< | \
  xargs -1 $(location :build_sh) | \
  xargs -1 tar -czvf $@"""
)

另一种可能的方法是将依赖项sh_binary换成sh_library,然后将它们汇总到顶层sh_binary