Bazel:运行 没有输出的命令

Bazel: Run a command without an output

我正在使用 bazel 构建裸机程序。我想 运行 bazel 在 qemu 上生成的单元测试。

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

我已经尝试 运行 通过在“.bzl”文件中创建自己的规则来实现这些,但似乎所有规则操作的输出都是强制性的。请注意,我需要根据目标体系结构使用不同的参数调用不同的 qemu 命令。我想将这些传递给规则。

有没有办法在没有任何输出的情况下调用 shell 命令?

如果需要,这就是我目前所拥有的(但我不确定哪些部分是正确的,因为 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=" -M  -cpu  -nographic -monitor null -serial null -semihosting -kernel ")

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

还有我的构建文件:

# 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"] 
)

你快到了:是的,你需要输出,否则 bazel 无事可做。对于规则输出,您可能需要测试日志或测试结果。

云雀支持编写测试规则。基本上不是设置 executable = True,而是设置 test = True,然后您的规则将创建一个作为测试的可执行文件,然后将 ctx.outputs.executable 设置为该可执行文件。然后您可以将 bazel test 命令与您的规则一起使用。

参见:

文档:https://docs.bazel.build/versions/master/skylark/rules.html#test-rules

示例:https://github.com/bazelbuild/examples/tree/master/rules/test_rule

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