如何在我自己的(生成校验和)规则中使用外部命令行工具?

时间:2019-05-16 10:13:14

标签: build bazel

我有自己的校验和生成规则,如下所示:

_ATTRS = {
    "srcs": attr.label_list(mandatory = True, allow_files = True)
}

def _crc_gen_impl(ctx):
    srcs = ctx.files.srcs
    dst = ctx.outputs.out
    args = ctx.actions.args()
    args.add_all(srcs)
    args.add(dst)
    ctx.actions.run_shell(
        inputs = srcs,
        outputs = [dst],
        arguments = [args],
        mnemonic = "VfwCrcGen",
        progress_message = "Generating CRC",
        use_default_shell_env = True,
        command = "/opt/vfw/bin/crc64sum "
        + " ".join(["\"$" +  str(a) + "\"" for a in range(1, len(srcs) + 1)])
        + " > \"${}\"".format(len(srcs) + 1)
    )

    return [DefaultInfo(
        files = depset(direct = [ctx.outputs.out])
        , runfiles = ctx.runfiles(files = [ctx.outputs.out])
    )]

crc_gen = rule(
    implementation = _crc_gen_impl,
    provides = [DefaultInfo],
    attrs = _ATTRS,
    outputs = {"out": "%{name}.check"}
)

对此我有两个问题:

  1. srcs属性所隐含的传递依赖项,是以某种方式隐式添加到DefautInfo提供程序中,还是应该显式添加它们?如果是这样,我该怎么做?注意:我正在为属性使用cc_library标签。

  2. 我想添加一个可选的额外属性(我相信,我看到它被称为toolstool,因为在其他规则中,我只允许一个属性)。如果在规则实例化中指定了它,我想使用它代替上面代码中的硬编码可执行文件。我已经从本地存储库获得了关注目标

sh_binary(
    name = "crc_bin",
    srcs = ["bin/crc64sum"],
    data = ["lib/libVfw.so"],
    visibility = ["//visibility:public"]
)

如果我将sh_binary目标用于假设的tool属性,如何在规则中访问可执行文件和共享库?以及如何检测用户是否指定了tool

0 个答案:

没有答案