寻找生成数据文件的 Bazel genrules 示例
Looking for examples of Bazel genrules that generate data files
我想建立一个依赖于从其他文件生成的数据文件的构建规则。我试着写这样的东西:
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 运行 命令。
我怎样才能写出一个正确的 genrule 来实现我想要的?
谢谢!
编写genrules时要记住的一些事情:
- 一个 genrule 需要知道它的所有输入文件和输出文件(
srcs
和 outs
属性)
- 它需要知道它将在命令中使用的工具(
exec_tools
属性)。这些工具可以是其他需要构建的东西,比如二进制目标(cc_binary、java_binary、sh_binary、py_binary 等),也可以是预编译的二进制文件。
- 这些工具必须生成与 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)
.
也类似
我想建立一个依赖于从其他文件生成的数据文件的构建规则。我试着写这样的东西:
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 运行 命令。
我怎样才能写出一个正确的 genrule 来实现我想要的?
谢谢!
编写genrules时要记住的一些事情:
- 一个 genrule 需要知道它的所有输入文件和输出文件(
srcs
和outs
属性) - 它需要知道它将在命令中使用的工具(
exec_tools
属性)。这些工具可以是其他需要构建的东西,比如二进制目标(cc_binary、java_binary、sh_binary、py_binary 等),也可以是预编译的二进制文件。 - 这些工具必须生成与 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)
.