Я пытался преобразовать макрос 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' не выполнен; сборка прервана