Index: third_party/protobuf/protobuf.bzl |
diff --git a/third_party/protobuf/protobuf.bzl b/third_party/protobuf/protobuf.bzl |
index 3998e77b03916ad474d71d413bbcfaa587f9c289..fbcae0b3242f81dfc9cb58ce090714dafa36935b 100644 |
--- a/third_party/protobuf/protobuf.bzl |
+++ b/third_party/protobuf/protobuf.bzl |
@@ -1,3 +1,5 @@ |
+# -*- mode: python; -*- PYTHON-PREPROCESSING-REQUIRED |
+ |
def _GetPath(ctx, path): |
if ctx.label.workspace_root: |
return ctx.label.workspace_root + '/' + path |
@@ -13,25 +15,18 @@ def _GenDir(ctx): |
return _GetPath(ctx, ctx.attr.includes[0]) |
return _GetPath(ctx, ctx.label.package + '/' + ctx.attr.includes[0]) |
-def _CcHdrs(srcs, use_grpc_plugin=False): |
- ret = [s[:-len(".proto")] + ".pb.h" for s in srcs] |
- if use_grpc_plugin: |
- ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs] |
- return ret |
- |
-def _CcSrcs(srcs, use_grpc_plugin=False): |
- ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs] |
+def _CcOuts(srcs, use_grpc_plugin=False): |
+ ret = [s[:-len(".proto")] + ".pb.h" for s in srcs] + \ |
+ [s[:-len(".proto")] + ".pb.cc" for s in srcs] |
if use_grpc_plugin: |
- ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs] |
+ ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs] + \ |
+ [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs] |
return ret |
-def _CcOuts(srcs, use_grpc_plugin=False): |
- return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin) |
- |
def _PyOuts(srcs): |
return [s[:-len(".proto")] + "_pb2.py" for s in srcs] |
-def _RelativeOutputPath(path, include, dest=""): |
+def _RelativeOutputPath(path, include): |
if include == None: |
return path |
@@ -40,11 +35,16 @@ def _RelativeOutputPath(path, include, dest=""): |
if include and include[-1] != '/': |
include = include + '/' |
- if dest and dest[-1] != '/': |
- dest = dest + '/' |
path = path[len(include):] |
- return dest + path |
+ |
+ if not path.startswith(PACKAGE_NAME): |
+ fail("The package %s is not within the path %s" % (PACKAGE_NAME, path)) |
+ |
+ if not PACKAGE_NAME: |
+ return path |
+ |
+ return path[len(PACKAGE_NAME)+1:] |
def _proto_gen_impl(ctx): |
"""General implementation for generating protos""" |
@@ -53,7 +53,7 @@ def _proto_gen_impl(ctx): |
deps += ctx.files.srcs |
gen_dir = _GenDir(ctx) |
if gen_dir: |
- import_flags = ["-I" + gen_dir, "-I" + ctx.var["GENDIR"] + "/" + gen_dir] |
+ import_flags = ["-I" + gen_dir] |
else: |
import_flags = ["-I."] |
@@ -67,29 +67,16 @@ def _proto_gen_impl(ctx): |
if ctx.attr.gen_py: |
args += ["--python_out=" + ctx.var["GENDIR"] + "/" + gen_dir] |
- inputs = srcs + deps |
- 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)] |
- inputs += [plugin] |
+ 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 args: |
ctx.action( |
- inputs=inputs, |
+ inputs=srcs + deps, |
outputs=ctx.outputs.outs, |
arguments=args + import_flags + [s.path for s in srcs], |
executable=ctx.executable.protoc, |
- mnemonic="ProtoCompile", |
) |
return struct( |
@@ -100,24 +87,22 @@ 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"]), |
"includes": attr.string_list(), |
"protoc": attr.label( |
- cfg = "host", |
+ cfg = HOST_CFG, |
executable = True, |
single_file = True, |
mandatory = True, |
), |
- "plugin": attr.label( |
- cfg = "host", |
- allow_files = True, |
+ "grpc_cpp_plugin": attr.label( |
+ cfg = HOST_CFG, |
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(), |
@@ -125,26 +110,6 @@ 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, |
@@ -190,7 +155,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], |
@@ -208,18 +173,15 @@ def cc_proto_library( |
if use_grpc_plugin: |
grpc_cpp_plugin = "//external:grpc_cpp_plugin" |
- gen_srcs = _CcSrcs(srcs, use_grpc_plugin) |
- gen_hdrs = _CcHdrs(srcs, use_grpc_plugin) |
- outs = gen_srcs + gen_hdrs |
+ 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, |
- plugin=grpc_cpp_plugin, |
- plugin_language="grpc", |
+ grpc_cpp_plugin=grpc_cpp_plugin, |
gen_cc=1, |
outs=outs, |
visibility=["//visibility:public"], |
@@ -232,12 +194,12 @@ def cc_proto_library( |
native.cc_library( |
name=name, |
- srcs=gen_srcs, |
- hdrs=gen_hdrs, |
+ srcs=outs, |
deps=cc_libs + deps, |
includes=includes, |
**kargs) |
+ |
def internal_gen_well_known_protos_java(srcs): |
"""Bazel rule to generate the gen_well_known_protos_java genrule |
@@ -261,34 +223,6 @@ def internal_gen_well_known_protos_java(srcs): |
tools = [":protoc"], |
) |
-def internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs): |
- """Macro to copy files to a different directory and then create a filegroup. |
- |
- This is used by the //:protobuf_python py_proto_library target to work around |
- an issue caused by Python source files that are part of the same Python |
- package being in separate directories. |
- |
- Args: |
- srcs: The source files to copy and add to the filegroup. |
- strip_prefix: Path to the root of the files to copy. |
- dest: The directory to copy the source files into. |
- **kwargs: extra arguments that will be passesd to the filegroup. |
- """ |
- outs = [_RelativeOutputPath(s, strip_prefix, dest) for s in srcs] |
- |
- native.genrule( |
- name = name + "_genrule", |
- srcs = srcs, |
- outs = outs, |
- cmd = " && ".join( |
- ["cp $(location %s) $(location %s)" % |
- (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]), |
- ) |
- |
- native.filegroup( |
- name = name, |
- srcs = outs, |
- **kwargs) |
def py_proto_library( |
name, |
@@ -299,7 +233,6 @@ def py_proto_library( |
include=None, |
default_runtime="//:protobuf_python", |
protoc="//:protoc", |
- use_grpc_plugin=False, |
**kargs): |
"""Bazel rule to create a Python protobuf library from proto source files |
@@ -319,8 +252,6 @@ def py_proto_library( |
default_runtime: the implicitly default runtime which will be depended on by |
the generated py_library target. |
protoc: the label of the protocol compiler to generate the sources. |
- use_grpc_plugin: a flag to indicate whether to call the Python C++ plugin |
- when processing the proto files. |
**kargs: other keyword arguments that are passed to cc_library. |
""" |
@@ -330,14 +261,7 @@ def py_proto_library( |
if include != None: |
includes = [include] |
- grpc_python_plugin = None |
- if use_grpc_plugin: |
- grpc_python_plugin = "//external:grpc_python_plugin" |
- # Note: Generated grpc code depends on Python grpc module. This dependency |
- # is not explicitly listed in py_libs. Instead, host system is assumed to |
- # have grpc installed. |
- |
- proto_gen( |
+ _proto_gen( |
name=name + "_genproto", |
srcs=srcs, |
deps=[s + "_genproto" for s in deps], |
@@ -346,8 +270,6 @@ def py_proto_library( |
gen_py=1, |
outs=outs, |
visibility=["//visibility:public"], |
- plugin=grpc_python_plugin, |
- plugin_language="grpc" |
) |
if default_runtime and not default_runtime in py_libs + deps: |