在分析阶段无法调用cc_binary()

时间:2019-07-03 13:57:09

标签: bazel

我已经尝试将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'的分析失败;构建中止

1 个答案:

答案 0 :(得分:0)

正确的,不能从其他规则的实现中调用规则。通常,解决方案是同时使用规则和宏,其中宏会在必要时创建并连接其他规则(包括自定义的Starlark规则)。

查看您的代码,尚不清楚您是否真的需要将宏更改为规则。如果您可以描述自己的最终目标,则可能会有所帮助(如果您想在此处寻求更多帮助,请随时与bazel-discuss取得联系)。就是说,如果您确实需要,可以将native.genrule替换为actions,将native.cc_binary替换为cc_common,这些规则旨在与规则配合使用。