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: |
kailashs | c4b5102 | 2018-06-03 13:39:32 -0700 | [diff] [blame] | 46 | plugin = "@com_github_grpc_grpc//:grpc_cpp_plugin" |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 47 | generate_cc( |
| 48 | name = codegen_grpc_target, |
| 49 | srcs = [proto_target], |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 50 | plugin = plugin, |
Makarand Dharmapurikar | e3e3b2a | 2017-03-07 16:12:56 -0800 | [diff] [blame] | 51 | well_known_protos = well_known_protos, |
yang-g | 502ba74 | 2018-03-21 14:46:44 -0700 | [diff] [blame] | 52 | generate_mocks = generate_mocks, |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 53 | **kwargs |
| 54 | ) |
kailashs | c4b5102 | 2018-06-03 13:39:32 -0700 | [diff] [blame] | 55 | grpc_deps = ["@com_github_grpc_grpc//:grpc++_codegen_proto", |
| 56 | "//external:protobuf"] |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 57 | native.cc_library( |
| 58 | name = name, |
| 59 | srcs = [":" + codegen_grpc_target, ":" + codegen_target], |
| 60 | hdrs = [":" + codegen_grpc_target, ":" + codegen_target], |
Makarand Dharmapurikar | 9098fcc | 2017-03-02 17:13:10 -0800 | [diff] [blame] | 61 | deps = deps + grpc_deps, |
Nicolas "Pixel" Noble | 799bd5e | 2016-10-21 01:54:32 +0200 | [diff] [blame] | 62 | **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 | ) |