Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.9 KiB
90 lines
2.9 KiB
"""This file implements an experimental, do-not-use-kind of rust_proto_library. |
|
|
|
Disclaimer: This project is experimental, under heavy development, and should not |
|
be used yet.""" |
|
|
|
load("@rules_cc//cc:defs.bzl", "cc_proto_library") |
|
load( |
|
"//rust:aspects.bzl", |
|
"RustProtoInfo", |
|
"rust_cc_proto_library_aspect", |
|
"rust_upb_proto_library_aspect", |
|
) |
|
|
|
visibility([ |
|
"//experimental/...", |
|
"//src/google/protobuf/...", |
|
"//rust/...", |
|
]) |
|
|
|
def rust_proto_library(name, deps, visibility = [], **args): |
|
"""Declares all the boilerplate needed to use Rust protobufs conveniently. |
|
|
|
Hopefully no user will ever need to read this code. |
|
|
|
|
|
Args: |
|
name: name of the Rust protobuf target. |
|
deps: proto_library target for which to generate Rust gencode. |
|
**args: other args passed to the rust_<kernel>_proto_library targets. |
|
""" |
|
if not name.endswith("_rust_proto"): |
|
fail("Name of each rust_proto_library target should end with `_rust_proto`") |
|
native.alias( |
|
name = name, |
|
actual = select({ |
|
"//rust:use_upb_kernel": name + "_upb_kernel", |
|
"//conditions:default": name + "_cpp_kernel", |
|
}), |
|
visibility = visibility, |
|
) |
|
|
|
rust_upb_proto_library( |
|
name = name + "_upb_kernel", |
|
deps = deps, |
|
visibility = ["//visibility:private"], |
|
**args |
|
) |
|
|
|
# TODO: Stop declaring cc_proto_library once we can use cc_proto_aspect directly. |
|
_cc_proto_name = name.removesuffix("_rust_proto") + "_cc_proto" |
|
if not native.existing_rule(_cc_proto_name): |
|
cc_proto_library( |
|
name = _cc_proto_name, |
|
deps = deps, |
|
visibility = ["//visibility:private"], |
|
**args |
|
) |
|
rust_cc_proto_library( |
|
name = name + "_cpp_kernel", |
|
deps = [_cc_proto_name], |
|
visibility = ["//visibility:private"], |
|
**args |
|
) |
|
|
|
def _rust_proto_library_impl(ctx): |
|
deps = ctx.attr.deps |
|
if not deps: |
|
fail("Exactly 1 dependency in `deps` attribute expected, none were provided.") |
|
if len(deps) > 1: |
|
fail("Exactly 1 dependency in `deps` attribute expected, too many were provided.") |
|
|
|
dep = deps[0] |
|
rust_proto_info = dep[RustProtoInfo] |
|
dep_variant_info = rust_proto_info.dep_variant_info |
|
return [dep_variant_info.crate_info, dep_variant_info.dep_info, dep_variant_info.cc_info] |
|
|
|
def _make_rust_proto_library(is_upb): |
|
return rule( |
|
implementation = _rust_proto_library_impl, |
|
attrs = { |
|
"deps": attr.label_list( |
|
mandatory = True, |
|
providers = [ProtoInfo] if is_upb else [CcInfo], |
|
aspects = [rust_upb_proto_library_aspect if is_upb else rust_cc_proto_library_aspect], |
|
), |
|
}, |
|
) |
|
|
|
rust_upb_proto_library = _make_rust_proto_library(is_upb = True) |
|
rust_cc_proto_library = _make_rust_proto_library(is_upb = False)
|
|
|