blob: 31c8c800d54782a1f3de1b3d7650c6c280c775f0 [file] [log] [blame] [edit]
# Protobuf Rust runtime packages.
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
# begin:github_only
load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
load("@rules_pkg//pkg:zip.bzl", "pkg_zip")
# end:github_only
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
load("//bazel/toolchains:proto_lang_toolchain.bzl", "proto_lang_toolchain")
package(
default_visibility = [
"//:__pkg__", # "public" targets are alias rules in //.
"//src/google/protobuf:__subpackages__",
],
)
licenses(["notice"])
# The current Rust Protobuf runtime for the build. Depending on the value of
# `:rust_proto_library_kernel` build setting it forwards to the cpp or upb kernels. This is the
# target that users are expected to depend on.
#
# Rust gencode (via `rust_upb_proto_library` and `rust_cc_proto_library`) doesn't depend on this
# target, instead, it depends on the kernel-specific libraries directly. The reason is that we need
# to be able to use both kernels in the same build. That allows us to have one TAP config for both
# kernels, and to run tests using a single Blaze invocation.
#
# WARNING: It's critical that users do not end up using Rust Protobufs with multiple kernels in
# their binaries. Currently this is achieved by using bzl visibility on kernel-specific rules.
# TODO: Hide the kernel-specific targets once we can restrict a target visibility to a
# rule.
rust_library(
name = "protobuf",
srcs = ["protobuf.rs"],
rustc_flags = select({
":use_upb_kernel": ["--cfg=upb_kernel"],
"//conditions:default": ["--cfg=cpp_kernel"],
}),
visibility = ["//visibility:public"],
deps = select({
":use_upb_kernel": [":protobuf_upb"],
"//conditions:default": [":protobuf_cpp"],
}),
)
# This list contains kernel-agnostic logic and simple kernel-specific logic controlled by
# `#[cfg(...)]` attributes. That forces us to compile these files twice, once for each kernel. As a
# result these files are included in both `:protobuf_upb` and `:protobuf_cpp`.
# This is in principle identical to how we compile regular Rust source files twice
# (once for production, and once for unit testing).
#
# shared.rs is the root of the crate and has public items re-exported in protobuf.rs for user use.
PROTOBUF_SHARED = [
# go/keep-sorted start
"codegen_traits.rs",
"cord.rs",
"enum.rs",
"internal.rs",
"map.rs",
"optional.rs",
"prelude.rs",
"primitive.rs",
"proto_macro.rs",
"proxied.rs",
"repeated.rs",
"shared.rs",
"string.rs",
# go/keep-sorted end
]
# The Rust Protobuf runtime using the upb kernel.
#
# `rust_upb_proto_library` implicitly depends on this target. This target cannot depend on
# `:rust_proto_library_kernel` build setting; it has to be fully functional under any value of that
# setting.
rust_library(
name = "protobuf_upb",
srcs = PROTOBUF_SHARED + ["upb.rs"],
crate_root = "shared.rs",
proc_macro_deps = [
"@crate_index//:paste",
],
rustc_flags = [
"--cfg=upb_kernel",
"--cfg=bzl",
],
visibility = [
"//rust:__subpackages__",
"//src/google/protobuf:__subpackages__",
],
deps = [
":utf8",
"//rust/upb",
],
)
rust_test(
name = "protobuf_upb_test",
crate = ":protobuf_upb",
rustc_flags = [
"--cfg=upb_kernel",
"--cfg=bzl",
],
deps = [
"@crate_index//:googletest",
],
)
# This provides an identical set of re-exports as `:protobuf` with `:use_upb_kernel` active.
# This is only used for tests shared between runtimes.
rust_library(
name = "protobuf_upb_export",
testonly = True,
srcs = ["protobuf.rs"],
rustc_flags = ["--cfg=upb_kernel"],
visibility = [
"//src/google/protobuf:__subpackages__",
],
deps = [":protobuf_upb"],
)
# The Rust Protobuf runtime using the cpp kernel.
#
# `rust_cpp_proto_library` implicitly depends on this target. This target cannot depend on
# `:rust_proto_library_kernel` build setting; it has to be fully functional under any value of that
# setting.
rust_library(
name = "protobuf_cpp",
srcs = PROTOBUF_SHARED + ["cpp.rs"],
crate_root = "shared.rs",
proc_macro_deps = [
"@crate_index//:paste",
],
rustc_flags = ["--cfg=cpp_kernel"],
deps = [
":utf8",
"//rust/cpp_kernel:cpp_api",
],
)
rust_test(
name = "protobuf_cpp_test",
crate = ":protobuf_cpp",
rustc_flags = [
"--cfg=cpp_kernel",
"--cfg=bzl",
],
deps = [
"@crate_index//:googletest",
],
)
# This provides an identical set of re-exports as `:protobuf` with `:use_upb_kernel` inactive.
# This is only used for tests shared between runtimes.
rust_library(
name = "protobuf_cpp_export",
testonly = True,
srcs = ["protobuf.rs"],
rustc_flags = ["--cfg=cpp_kernel"],
visibility = [
"//src/google/protobuf:__subpackages__",
],
deps = [":protobuf_cpp"],
)
rust_library(
name = "utf8",
srcs = ["utf8.rs"],
visibility = ["//visibility:private"],
)
proto_lang_toolchain(
name = "proto_rust_upb_toolchain",
command_line = "--rust_out=$(OUT)",
progress_message = "Generating Rust proto_library %{label}",
runtime = ":protobuf_upb",
visibility = ["//visibility:public"],
)
proto_lang_toolchain(
name = "proto_rust_cpp_toolchain",
command_line = "--rust_out=$(OUT)",
progress_message = "Generating Rust proto_library %{label}",
runtime = ":protobuf_cpp",
visibility = ["//visibility:public"],
)
package_group(
name = "rust_proto_library_allowed_in_different_package",
packages = ["//rust/test"], # for unittest proto_libraries
)
# This flag controls what kernel all Rust Protobufs are using in the current build.
string_flag(
name = "rust_proto_library_kernel",
build_setting_default = "cpp",
values = [
"upb",
"cpp",
],
)
config_setting(
name = "use_upb_kernel",
flag_values = {
":rust_proto_library_kernel": "upb",
},
)
# begin:github_only
pkg_files(
name = "rust_protobuf_src",
srcs = glob(
[
"*",
],
),
strip_prefix = strip_prefix.from_root("rust"),
visibility = ["//:__pkg__"],
)
pkg_files(
name = "crate_root_files",
srcs = glob(["cargo/**/*"]),
strip_prefix = strip_prefix.from_root("rust/cargo"),
visibility = ["//:__pkg__"],
)
pkg_filegroup(
name = "rust_protobuf_src_dir",
srcs = [
":rust_protobuf_src",
"//rust/upb:rust_protobuf_upb_src",
],
prefix = "src",
)
pkg_files(
name = "amalgamated_upb",
srcs = ["//upb:gen_amalgamation"],
strip_prefix = strip_prefix.from_root(""),
)
pkg_filegroup(
name = "rust_protobuf_libupb_src",
srcs = [
":amalgamated_upb",
"//upb/cmake:upb_cmake_dist",
],
prefix = "libupb",
)
pkg_zip(
name = "rust_crate",
srcs = [
":crate_root_files",
":rust_protobuf_libupb_src",
":rust_protobuf_src_dir",
"//:LICENSE",
],
)
# end:github_only