|  | @@ -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],
 |