cc_binary () не может быть вызван на этапе анализа - PullRequest
0 голосов
/ 03 июля 2019

Я пытался преобразовать макрос 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 голосов
/ 12 июля 2019

Правильно, правила не могут быть вызваны из реализаций других правил.Обычно решение состоит в том, чтобы использовать как правила, так и макросы, где макрос создает и связывает другие правила (включая ваши пользовательские правила Starlark), где это необходимо.

Просматривая код, не ясно, что вам действительно нужноизменить макрос на правило.Может быть полезно, если бы вы могли описать свою конечную цель (не стесняйтесь обращаться к bazel-обсудить , если вам нужна дополнительная помощь здесь).Тем не менее, если вы действительно хотите, вы можете заменить native.genrule на действия и native.cc_binary на cc_common , которые предназначены для работы с правилами.

...