Bazel 自定义规则不生成依赖目标

Bazel 自定义规则不生成依赖目标,bazel,Bazel,我想在qemu上运行单元测试。我创建了一个自定义规则,它使用规则中指定的参数调用qemu。其中一个参数是elf文件(规则属性“target”),qemu将其用作内核。 使用以下命令调用自定义规则时,不会编译elf文件(“kernel.elf”): bazel build //test:custom_rule 即使bazel query'deps(//test:custom_rule)将目标“:kernel.elf”列为依赖项,也会发生这种情况 此外,我还有一个自定义规则的问题。当我手动构建“

我想在qemu上运行单元测试。我创建了一个自定义规则,它使用规则中指定的参数调用qemu。其中一个参数是elf文件(规则属性“target”),qemu将其用作内核。
使用以下命令调用自定义规则时,不会编译elf文件(“kernel.elf”):

 bazel build //test:custom_rule
即使
bazel query'deps(//test:custom_rule)
将目标“:kernel.elf”列为依赖项,也会发生这种情况

此外,我还有一个自定义规则的问题。当我手动构建“:kernel.elf”并在之后调用自定义规则时,qemu告诉我,它无法加载内核文件。在shell中手动调用qemu命令确实有效,所以我猜问题不在“kernel.elf”文件中

有人能回答我的问题吗

提前谢谢

运行_tests.bzl 建造
问题可能是需要为操作指定输入,请参阅

您可能还需要使qemu成为一个标签,并将其作为操作的输入(如果qemu需要一个文件,那么还需要机器)

例如,类似于:

def_impl(ctx):
qemu=ctx.attr.qemu
机器=ctx.attr.machine
cpu=ctx.attr.cpu
target=ctx.file.target.path
输出=ctx.outputs.out
#该命令只能访问输入中声明的文件。
ctx.actions.run\u shell(
输入=[qemu,目标],
输出=[输出],
参数=[qemu、机器、cpu、目标],
command=“$1-M$2-cpu$3-nographic-monitor null
-串行空-半托管-内核$4>%s“%(output.path))
运行测试=规则(
实现=_impl,
属性={
“qemu”:attr.label(允许文件=True,单个文件=True,
强制=真),
“机器”:属性字符串(),
“cpu”:属性字符串(),
“target”:attr.label(允许文件=True,单个文件=True,
强制=真)
},
输出={“out”:“run_tests.log”}
)

非常感谢,这解决了我的第一个问题。elf文件现在正在生成:)但我现在遇到了下一个错误:(当我运行
bazel build//test:custom_rule
时,bazel退出,错误消息为:
bash失败:执行命令时出错
。我是否可以指定我的规则不执行shell脚本?您可能需要执行
参数=[qemu.path,machine,cpu,target.path]
Hmm,不起作用:(好吧,我会再试试。谢谢你的帮助。你可以试试
“qemu”:attr.label(allow_files=True,mandatory=True,executable=True,cfg=“host”),
用于qemu,和
“target”:attr.label(allow_files=True,mandatory=True,executable=True,cfg=“target”)
用于目标。(无论如何,将qemu置于主机配置中可能更为正确,因为这不应受到目标构建方式的影响)
def _impl(ctx):
  qemu = ctx.attr.qemu
  machine = ctx.attr.machine
  cpu = ctx.attr.cpu
  target = ctx.file.target.path
  output = ctx.outputs.out
  # The command may only access files declared in inputs.
  ctx.actions.run_shell(
      arguments = [qemu, machine, cpu, target],
      outputs=[output],
      command="$1 -M $2 -cpu $3 -nographic -monitor null 
               -serial null -semihosting -kernel $4 > %s" % (output.path))


run_tests = rule(
    implementation=_impl,
    attrs = {"qemu" : attr.string(),
             "machine" : attr.string(),
             "cpu" : attr.string(),
             "target" : attr.label(allow_files=True, single_file=True,
                        mandatory=True)},
    outputs={"out": "run_tests.log"}
)
load("//make:run_tests.bzl", "run_tests")

run_tests(
    name = "custom_rule",
    qemu = "qemu-system-arm",
    machine = "xilinx-zynq-a9",
    cpu = "cortex-a9",
    target = ":kernel.elf"
)

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