Передача вывода пользовательского правила bazel в * _binary rule как данные времени выполнения - PullRequest
0 голосов
/ 01 марта 2020

У меня есть правило, которое создает папку (не использует tar.gz), и я хотел бы использовать эту папку непосредственно в качестве данных для cc_binary. Единственный способ найти такой способ - создать промежуточную файловую группу с созданной папкой в ​​качестве источника.

Несмотря на то, что это работает, требуется, чтобы пользователи правила создали промежуточную файловую группу и возникли некоторые проблемы с именами в качестве имени. файловой группы не может совпадать с именем созданной папки.

Это то, что у меня есть

# rules.bzl
def _untar_impl(ctx):
    tree = ctx.actions.declare_directory(ctx.attr.out)
    ctx.actions.run_shell(
        inputs = [ctx.file.src],
        outputs = [tree],
        command = "tar -C '{out}' -xf '{src}'".format(src=ctx.file.src.path, out=tree.path),
    )

    return [DefaultInfo(files = depset([tree]))]

untar = rule(
    implementation = _untar_impl,
    attrs = {
        "src": attr.label(mandatory=True, allow_single_file = True),
        "out": attr.string(mandatory=True),
    },
)

# BUILD
untar(
    name = "media",
    src = "media.tar.gz",
    out = "media",
)

filegroup(
    name = "mediafiles",
    srcs = ["media"],
    data = [":media"],
)

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = [":mediafiles"],
)

Есть ли способ избежать использования промежуточной файловой группы?

1 Ответ

1 голос
/ 01 марта 2020

Исходя из последовавшего обсуждения, я вижу, что немного неправильно понял формулировку проблемы. Вы, вероятно, все еще хотите рассмотреть обработку этого тарбола (и всей его обработки) как внешнюю зависимость и repository_rule, но для вашей непосредственной проблемы необходимости промежуточного filegroup.

Если вы заметили, вы Вы определили как srcs, так и data, чтобы они указывали на вашу метку media, и это именно тот недостающий бит, который должен иметь данные, доступные для выполнения вашего правила *_binary. Потому что правило untar вернуло depset из files, но те, которые при использовании data напрямую, разрешат быть пустыми.

Если вы замените эту строку в своем определении правила:

return [DefaultInfo(files = depset([tree]))]

с:

return [DefaultInfo(runfiles = ctx.runfiles([tree]))]

Затем вы можете в своем файле BUILD сказать:

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = [":media"],
)

Поскольку правило untar теперь обеспечивает runfiles из DefaultInfo. Это filegroup обертывание и добавление media через его свойство data сделали это.

...