Index: third_party/protobuf/protobuf.bzl |
diff --git a/third_party/protobuf/protobuf.bzl b/third_party/protobuf/protobuf.bzl |
index bf748db664b971e933b8ae1cb3dbf0109d47caf8..fbcae0b3242f81dfc9cb58ce090714dafa36935b 100644 |
--- a/third_party/protobuf/protobuf.bzl |
+++ b/third_party/protobuf/protobuf.bzl |
@@ -1,17 +1,27 @@ |
# -*- mode: python; -*- PYTHON-PREPROCESSING-REQUIRED |
+def _GetPath(ctx, path): |
+ if ctx.label.workspace_root: |
+ return ctx.label.workspace_root + '/' + path |
+ else: |
+ return path |
+ |
def _GenDir(ctx): |
if not ctx.attr.includes: |
- return "" |
+ return ctx.label.workspace_root |
if not ctx.attr.includes[0]: |
- return ctx.label.package |
+ return _GetPath(ctx, ctx.label.package) |
if not ctx.label.package: |
- return ctx.attr.includes[0] |
- return ctx.label.package + '/' + ctx.attr.includes[0] |
+ return _GetPath(ctx, ctx.attr.includes[0]) |
+ return _GetPath(ctx, ctx.label.package + '/' + ctx.attr.includes[0]) |
-def _CcOuts(srcs): |
- return [s[:-len(".proto")] + ".pb.h" for s in srcs] + \ |
- [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.h" for s in srcs] + \ |
+ [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs] |
+ return ret |
def _PyOuts(srcs): |
return [s[:-len(".proto")] + "_pb2.py" for s in srcs] |
@@ -36,8 +46,6 @@ def _RelativeOutputPath(path, include): |
return path[len(PACKAGE_NAME)+1:] |
- |
- |
def _proto_gen_impl(ctx): |
"""General implementation for generating protos""" |
srcs = ctx.files.srcs |
@@ -59,6 +67,10 @@ 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 args: |
ctx.action( |
inputs=srcs + deps, |
@@ -86,6 +98,11 @@ _proto_gen = rule( |
single_file = True, |
mandatory = True, |
), |
+ "grpc_cpp_plugin": attr.label( |
+ cfg = HOST_CFG, |
+ executable = True, |
+ single_file = True, |
+ ), |
"gen_cc": attr.bool(), |
"gen_py": attr.bool(), |
"outs": attr.output_list(), |
@@ -100,9 +117,10 @@ def cc_proto_library( |
deps=[], |
cc_libs=[], |
include=None, |
- protoc="//google/protobuf:protoc", |
+ protoc="//:protoc", |
internal_bootstrap_hack=False, |
- default_runtime="//google/protobuf:protobuf", |
+ use_grpc_plugin=False, |
+ default_runtime="//:protobuf", |
**kargs): |
"""Bazel rule to create a C++ protobuf library from proto source files |
@@ -122,6 +140,8 @@ def cc_proto_library( |
for bootstraping. When it is set to True, no files will be generated. |
The rule will simply be a provider for .proto files, so that other |
cc_proto_library can depend on it. |
+ use_grpc_plugin: a flag to indicate whether to call the grpc C++ plugin |
+ when processing the proto files. |
default_runtime: the implicitly default runtime which will be depended on by |
the generated cc_library target. |
**kargs: other keyword arguments that are passed to cc_library. |
@@ -149,13 +169,19 @@ def cc_proto_library( |
**kargs) |
return |
- outs = _CcOuts(srcs) |
+ grpc_cpp_plugin = None |
+ if use_grpc_plugin: |
+ grpc_cpp_plugin = "//external:grpc_cpp_plugin" |
+ |
+ outs = _CcOuts(srcs, use_grpc_plugin) |
+ |
_proto_gen( |
name=name + "_genproto", |
srcs=srcs, |
deps=[s + "_genproto" for s in deps], |
includes=includes, |
protoc=protoc, |
+ grpc_cpp_plugin=grpc_cpp_plugin, |
gen_cc=1, |
outs=outs, |
visibility=["//visibility:public"], |
@@ -163,6 +189,8 @@ def cc_proto_library( |
if default_runtime and not default_runtime in cc_libs: |
cc_libs += [default_runtime] |
+ if use_grpc_plugin: |
+ cc_libs += ["//external:grpc_lib"] |
native.cc_library( |
name=name, |
@@ -172,34 +200,28 @@ def cc_proto_library( |
**kargs) |
-def internal_copied_filegroup( |
- name, |
- srcs, |
- include, |
- **kargs): |
- """Bazel rule to fix sources file to workaround with python path issues. |
+def internal_gen_well_known_protos_java(srcs): |
+ """Bazel rule to generate the gen_well_known_protos_java genrule |
Args: |
- name: the name of the internal_copied_filegroup rule, which will be the |
- name of the generated filegroup. |
- srcs: the source files to be copied. |
- include: the expected import root of the source. |
- **kargs: extra arguments that will be passed into the filegroup. |
+ srcs: the well known protos |
""" |
- outs = [_RelativeOutputPath(s, include) for s in srcs] |
- |
+ root = Label("%s//protobuf_java" % (REPOSITORY_NAME)).workspace_root |
+ if root == "": |
+ include = " -Isrc " |
+ else: |
+ include = " -I%s/src " % root |
native.genrule( |
- name=name+"_genrule", |
- srcs=srcs, |
- outs=outs, |
- cmd=" && ".join(["cp $(location %s) $(location %s)" % |
- (s, _RelativeOutputPath(s, include)) |
- for s in srcs])) |
- |
- native.filegroup( |
- name=name, |
- srcs=outs, |
- **kargs) |
+ name = "gen_well_known_protos_java", |
+ srcs = srcs, |
+ outs = [ |
+ "wellknown.srcjar", |
+ ], |
+ cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" + |
+ " %s $(SRCS) " % include + |
+ " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar", |
+ tools = [":protoc"], |
+ ) |
def py_proto_library( |
@@ -209,8 +231,8 @@ def py_proto_library( |
py_libs=[], |
py_extra_srcs=[], |
include=None, |
- default_runtime="//google/protobuf:protobuf_python", |
- protoc="//google/protobuf:protoc", |
+ default_runtime="//:protobuf_python", |
+ protoc="//:protoc", |
**kargs): |
"""Bazel rule to create a Python protobuf library from proto source files |
@@ -250,15 +272,6 @@ def py_proto_library( |
visibility=["//visibility:public"], |
) |
- if include != None: |
- # Copy the output files to the desired location to make the import work. |
- internal_copied_filegroup_name=name + "_internal_copied_filegroup" |
- internal_copied_filegroup( |
- name=internal_copied_filegroup_name, |
- srcs=outs, |
- include=include) |
- outs=[internal_copied_filegroup_name] |
- |
if default_runtime and not default_runtime in py_libs + deps: |
py_libs += [default_runtime] |
@@ -266,6 +279,7 @@ def py_proto_library( |
name=name, |
srcs=outs+py_extra_srcs, |
deps=py_libs+deps, |
+ imports=includes, |
**kargs) |
def internal_protobuf_py_tests( |
@@ -282,8 +296,7 @@ def internal_protobuf_py_tests( |
""" |
for m in modules: |
- s = _RelativeOutputPath( |
- "python/google/protobuf/internal/%s.py" % m, "python") |
+ s = "python/google/protobuf/internal/%s.py" % m |
native.py_test( |
name="py_%s" % m, |
srcs=[s], |