2017-12-03 3 views
0

Ich verwende Bazel für den Aufbau von Bare-Metal-Programmen. Ich würde gerne die von bazel generierten Unit Tests auf qemu ausführen. diejenigen, die durch die Schaffung meine eigene Regel in einem‘.bzl'-Datei auszuführen, aber es scheint, dass die Ergebnisse sind obligatorisch auf allen RegelaktionenBazel: Führen Sie einen Befehl ohne eine Ausgabe

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

Ich habe versucht. Beachten Sie, dass ich abhängig von der Zielarchitektur verschiedene qemu-Befehle mit unterschiedlichen Argumenten aufrufen muss. Ich würde diese gerne an die Regel weitergeben.

Gibt es eine Möglichkeit, einen Shell-Befehl ohne Ausgaben aufzurufen?

Vielen Dank im Voraus!

Wenn nötig, ist es das, was ich bisher (noch ich bin nicht sicher, welche Teile korrekt sind als bazel in der Analysephase beendet):

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

Und meine BUILD-Datei:

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

Antwort

1

Skylark unterstützt das Schreiben von Testregeln. Anstatt executable = True zu setzen, würden Sie test = True setzen, und dann würde Ihre Regel eine ausführbare Datei erstellen, die der Test ist, und Sie setzen dann ctx.outputs.executable auf diese ausführbare Datei. Dann können Sie den Befehl bazel test mit Ihrer Regel verwenden.

See:

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

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

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

+0

Danke, das war genau das was ich gesucht habe. –

4

Sie sind fast da: Ja, Sie brauchen Ausgänge, sonst hat Bazel nichts zu tun. Für die Regelausgabe möchten Sie wahrscheinlich die Testprotokolle oder Testergebnisse.

+0

oh lol, haben etwa nicht gedacht. Vielen Dank! –

Verwandte Themen