Nicolas "Pixel" Noble | 4dc6431 | 2016-10-20 23:07:37 +0200 | [diff] [blame] | 1 | """Generates and compiles C++ grpc stubs from proto_library rules.""" |
| 2 | |
| 3 | load("//:bazel/generate_cc.bzl", "generate_cc") |
| 4 | |
yang-g | 502ba74 | 2018-03-21 14:46:44 -0700 | [diff] [blame] | 5 | def cc_grpc_library(name, srcs, deps, proto_only, well_known_protos, generate_mocks = False, use_external = False, **kwargs): |
Nicolas "Pixel" Noble | 4dc6431 | 2016-10-20 23:07:37 +0200 | [diff] [blame] | 6 | """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 Tiller | a753371 | 2017-05-16 13:09:33 -0700 | [diff] [blame] | 15 | well_known_protos: Should this library additionally depend on well known |
| 16 | protos |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 17 | 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-g | 69d7a03 | 2018-03-22 09:40:45 -0700 | [diff] [blame] | 19 | generate_mocks: When True, Google Mock code for client stub is generated. |
Nicolas "Pixel" Noble | 4dc6431 | 2016-10-20 23:07:37 +0200 | [diff] [blame] | 20 | **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" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 25 | proto_target = "_" + name + "_only" |
Nicolas "Pixel" Noble | 4dc6431 | 2016-10-20 23:07:37 +0200 | [diff] [blame] | 26 | codegen_target = "_" + name + "_codegen" |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 27 | 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" Noble | 4dc6431 | 2016-10-20 23:07:37 +0200 | [diff] [blame] | 37 | |
| 38 | generate_cc( |
| 39 | name = codegen_target, |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 40 | srcs = [proto_target], |
Makarand Dharmapurikar | e3e3b2a | 2017-03-07 16:12:56 -0800 | [diff] [blame] | 41 | well_known_protos = well_known_protos, |
Nicolas "Pixel" Noble | 4dc6431 | 2016-10-20 23:07:37 +0200 | [diff] [blame] | 42 | **kwargs |
| 43 | ) |
| 44 | |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 45 | if not proto_only: |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 46 | 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" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 52 | generate_cc( |
| 53 | name = codegen_grpc_target, |
| 54 | srcs = [proto_target], |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 55 | plugin = plugin, |
Makarand Dharmapurikar | e3e3b2a | 2017-03-07 16:12:56 -0800 | [diff] [blame] | 56 | well_known_protos = well_known_protos, |
yang-g | 502ba74 | 2018-03-21 14:46:44 -0700 | [diff] [blame] | 57 | generate_mocks = generate_mocks, |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 58 | **kwargs |
| 59 | ) |
| 60 | |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 61 | if use_external: |
| 62 | # when this file is used by non-grpc projects |
Vijay Pai | 95593c5 | 2017-11-28 11:35:47 -0800 | [diff] [blame] | 63 | grpc_deps = ["//external:grpc++_codegen_proto", |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 64 | "//external:protobuf"] |
| 65 | else: |
Vijay Pai | 95593c5 | 2017-11-28 11:35:47 -0800 | [diff] [blame] | 66 | grpc_deps = ["//:grpc++_codegen_proto", "//external:protobuf"] |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 67 | |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 68 | native.cc_library( |
| 69 | name = name, |
| 70 | srcs = [":" + codegen_grpc_target, ":" + codegen_target], |
| 71 | hdrs = [":" + codegen_grpc_target, ":" + codegen_target], |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 72 | deps = deps + grpc_deps, |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 73 | **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 | ) |