blob: 5216a7a44b5b0a3a327f8130c064d673438eef96 [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:
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080046 if use_external:
47 # when this file is used by non-grpc projects
48 plugin = "//external:grpc_cpp_plugin"
49 else:
50 plugin = "//:grpc_cpp_plugin"
51
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020052 generate_cc(
53 name = codegen_grpc_target,
54 srcs = [proto_target],
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080055 plugin = plugin,
Makarand Dharmapurikare3e3b2a2017-03-07 16:12:56 -080056 well_known_protos = well_known_protos,
yang-g502ba742018-03-21 14:46:44 -070057 generate_mocks = generate_mocks,
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020058 **kwargs
59 )
60
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080061 if use_external:
62 # when this file is used by non-grpc projects
Vijay Pai95593c52017-11-28 11:35:47 -080063 grpc_deps = ["//external:grpc++_codegen_proto",
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080064 "//external:protobuf"]
65 else:
Vijay Pai95593c52017-11-28 11:35:47 -080066 grpc_deps = ["//:grpc++_codegen_proto", "//external:protobuf"]
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080067
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020068 native.cc_library(
69 name = name,
70 srcs = [":" + codegen_grpc_target, ":" + codegen_target],
71 hdrs = [":" + codegen_grpc_target, ":" + codegen_target],
Makarand Dharmapurikar9098fcc2017-03-02 17:13:10 -080072 deps = deps + grpc_deps,
Nicolas "Pixel" Noble799bd5e2016-10-21 01:54:32 +020073 **kwargs
74 )
75 else:
76 native.cc_library(
77 name = name,
78 srcs = [":" + codegen_target],
79 hdrs = [":" + codegen_target],
80 deps = deps + ["//external:protobuf"],
81 **kwargs
82 )