我正在研究一组Bazel 规则,其中一个测试规则也作为工具从另一个可执行规则中执行。测试规则依赖于由rules_foreign_cc构建的外部工具。
symbiyosys_test = rule(
implementation = _symbiyosys_test_impl,
doc = "Formal verification of (System) Verilog.",
attrs = {
...,
"_yosys_toolchain": attr.label(
doc = "Yosys toolchain.",
default = Label("@rules_symbiyosys//symbiyosys/tools:yosys"),
),
"_yices_toolchain": attr.label(
doc = "Yices toolchain.",
default = Label("@rules_symbiyosys//symbiyosys/tools:yices"),
),
},
test = True,
)
symbiyosys_trace = rule(
implementation = _symbiyosys_trace_impl,
doc = "View VCD trace from Symbiyosys.",
attrs = {
"test": attr.label(
doc = "Symbiyosys test target to produce VCD file.",
mandatory = True,
executable = True,
cfg = "exec",
),
...,
},
executable = True,
)
使用原始 Bazel 缓存,在使用bazel test //examples:counter_fail
外部工具运行测试规则的实例时构建。当可执行规则的实例(利用测试规则)运行时,也会构建外部工具bazel run //examples:counter_fail_trace
。一旦在这两个上下文中构建了外部工具,后续测试或运行就会使用缓存的输出。
两次构建外部工具似乎没有必要,因为测试和可执行规则都具有相同的配置(“exec”)。我有一种预感,这可能bazel test
与bazel run
调用不同的命令行选项有关,导致缓存错过外部依赖项。
我的问题主要是导致此重建的原因以及如何摆脱它?没有回答这个问题,有哪些技术可以深入挖掘导致这种重建的原因?我尝试了一些基本的 Bazel 查询,但运气不佳。
编辑
这个我还没破解 我确实怀疑两者之间存在细微差别bazel test
,bazel run
但不幸的是,关于两者在文档中的具体差异的信息有限。