|
@@ -62,9 +62,19 @@ def _proto_gen_impl(ctx):
|
|
|
if ctx.attr.gen_py:
|
|
|
args += ["--python_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
|
|
|
|
|
|
- if ctx.executable.grpc_cpp_plugin:
|
|
|
- args += ["--plugin=protoc-gen-grpc=" + ctx.executable.grpc_cpp_plugin.path]
|
|
|
- args += ["--grpc_out=" + ctx.var["GENDIR"] + "/" + gen_dir]
|
|
|
+ if ctx.executable.plugin:
|
|
|
+ plugin = ctx.executable.plugin
|
|
|
+ lang = ctx.attr.plugin_language
|
|
|
+ if not lang and plugin.basename.startswith('protoc-gen-'):
|
|
|
+ lang = plugin.basename[len('protoc-gen-'):]
|
|
|
+ if not lang:
|
|
|
+ fail("cannot infer the target language of plugin", "plugin_language")
|
|
|
+
|
|
|
+ outdir = ctx.var["GENDIR"] + "/" + gen_dir
|
|
|
+ if ctx.attr.plugin_options:
|
|
|
+ outdir = ",".join(ctx.attr.plugin_options) + ":" + outdir
|
|
|
+ args += ["--plugin=protoc-gen-%s=%s" % (lang, plugin.path)]
|
|
|
+ args += ["--%s_out=%s" % (lang, outdir)]
|
|
|
|
|
|
if args:
|
|
|
ctx.action(
|
|
@@ -72,6 +82,7 @@ def _proto_gen_impl(ctx):
|
|
|
outputs=ctx.outputs.outs,
|
|
|
arguments=args + import_flags + [s.path for s in srcs],
|
|
|
executable=ctx.executable.protoc,
|
|
|
+ mnemonic="ProtoCompile",
|
|
|
)
|
|
|
|
|
|
return struct(
|
|
@@ -82,7 +93,7 @@ def _proto_gen_impl(ctx):
|
|
|
),
|
|
|
)
|
|
|
|
|
|
-_proto_gen = rule(
|
|
|
+proto_gen = rule(
|
|
|
attrs = {
|
|
|
"srcs": attr.label_list(allow_files = True),
|
|
|
"deps": attr.label_list(providers = ["proto"]),
|
|
@@ -93,11 +104,13 @@ _proto_gen = rule(
|
|
|
single_file = True,
|
|
|
mandatory = True,
|
|
|
),
|
|
|
- "grpc_cpp_plugin": attr.label(
|
|
|
+ "plugin": attr.label(
|
|
|
cfg = HOST_CFG,
|
|
|
+ allow_files = True,
|
|
|
executable = True,
|
|
|
- single_file = True,
|
|
|
),
|
|
|
+ "plugin_language": attr.string(),
|
|
|
+ "plugin_options": attr.string_list(),
|
|
|
"gen_cc": attr.bool(),
|
|
|
"gen_py": attr.bool(),
|
|
|
"outs": attr.output_list(),
|
|
@@ -105,6 +118,26 @@ _proto_gen = rule(
|
|
|
output_to_genfiles = True,
|
|
|
implementation = _proto_gen_impl,
|
|
|
)
|
|
|
+"""Generates codes from Protocol Buffers definitions.
|
|
|
+
|
|
|
+This rule helps you to implement Skylark macros specific to the target
|
|
|
+language. You should prefer more specific `cc_proto_library `,
|
|
|
+`py_proto_library` and others unless you are adding such wrapper macros.
|
|
|
+
|
|
|
+Args:
|
|
|
+ srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
|
|
|
+ against.
|
|
|
+ deps: a list of dependency labels; must be other proto libraries.
|
|
|
+ includes: a list of include paths to .proto files.
|
|
|
+ protoc: the label of the protocol compiler to generate the sources.
|
|
|
+ plugin: the label of the protocol compiler plugin to be passed to the protocol
|
|
|
+ compiler.
|
|
|
+ plugin_language: the language of the generated sources
|
|
|
+ plugin_options: a list of options to be passed to the plugin
|
|
|
+ gen_cc: generates C++ sources in addition to the ones from the plugin.
|
|
|
+ gen_py: generates Python sources in addition to the ones from the plugin.
|
|
|
+ outs: a list of labels of the expected outputs from the protocol compiler.
|
|
|
+"""
|
|
|
|
|
|
def cc_proto_library(
|
|
|
name,
|
|
@@ -150,7 +183,7 @@ def cc_proto_library(
|
|
|
if internal_bootstrap_hack:
|
|
|
# For pre-checked-in generated files, we add the internal_bootstrap_hack
|
|
|
# which will skip the codegen action.
|
|
|
- _proto_gen(
|
|
|
+ proto_gen(
|
|
|
name=name + "_genproto",
|
|
|
srcs=srcs,
|
|
|
deps=[s + "_genproto" for s in deps],
|
|
@@ -170,13 +203,14 @@ def cc_proto_library(
|
|
|
|
|
|
outs = _CcOuts(srcs, use_grpc_plugin)
|
|
|
|
|
|
- _proto_gen(
|
|
|
+ proto_gen(
|
|
|
name=name + "_genproto",
|
|
|
srcs=srcs,
|
|
|
deps=[s + "_genproto" for s in deps],
|
|
|
includes=includes,
|
|
|
protoc=protoc,
|
|
|
- grpc_cpp_plugin=grpc_cpp_plugin,
|
|
|
+ plugin=grpc_cpp_plugin,
|
|
|
+ plugin_language="grpc",
|
|
|
gen_cc=1,
|
|
|
outs=outs,
|
|
|
visibility=["//visibility:public"],
|
|
@@ -286,7 +320,7 @@ def py_proto_library(
|
|
|
if include != None:
|
|
|
includes = [include]
|
|
|
|
|
|
- _proto_gen(
|
|
|
+ proto_gen(
|
|
|
name=name + "_genproto",
|
|
|
srcs=srcs,
|
|
|
deps=[s + "_genproto" for s in deps],
|