blob: 94781ed7ae55e8aaa3fe63e6bb689790a72f6e1c [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
Mahak Mukhi443a75d2017-04-14 15:33:55 -07005def cc_grpc_library(name, srcs, deps, proto_only, well_known_protos, generate_mock, 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.
Mahak Mukhi443a75d2017-04-14 15:33:55 -070019 generate_mock: When true GMOCk 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,
Mahak Mukhi443a75d2017-04-14 15:33:55 -070057 generate_mock = generate_mock,
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 )