我正在尝试创建一个 bazel 目标,它将从 .cpp 文件运行 c++ 二进制文件,该文件是由 python 脚本动态生成的。
假设我有generator.py,它在目录中创建一个 generated.cpp 文件。
我的规则如下:
# py_binary(
# name = "generator",
# srcs = [
# "src/generator.py"
# ],
# main = "src/generator.py",
# data = [
# ":generator_inputs",
# ],
# imports = ["."],
# )
# cc_binary(
# name = "run_generated_cpp",
# srcs = ["src/generated.cpp"],
# deps = [
# "//cpp_lib",
# ]
# )
如何将这 2 个目标合并为 1 个?这样执行 cc_binary 就有一个从 py 脚本生成文件的预处理步骤。
您可能想使用genrule。 Genrules 使您能够在构建期间执行二进制文件,并且它们可以生成其他规则可以声明为输入的输出。我实际上没有测试下面的代码,但总体思路是定义生成器二进制文件并将该目标指定为 genrule 目标中的
exec_tool
,使用 $(location)
帮助器调用 cmd
字段中的工具genrule 的,并将生成的文件声明为 genrule 的输出。一旦声明,这些可以用作其他规则的输入。
py_binary(
name = "generator",
srcs = [
"src/generator.py"
],
main = "src/generator.py",
data = [
":generator_inputs",
],
imports = ["."],
)
genrule(
name = "generated_cpp_sources",
outs = ["src/generated.cpp"],
exec_tools = [":generator"],
cmd = "$(location :generator)"
)
cc_binary(
name = "run_generated_cpp",
srcs = ["src/generated.cpp"],
deps = [
"//cpp_lib",
]
)