首页 > 解决方案 > Bazel 外部依赖项在用作另一个规则中的工具的规则中不必要地重建

问题描述

我正在研究一组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 testbazel run调用不同的命令行选项有关,导致缓存错过外部依赖项。

我的问题主要是导致此重建的原因以及如何摆脱它?没有回答这个问题,有哪些技术可以深入挖掘导致这种重建的原因?我尝试了一些基本的 Bazel 查询,但运气不佳。

编辑

这个我还没破解 我确实怀疑两者之间存在细微差别bazel testbazel run但不幸的是,关于两者在文档中的具体差异的信息有限。

标签: bazelbazel-rules

解决方案


推荐阅读