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
我正在使用 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