Базель: запустить команду без вывода

Я использую Базель для создания голых программ. Я хотел бы запустить модульные тесты, сгенерированные bazel на qemu.

qemu-system-* -some_args -kernel bazel-bin/whatever/generated.elf

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

Есть ли способ вызвать команду оболочки без каких-либо выходов?

Заранее спасибо!

При необходимости, это то, что у меня есть (но я не уверен, какие части верны, когда Bazel останавливается на этапе анализа):

# run_tests.bzl
===============
def _impl(ctx):
  qemu = ctx.attr.qemu
  machine = ctx.attr.machine
  cpu = ctx.attr.cpu
  target = ctx.attr.target
  # The command may only access files declared in inputs.
  ctx.actions.run_shell(
      arguments = [qemu, machine, cpu, target],
      command="$1 -M $2 -cpu $3 -nographic -monitor null -serial null -semihosting -kernel $4")

run_tests = rule(
    implementation=_impl,
    attrs = {"qemu" : attr.string(),
             "machine" : attr.string(),
             "cpu" : attr.string(),
             "target" : attr.string(),},
    executable = True
)

И мой BUILD-файл:

# BUILD
=======
load("//make:run_tests.bzl", "run_tests")

run_tests(
    name = "portos",
    qemu = "qemu-system-arm",
    machine = "realview-pbx-a9",
    cpu = "cortex-a9",
    target = ":test_portos.elf"
)

cc_binary(
    name = "test_portos.elf",
    srcs = glob(["*.cc"]),
    deps = ["//src:portos", 
            "@unity//:unity"],
    copts = ["-Isrc", 
             "-Iexternal/unity/src",
             "-Iexternal/unity/extras/fixture/src"] 
)

2 ответа

Решение

Skylark поддерживает написание правил тестирования. В основном вместо установки executable = True, вы бы установили test = True, а затем ваше правило будет создавать исполняемый файл, который является тестом, а затем установить ctx.outputs.executable на этот исполняемый файл. Тогда вы можете использовать bazel test Команда с вашим правилом.

Увидеть:

документы: https://docs.bazel.build/versions/master/skylark/rules.html

пример: https://github.com/bazelbuild/examples/tree/master/rules/test_rule

rule.test: https://docs.bazel.build/versions/master/skylark/lib/globals.html

Вы почти на месте: да, вам нужны выходы, иначе Базель не имеет ничего общего. Для вывода правила вам, вероятно, нужны журналы тестов или результаты тестов.

Другие вопросы по тегам