我已经尝试将bazel宏转换为规则,因此它的解析现在是在分析时完成的,而不是在加载时完成的,这使得调用native.cc_binary
变得不可能
def _emcc_binary(ctx):
includejs = False
includehtml = False
linkopts = list(ctx.attr.linkopts)
linkopts.append("-s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'")
if ctx.attr.name.endswith(".html"):
basename = ctx.attr.name[:-5]
includehtml = True
includejs = True
elif ctx.attr.name.endswith(".js"):
basename = ctx.attr.name[:-3]
includejs = True
outputs = []
if includejs:
outputs.append(basename + ".js")
if ctx.attr.wasm:
outputs.append(basename + ".wasm")
if ctx.attr.memory_init_file:
outputs.append(basename + ".mem")
if ctx.attr.worker:
outputs.append(basename + ".worker.js")
linkopts.append("--proxy-to-worker")
if includehtml:
outputs.append(basename + ".html")
if not ctx.attr.wasm:
linkopts.append("-s WASM=0")
linkopts.append("--memory-init-file %d" % ctx.attr.memory_init_file)
if includejs:
tarfile = ctx.attr.name + ".tar"
# we'll generate a tarfile and extract multiple outputs
native.cc_binary(name = tarfile, linkopts = linkopts, **ctx.attr.kwargs)
native.genrule(
name = "emcc_extract_" + tarfile,
srcs = [tarfile],
outs = outputs,
output_to_bindir = 1,
testonly = ctx.attr.kwargs.get("testonly"),
cmd = """
tar xvf $< -C "$(@D)"/$$(dirname "%s")
""" % [outputs[0]],
)
else:
native.cc_binary(name = ctx.attr.name, linkopts = linkopts, **ctx.attr.kwargs)
# we'll generate a tarfile and extract multiple outputs
emcc_binary = rule(
implementation = _emcc_binary,
attrs = {
"memory_init_file": attr.int(default = 0),
"wasm": attr.bool(default = True),
"worker": attr.bool(default = False),
"srcs": attr.label_list(allow_files = True),
"linkopts": attr.string_list(),
"noop": attr.bool(default = False),
"kwargs": attr.label_keyed_string_dict()
},
)
输出: 在分析阶段无法调用cc_binary() 错误:目标'//tests:hi.js'的分析失败;构建中止:目标'//tests:hi.js'的分析失败;构建中止
答案 0 :(得分:0)
正确的,不能从其他规则的实现中调用规则。通常,解决方案是同时使用规则和宏,其中宏会在必要时创建并连接其他规则(包括自定义的Starlark规则)。
查看您的代码,尚不清楚您是否真的需要将宏更改为规则。如果您可以描述自己的最终目标,则可能会有所帮助(如果您想在此处寻求更多帮助,请随时与bazel-discuss取得联系)。就是说,如果您确实需要,可以将native.genrule
替换为actions,将native.cc_binary
替换为cc_common,这些规则旨在与规则配合使用。