blob: c3a56dcaccf9abff9b0f10d915c8f1c2f0a3adde [file] [log] [blame]
# Copyright 2021 The gRPC Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""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
)