"""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 )