blob: 32885657141fc323efcc254b1b5badc81185a4db [file] [log] [blame]
Nicolas "Pixel" Noble4dc64312016-10-20 23:07:37 +02001"""Generates and compiles C++ grpc stubs from proto_library rules."""
2
3load("//:bazel/generate_cc.bzl", "generate_cc")
4
yang-g502ba742018-03-21 14:46:44 -07005def cc_grpc_library(name, srcs, deps, proto_only, well_known_protos, generate_mocks = False, use_external = False, **kwargs):
Nicolas "Pixel" Noble4dc64312016-10-20 23:07:37 +02006 """Generates C++ grpc classes from a .proto file.
7
8 Assumes the generated classes will be used in cc_api_version = 2.
9
10 Arguments:
11 name: name of rule.
12 srcs: a single proto_library, which wraps the .proto files with services.
13 deps: a list of C++ proto_library (or cc_proto_library) which provides
14 the compiled code of any message that the services depend on.
Craig Tillera7533712017-05-16 13:09:33 -070015 well_known_protos: Should this library additionally depend on well known
16 protos
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080017 use_external: When True the grpc deps are prefixed with //external. This
18 allows grpc to be used as a dependency in other bazel projects.
yang-g69d7a032018-03-22 09:40:45 -070019 generate_mocks: When True, Google Mock code for client stub is generated.
Nicolas "Pixel" Noble4dc64312016-10-20 23:07:37 +020020 **kwargs: rest of arguments, e.g., compatible_with and visibility.
21 """
22 if len(srcs) > 1:
23 fail("Only one srcs value supported", "srcs")
24
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020025 proto_target = "_" + name + "_only"
Nicolas "Pixel" Noble4dc64312016-10-20 23:07:37 +020026 codegen_target = "_" + name + "_codegen"
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020027 codegen_grpc_target = "_" + name + "_grpc_codegen"
28 proto_deps = ["_" + dep + "_only" for dep in deps if dep.find(':') == -1]
29 proto_deps += [dep.split(':')[0] + ':' + "_" + dep.split(':')[1] + "_only" for dep in deps if dep.find(':') != -1]
30
31 native.proto_library(
32 name = proto_target,
33 srcs = srcs,
34 deps = proto_deps,
35 **kwargs
36 )
Nicolas "Pixel" Noble4dc64312016-10-20 23:07:37 +020037
38 generate_cc(
39 name = codegen_target,
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020040 srcs = [proto_target],
Makarand Dharmapurikare3e3b2a2017-03-07 16:12:56 -080041 well_known_protos = well_known_protos,
Nicolas "Pixel" Noble4dc64312016-10-20 23:07:37 +020042 **kwargs
43 )
44
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020045 if not proto_only:
kailashsc4b51022018-06-03 13:39:32 -070046 plugin = "@com_github_grpc_grpc//:grpc_cpp_plugin"
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020047 generate_cc(
48 name = codegen_grpc_target,
49 srcs = [proto_target],
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080050 plugin = plugin,
Makarand Dharmapurikare3e3b2a2017-03-07 16:12:56 -080051 well_known_protos = well_known_protos,
yang-g502ba742018-03-21 14:46:44 -070052 generate_mocks = generate_mocks,
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020053 **kwargs
54 )
kailashsc4b51022018-06-03 13:39:32 -070055 grpc_deps = ["@com_github_grpc_grpc//:grpc++_codegen_proto",
56 "//external:protobuf"]
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020057 native.cc_library(
58 name = name,
59 srcs = [":" + codegen_grpc_target, ":" + codegen_target],
60 hdrs = [":" + codegen_grpc_target, ":" + codegen_target],
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080061 deps = deps + grpc_deps,
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020062 **kwargs
63 )
64 else:
65 native.cc_library(
66 name = name,
67 srcs = [":" + codegen_target],
68 hdrs = [":" + codegen_target],
69 deps = deps + ["//external:protobuf"],
70 **kwargs
71 )