bazel包可以依赖另一个包中的源文件吗

Can bazel package depend on a source file in another package

几年前,我为 Bazel 编写了一组包装器,使我能够使用它来构建 FPGA 代码。 FPGA 位只是相关的,因为完全干净的构建需要很多 CPU 天,所以我真的很关心缓存和最小化重建。

使用 Bazel v0.28 我从来没有找到一种方法让我的 Bazel 包依赖于 git 存储库中其他地方的单个源文件。感觉这不是 Bazel 的设计目标。

我们想要这样做是因为我们有一个参数化的 VHDL 源文件库,并且参数是在实例化 VHDL 源中设置的。 (VHDL 泛型)。如果我们将这个库本身声明为 Bazel 包,那么对一个库文件的更改将重建所有内容(花费大量时间),而实际上可能只需要几个步骤就可以重建。

我使用 python 脚本解决了这个问题,将所有单独的源文件复制到一个子目录中,然后生成 BUILD 文件来引用这些副本。生成的构建过程是:

  1. 调用python准备脚本
  2. bazel 构建 //:allfpgas
  3. 调用python结果提取器

这显然很丑陋,但好处是巨大的,所以我们接受它。

现在我们想利用 Bazel 来构建我们的 Java、C++ 等,所以我想重新审视并尝试让一切都单独使用 Bazel。

在最新的 Bazel 中,有没有办法让 BUILD 包依赖于包目录之外的各个源文件?如果 Bazel 不能,buck pants 或 please.build 是否更适合我们的用例?

大多数语言的 Bazel 规则已经支持做这样的事情。例如,Python 规则将来自多个包的源文件捆绑在一起,而 C++ 规则管理来自其他包的包含文件。不知何故,规则必须在 providers, so that another rule can generate actions 中传递使用它们的源文件。在不知道您使用的规则的情况下很难更具体。

如果您只想复制文件,可以在 bazel 中使用 genrule 来完成。在源文件包中:

exports_files(["templated1.vhd", "templated2.vhd"])

在使用它的包中:

genrule(
    name = "copy_templates",
    srcs = ["//somewhere:templated1.vhd", "//somewhere:templated2.vhd"],
    outs = ["templated1.vhd", "templated2.vhd"],
    cmd = "cp $(SRCS) $(RULEDIR)",
)

some_library(
    srcs = ["templated1.vhd", "templated2.vhd", "other.vhd"],
)

如果您想在使用它的多个包中删除重复数据,请将文件名放入列表中并编写 macro 以创建 genrule。