У меня есть собственное правило генерации контрольной суммы, которое выглядит так:
_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"}
)
У меня есть два вопроса по этому поводу:
Являются ли переходные зависимости, которыеподразумевается атрибутом srcs
, каким-то образом неявно добавленным к поставщику DefautInfo
, или я должен добавить их явно?Если так, как я могу это сделать?Примечание: я использую метку cc_library
для атрибута.
Я хотел бы добавить необязательный дополнительный атрибут (я думаю, я видел, что он называется tools
или tool
, так как я хочу разрешить только один, в других правилах).Если это указано в экземпляре правила, я хотел бы использовать его вместо жестко закодированного исполняемого файла в приведенном выше коде.Я получил следующую цель из локального репозитория
sh_binary(
name = "crc_bin",
srcs = ["bin/crc64sum"],
data = ["lib/libVfw.so"],
visibility = ["//visibility:public"]
)
Если я использую эту цель sh_binary
для своего гипотетического атрибута tool
, как мне получить доступ к исполняемому файлу и общему ресурсу?lib в моем правиле?И как я могу определить, указан ли tool
пользователем?