我有自己的校验和生成规则,如下所示:
_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
属性,如何在规则中访问可执行文件和共享库?以及如何检测用户是否指定了tool
?