| # Copyright 2021 The Pigweed Authors |
| # |
| # 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 |
| # |
| # https://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. |
| load("//pw_build:pigweed.bzl", "pw_cc_library") |
| load("@rules_proto//proto:defs.bzl", "ProtoInfo") |
| load("@rules_proto_grpc//:plugin.bzl", "ProtoPluginInfo") |
| load( |
| "@rules_proto_grpc//:aspect.bzl", |
| "ProtoLibraryAspectNodeInfo", |
| "proto_compile_aspect_attrs", |
| "proto_compile_aspect_impl", |
| "proto_compile_attrs", |
| "proto_compile_impl", |
| ) |
| |
| # Create aspect for cc_proto_compile |
| cc_proto_compile_aspect = aspect( |
| implementation = proto_compile_aspect_impl, |
| provides = [ProtoLibraryAspectNodeInfo], |
| attr_aspects = ["deps"], |
| attrs = dict( |
| proto_compile_aspect_attrs, |
| _plugins = attr.label_list( |
| doc = "List of protoc plugins to apply", |
| providers = [ProtoPluginInfo], |
| default = [ |
| Label("@pigweed//pw_protobuf:pw_cc_plugin"), |
| Label("@pigweed//pw_rpc:pw_cc_plugin"), |
| ], |
| ), |
| _prefix = attr.string( |
| doc = "String used to disambiguate aspects when generating outputs", |
| default = "cc_proto_compile_aspect", |
| ), |
| ), |
| toolchains = [str(Label("@rules_proto_grpc//protobuf:toolchain_type"))], |
| ) |
| |
| # Create compile rule to apply aspect |
| _rule = rule( |
| implementation = proto_compile_impl, |
| attrs = dict( |
| proto_compile_attrs, |
| deps = attr.label_list( |
| mandatory = True, |
| providers = [ProtoInfo, ProtoLibraryAspectNodeInfo], |
| aspects = [cc_proto_compile_aspect], |
| ), |
| ), |
| ) |
| |
| # Create macro for converting attrs and passing to compile |
| def _cc_proto_compile(**kwargs): |
| _rule( |
| verbose_string = "{}".format(kwargs.get("verbose", 0)), |
| merge_directories = True, |
| **{k: v for k, v in kwargs.items() if k != "merge_directories"} |
| ) |
| |
| def pw_proto_library(**kwargs): |
| """ Embedded friendly replacement for native.cc_proto_library |
| |
| This Protobuf implementation is designed to run on embedded |
| computers. Because of this the cc API differs from the standard |
| Protobuf cc plugin. The generated headers in this library are not a drop in |
| replacement for the standard cc_proto_library. |
| |
| Args: |
| **kwargs: Equivalent inputs to cc_proto_library |
| """ |
| |
| # Compile protos |
| name_pb = kwargs.get("name") + "_pb" |
| _cc_proto_compile( |
| name = name_pb, |
| # Forward deps and verbose tags to implementation |
| **{k: v for (k, v) in kwargs.items() if k in ("deps", "verbose")} |
| ) |
| |
| # Create cc_library |
| pw_cc_library( |
| name = kwargs.get("name"), |
| srcs = [name_pb], |
| deps = [ |
| "@pigweed//pw_protobuf", |
| ], |
| includes = [name_pb], |
| strip_include_prefix = ".", |
| visibility = kwargs.get("visibility"), |
| linkstatic = 1, |
| ) |