|
|
|
"""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_proto//proto:defs.bzl", "ProtoInfo", "proto_common")
|
|
|
|
load(
|
|
|
|
"//rust:aspects.bzl",
|
|
|
|
"RustProtoInfo",
|
|
|
|
"proto_rust_toolchain_label",
|
|
|
|
"rust_cc_proto_library_aspect",
|
|
|
|
"rust_upb_proto_library_aspect",
|
|
|
|
)
|
|
|
|
|
|
|
|
visibility([
|
|
|
|
"//experimental/...",
|
|
|
|
"//src/google/protobuf/...",
|
|
|
|
"//rust/...",
|
|
|
|
])
|
|
|
|
|
|
|
|
def rust_proto_library(name, deps, **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`")
|
|
|
|
|
|
|
|
alias_args = {}
|
|
|
|
if "visibility" in args:
|
|
|
|
alias_args["visibility"] = args.pop("visibility")
|
|
|
|
native.alias(
|
|
|
|
name = name,
|
|
|
|
actual = select({
|
|
|
|
"//rust:use_upb_kernel": name + "_upb_kernel",
|
|
|
|
"//conditions:default": name + "_cpp_kernel",
|
|
|
|
}),
|
|
|
|
**alias_args
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_upb_proto_library(
|
|
|
|
name = name + "_upb_kernel",
|
|
|
|
deps = deps,
|
|
|
|
visibility = ["//visibility:private"],
|
|
|
|
**args
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_cc_proto_library(
|
|
|
|
name = name + "_cpp_kernel",
|
|
|
|
deps = deps,
|
|
|
|
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,
|
|
|
|
DefaultInfo(files = dep_variant_info.crate_info.srcs),
|
|
|
|
]
|
|
|
|
|
|
|
|
def _make_rust_proto_library(is_upb):
|
|
|
|
return rule(
|
|
|
|
implementation = _rust_proto_library_impl,
|
|
|
|
attrs = {
|
|
|
|
"deps": attr.label_list(
|
|
|
|
mandatory = True,
|
|
|
|
providers = [ProtoInfo],
|
|
|
|
aspects = [rust_upb_proto_library_aspect if is_upb else rust_cc_proto_library_aspect],
|
|
|
|
),
|
|
|
|
"_proto_lang_toolchain": attr.label(
|
|
|
|
default = Label(proto_rust_toolchain_label(is_upb)),
|
|
|
|
),
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_upb_proto_library = _make_rust_proto_library(is_upb = True)
|
|
|
|
rust_cc_proto_library = _make_rust_proto_library(is_upb = False)
|