寻找生成数据文件的Bazel一般规则的示例 [英] Looking for examples of Bazel genrules that generate data files

查看:0
本文介绍了寻找生成数据文件的Bazel一般规则的示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

但由于许多原因,它没有起作用。GenRule不能识别$(Pwd)(cmd在等价的sh脚本中运行良好)。我不知道是否允许我离开我的工作区目录(称为app)来执行另一个这样的Bazel Run命令。

我如何才能编写正确的通用规则来实现我想要的功能?

谢谢!

推荐答案

编写一般规则时需要注意的事项:

  1. 一般规则需要知道它的所有输入文件和输出文件(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是与gen_data目标位于同一构建文件中的filegroup目标,其中包含您要打包的所有输入的文件列表。或者它可以是DataFiles目录中构建文件中的filegroup目标,在这种情况下,它应该类似于//app/MyApp/dataFiles:dataFiles(并且不要忘记将其visibility属性设置为//visibility:public)。

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

这篇关于寻找生成数据文件的Bazel一般规则的示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆