aboutsummaryrefslogtreecommitdiffhomepage
path: root/bazel/cc_grpc_library.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'bazel/cc_grpc_library.bzl')
-rw-r--r--bazel/cc_grpc_library.bzl61
1 files changed, 61 insertions, 0 deletions
diff --git a/bazel/cc_grpc_library.bzl b/bazel/cc_grpc_library.bzl
new file mode 100644
index 0000000000..9020eacb74
--- /dev/null
+++ b/bazel/cc_grpc_library.bzl
@@ -0,0 +1,61 @@
+"""Generates and compiles C++ grpc stubs from proto_library rules."""
+
+load("//:bazel/generate_cc.bzl", "generate_cc")
+
+def cc_grpc_library(name, srcs, deps, proto_only, **kwargs):
+ """Generates C++ grpc classes from a .proto file.
+
+ Assumes the generated classes will be used in cc_api_version = 2.
+
+ Arguments:
+ name: name of rule.
+ srcs: a single proto_library, which wraps the .proto files with services.
+ deps: a list of C++ proto_library (or cc_proto_library) which provides
+ the compiled code of any message that the services depend on.
+ **kwargs: rest of arguments, e.g., compatible_with and visibility.
+ """
+ if len(srcs) > 1:
+ fail("Only one srcs value supported", "srcs")
+
+ proto_target = "_" + name + "_only"
+ codegen_target = "_" + name + "_codegen"
+ codegen_grpc_target = "_" + name + "_grpc_codegen"
+ proto_deps = ["_" + dep + "_only" for dep in deps if dep.find(':') == -1]
+ proto_deps += [dep.split(':')[0] + ':' + "_" + dep.split(':')[1] + "_only" for dep in deps if dep.find(':') != -1]
+
+ native.proto_library(
+ name = proto_target,
+ srcs = srcs,
+ deps = proto_deps,
+ **kwargs
+ )
+
+ generate_cc(
+ name = codegen_target,
+ srcs = [proto_target],
+ **kwargs
+ )
+
+ if not proto_only:
+ generate_cc(
+ name = codegen_grpc_target,
+ srcs = [proto_target],
+ plugin = "//:grpc_cpp_plugin",
+ **kwargs
+ )
+
+ native.cc_library(
+ name = name,
+ srcs = [":" + codegen_grpc_target, ":" + codegen_target],
+ hdrs = [":" + codegen_grpc_target, ":" + codegen_target],
+ deps = deps + ["//:grpc++", "//:grpc++_codegen_proto", "//external:protobuf"],
+ **kwargs
+ )
+ else:
+ native.cc_library(
+ name = name,
+ srcs = [":" + codegen_target],
+ hdrs = [":" + codegen_target],
+ deps = deps + ["//external:protobuf"],
+ **kwargs
+ )