bazel - 寻找生成数据文件的 Bazel genrules 示例

标签 bazel

我想建立一个依赖于从其他文件生成的数据文件的构建规则。我试着写这样的东西:

genrule(
    name = "data",
    outs = ["MyApp/data.dat"],
    cmd = "cd ../libpackfiles ; bazel run FilePacker $(PWD)/../apps/MyApp/data.dat $(PWD)/../apps/MyApp/dataFiles",
)

但由于多种原因,它并没有奏效。 $(PWD) 未被 genrule 识别(cmd 在等效的 sh 脚本中工作正常)。而且我不知道是否允许我离开我的工作区目录(称为应用程序)来执行另一个像这样的 bazel run 命令。

我怎样才能写出一个正确的 genrule 来实现我想要的?

谢谢!

最佳答案

编写类规则时要记住的一些事情:

  1. genrule 需要知道它的所有输入文件和输出文件(srcsouts 属性)
  2. 它需要知道它将在命令中使用的工具(exec_tools 属性)。这些工具可以是其他需要构建的东西,例如二进制目标(cc_binary、java_binary、sh_binary、py_binary 等),也可以是预编译的二进制文件。
  3. 工具必须生成与 genrule 在 outs 属性中声明的相同的文件。通常更容易在 outs 属性中声明文件,然后使用 cmd 属性中的 $(OUTS) 将文件名传递给工具.

请参阅 genrule 的文档,其中包括一些简单示例:https://docs.bazel.build/versions/master/be/general.html#genrule

它看起来像这样:

genrule(
  name = "gen_data",
  srcs = [":dataFiles"],
  outs = ["data.dat"],
  exec_tools = ["//libpackfiles:FilePacker"],
  cmd = "$(location //libpackfiles:FilePacker) $(OUTS) $(SRCS)"
)

这假设 :dataFiles 是一个 filegroup 目标,在与 gen_data 目标相同的 BUILD 文件中,该目标具有所有文件的列表您要打包的输入。或者它可以是 dataFiles 目录中 BUILD 文件中的 filegroup 目标,在这种情况下,它类似于 //app/MyApp/dataFiles:dataFiles(并且不要不要忘记将其 visibility 属性设置为 //visibility:public)。

$(location//libpackfiles:FilePacker) 替换为该目标的文件路径。 $(OUTS) 替换为 outs 属性中的所有文件,对于 $(SRCS) 也是如此。

关于bazel - 寻找生成数据文件的 Bazel genrules 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67461251/

相关文章:

intellij-idea - IntelliJ 说与 Bazel 同步后文件未同步

linux - 使用 bazel 和 linux 进行端口隔离

java - Raspberry Pi 4 的引导 Bazel 失败,未找到 jni_md.h

build - Bazel:从非标准位置使用 swig

code-coverage - 如何在 Bazel 中合并多个 .dat 文件的覆盖范围

java - 用homebrew安装bazel的问题

linux - bazel 无法在我的 mac 中测试语法网

tensorflow - 如何在 bazel/tensorflow 构建期间添加外部头文件

java - 在单独的机器上运行 bazel 远程执行程序测试

gpu - 有没有办法强制 Bazel 串行运行测试