bazel包是否可以依赖于另一个包中的源文件



几年前,我为Bazel编写了一组包装器,使我能够使用它来构建FPGA代码。FPGA位之所以重要,是因为完整的干净构建需要很多CPU天,所以我真的很关心缓存和最大限度地减少重建。

使用Bazel v0.28,我从未找到让我的Bazel包依赖于git repo中其他地方的单个源文件的方法。感觉这不是巴泽尔的设计初衷。

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

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

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

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

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

在最新的Bazel中,是否有一种方法可以使BUILD包依赖于包目录之外的单个源文件?如果Bazel做不到,buck裤子还是please.build对我们的用例更有效?

大多数语言的Bazel规则已经支持这样做了。例如,Python规则将多个包中的源文件捆绑在一起,C++规则管理其他包中的include文件。不知何故,规则必须在提供程序中传递源文件,以便另一个规则可以生成使用它们的操作。如果不知道自己在使用哪些规则,就很难更具体。

如果你只想复制文件,你可以用genrule在bazel中完成。在带有源文件的包中:

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"],
)

如果您想在使用它的多个包中消除重复,请将文件名放在列表中,然后编写一个宏来创建genrule。

相关内容

最新更新