blob: 0470a294fc1b2cc235da8c45efa2cac8bc882f14 [file] [log] [blame]
"""Generates and compiles C++ grpc stubs from proto_library rules."""
load(":generate_cc.bzl", "generate_cc")
# Simplified version of gRPC upstream's cc_grpc_library.
def cc_grpc_library(
name,
srcs,
deps,
generate_mocks = False,
extra_cc_library_kwargs = {},
**kwargs):
"""Generates C++ grpc classes for services defined in proto_library rules.
This rule expects a singleton list containing a proto_library target for its
srcs argument, and expects a list (of arbitrary size) of cc_proto_library
targets for its deps argument.
It generates only grpc library classes.
Assumes the generated classes will be used in cc_api_version = 2.
Args:
name (str): Name of rule.
srcs (list): A single proto_library which contains services descriptors.
deps (list): A list of cc_proto_library targets which
provide the compiled code of any message that the services depend on.
generate_mocks (bool): when True, Google Mock code for client stub is
generated. False by default.
extra_cc_library_kwargs (map): extra arguments to pass to the cc_library
rule
**kwargs: extra arguments to pass to all rules instantiated by this
macro. Must be common to all build rules. See
https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
"""
if len(srcs) != 1:
fail("The srcs attribute must be a singleton list but was " + str(srcs),
"srcs")
codegen_grpc_target = "_" + name + "_grpc_codegen"
generate_cc(
name = codegen_grpc_target,
srcs = srcs,
plugin = "//third_party/grpc:cpp_plugin",
generate_mocks = generate_mocks,
protoc = "//third_party/protobuf:protoc",
**kwargs
)
cc_library_kwargs = dict(**extra_cc_library_kwargs)
cc_library_kwargs.update(**kwargs)
native.cc_library(
name = name,
srcs = [":" + codegen_grpc_target],
hdrs = [":" + codegen_grpc_target],
deps = deps + ["//third_party/grpc:grpc++_codegen_proto"],
**cc_library_kwargs
)