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

thi*_*zzy 6 bazel

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

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

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

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

谢谢!

ahu*_*sky 7

编写 genrule 时需要记住的一些事项:

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

请参阅 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)"
)
Run Code Online (Sandbox Code Playgroud)

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

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