有几种方法。作为一次性的,您可以创建一个 genrule 来对某些输入执行命令:
genrule(
name = "my-proto-gen",
outs = ["my-proto.cc", "my-proto.h"],
cmd = "$(location //path/to:protoc) --cpp_out=$@ $<",
srcs = ["my-proto.proto"],
tools = ["//path/to:protoc"],
)
cc_library(
name = "my-proto",
srcs = ["my-proto.cc"],
hdrs = ["my-proto.h"],
)
根据您的制作规则,我假设您想要多次执行此操作。在这种情况下,您可以在 .bzl 文件中定义 宏。宏基本上是调用构建规则的函数:
# In, say, foo/bar.bzl.
def cpp_proto(name, src):
native.genrule(
name = "%s-gen" % name,
outs = ["%s.cc" % name, "%s.h" % name],
cmd = "$(location //path/to:protoc) --cpp_out=$@ $<",
srcs = [src],
tools = ["//path/to:protoc"],
)
native.cc_library(
name = name,
srcs = ["%s.cc" % name],
hdrs = ["%s.h" % name],
)
然后在 foo/BUILD 中,您可以导入并使用您的宏来简洁地调用规则:
load('//foo:bar.bzl', 'cpp_proto')
cpp_proto('my-proto', 'my_proto.proto')
那么你可以依赖cc_librarys、cc_binarys和cc_tests中的//foo:my-proto。
最后,您可能想关注https://github.com/bazelbuild/bazel/issues/52(并且只需使用 mzhaom 的宏)。