| # Copyright 2019 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Generates proto targets in various languages.""" |
| |
| load("@com_google_protobuf//:protobuf.bzl", "cc_proto_library") |
| |
| def _cc_proto_library_name_from_proto_name(name): |
| """Converts proto name to cc_proto_library name. |
| |
| Several suffixes will be considered. |
| Args: |
| name: the proto name |
| Returns: |
| The cc_proto_library name. |
| """ |
| name = name.replace("-", "_") |
| if name == "proto": |
| # replace 'proto' with 'cc_proto' |
| return "cc_proto" |
| for suffix in [ |
| ".protolib", |
| "protolib", |
| "proto2lib", |
| "proto_lib", |
| "proto2", |
| "protos", |
| "proto2_lib", |
| "libproto", |
| "genproto", |
| "proto", |
| ]: |
| # replace 'suffix' or '_suffix' with '_cc_proto' |
| if name.endswith("_" + suffix): |
| return name[:-len("_" + suffix)] + "_cc_proto" |
| elif name.endswith(suffix): |
| return name[:-len(suffix)] + "_cc_proto" |
| |
| # no match; simply append '_cc_proto' to the end |
| return name + "_cc_proto" |
| |
| def sapi_proto_library( |
| name, |
| srcs = [], |
| deps = [], |
| alwayslink = False, |
| **kwargs): |
| """Generates proto library and C++ targets. |
| |
| Args: |
| name: Name for proto_library and base for the cc_proto_library name, name + |
| "_cc_proto". |
| srcs: Same as proto_library deps. |
| deps: Same as proto_library deps. |
| alwayslink: Same as cc_library. |
| **kwargs: proto_library arguments. |
| """ |
| if kwargs.get("has_services", False): |
| fail("Services are not currently supported.") |
| |
| cc_proto_library( |
| name = name, |
| srcs = srcs, |
| deps = deps, |
| alwayslink = alwayslink, |
| **kwargs |
| ) |
| native.cc_library( |
| name = _cc_proto_library_name_from_proto_name(name), |
| deps = [name], |
| alwayslink = alwayslink, |
| **kwargs |
| ) |