Как использовать внешний инструмент командной строки в моем собственном правиле (генерации контрольной суммы)? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть собственное правило генерации контрольной суммы, которое выглядит так:

_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. Я хотел бы добавить необязательный дополнительный атрибут (я думаю, я видел, что он называется tools или tool, так как я хочу разрешить только один, в других правилах).Если это указано в экземпляре правила, я хотел бы использовать его вместо жестко закодированного исполняемого файла в приведенном выше коде.Я получил следующую цель из локального репозитория

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

Если я использую эту цель sh_binary для своего гипотетического атрибута tool, как мне получить доступ к исполняемому файлу и общему ресурсу?lib в моем правиле?И как я могу определить, указан ли tool пользователем?

...