|
|
|
# Protobuf Rust runtime packages.
|
|
|
|
|
|
|
|
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
|
|
|
|
load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
|
|
|
|
load("@rules_pkg//pkg:tar.bzl", "pkg_tar")
|
|
|
|
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
|
|
|
|
load("//bazel/toolchains:proto_lang_toolchain.bzl", "proto_lang_toolchain")
|
|
|
|
load("//rust:dist.bzl", "pkg_cross_compiled_binaries")
|
|
|
|
|
|
|
|
licenses(["notice"])
|
|
|
|
|
|
|
|
package_group(
|
|
|
|
name = "protobuf_internal",
|
|
|
|
packages = [
|
|
|
|
"//rust/...",
|
|
|
|
"//src/google/protobuf/...",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
# 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 = [":protobuf_internal"],
|
|
|
|
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 = [":protobuf_internal"],
|
|
|
|
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",
|
|
|
|
"--cfg=bzl",
|
|
|
|
],
|
|
|
|
visibility = [":protobuf_internal"],
|
|
|
|
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 = [":protobuf_internal"],
|
|
|
|
deps = [":protobuf_cpp"],
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_library(
|
|
|
|
name = "protobuf_gtest_matchers",
|
|
|
|
testonly = True,
|
|
|
|
srcs = ["gtest_matchers.rs"],
|
|
|
|
aliases = select({
|
|
|
|
":use_upb_kernel": {"//rust:protobuf_gtest_matchers_upb": "protobuf_gtest_matchers_impl"},
|
|
|
|
"//conditions:default": {"//rust:protobuf_gtest_matchers_cpp": "protobuf_gtest_matchers_impl"},
|
|
|
|
}),
|
|
|
|
visibility = ["//visibility:public"],
|
|
|
|
deps = select({
|
|
|
|
":use_upb_kernel": [":protobuf_gtest_matchers_upb"],
|
|
|
|
"//conditions:default": [":protobuf_gtest_matchers_cpp"],
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_library(
|
|
|
|
name = "protobuf_gtest_matchers_cpp",
|
|
|
|
testonly = True,
|
|
|
|
srcs = ["gtest_matchers_impl.rs"],
|
|
|
|
aliases = {
|
|
|
|
"//rust:protobuf_cpp": "protobuf",
|
|
|
|
},
|
|
|
|
visibility = [":protobuf_internal"],
|
|
|
|
deps = [
|
|
|
|
":protobuf_cpp",
|
|
|
|
"@crate_index//:googletest",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_library(
|
|
|
|
name = "protobuf_gtest_matchers_upb",
|
|
|
|
testonly = True,
|
|
|
|
srcs = ["gtest_matchers_impl.rs"],
|
|
|
|
aliases = {
|
|
|
|
"//rust:protobuf_upb": "protobuf",
|
|
|
|
},
|
|
|
|
visibility = [":protobuf_internal"],
|
|
|
|
deps = [
|
|
|
|
":protobuf_upb",
|
|
|
|
"@crate_index//:googletest",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
rust_library(
|
|
|
|
name = "utf8",
|
|
|
|
srcs = ["utf8.rs"],
|
|
|
|
)
|
|
|
|
|
|
|
|
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",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
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_tar(
|
|
|
|
name = "protobuf_crate_dist",
|
|
|
|
srcs = [
|
|
|
|
":crate_root_files",
|
|
|
|
":rust_protobuf_libupb_src",
|
|
|
|
":rust_protobuf_src_dir",
|
|
|
|
"//:LICENSE",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
pkg_files(
|
|
|
|
name = "protobuf_codegen_files",
|
|
|
|
srcs = glob(["protobuf_codegen/src/*"]) + ["protobuf_codegen/Cargo.toml"],
|
|
|
|
strip_prefix = strip_prefix.from_root("rust/protobuf_codegen"),
|
|
|
|
)
|
|
|
|
|
|
|
|
pkg_tar(
|
|
|
|
name = "codegen_crate_dist",
|
|
|
|
srcs = [
|
|
|
|
":protobuf_codegen_files",
|
|
|
|
":vendored_protocs_dist",
|
|
|
|
"//:LICENSE",
|
|
|
|
],
|
|
|
|
tags = ["manual"],
|
|
|
|
visibility = ["//rust:__pkg__"],
|
|
|
|
)
|
|
|
|
|
|
|
|
pkg_tar(
|
|
|
|
name = "codegen_crate_test",
|
|
|
|
srcs = [
|
|
|
|
":protobuf_codegen_files",
|
|
|
|
":vendored_protocs_test",
|
|
|
|
"//:LICENSE",
|
|
|
|
],
|
|
|
|
tags = ["manual"],
|
|
|
|
visibility = ["//rust:__pkg__"],
|
|
|
|
)
|
|
|
|
|
|
|
|
pkg_files(
|
|
|
|
name = "codegen_example_files",
|
|
|
|
srcs = glob(["protobuf_codegen/example/**/*"]),
|
|
|
|
strip_prefix = strip_prefix.from_root("rust/protobuf_codegen/example"),
|
|
|
|
)
|
|
|
|
|
|
|
|
pkg_tar(
|
|
|
|
name = "codegen_example_test",
|
|
|
|
srcs = [
|
|
|
|
":codegen_example_files",
|
|
|
|
"//:LICENSE",
|
|
|
|
],
|
|
|
|
visibility = ["//rust:__pkg__"],
|
|
|
|
)
|
|
|
|
|
|
|
|
# Bundle all protoc binaries for all platforms. Requires the toolchains to be installed.
|
|
|
|
pkg_cross_compiled_binaries(
|
|
|
|
name = "vendored_protocs_dist",
|
|
|
|
cpus = [
|
|
|
|
# TODO: Re-enable these platforms once the toolchains are available.
|
|
|
|
# "osx-x86_64",
|
|
|
|
# "osx-aarch_64",
|
|
|
|
"linux-aarch_64",
|
|
|
|
"linux-ppcle_64",
|
|
|
|
# "linux-s390_64",
|
|
|
|
"linux-x86_32",
|
|
|
|
"linux-x86_64",
|
|
|
|
"win32",
|
|
|
|
"win64",
|
|
|
|
],
|
|
|
|
prefix = "bin",
|
|
|
|
tags = ["manual"],
|
|
|
|
targets = [
|
|
|
|
"//upb_generator/minitable:protoc-gen-upb_minitable",
|
|
|
|
"//:protoc",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
# Bundle only the linux-x86_64 protoc for testing.
|
|
|
|
pkg_cross_compiled_binaries(
|
|
|
|
name = "vendored_protocs_test",
|
|
|
|
cpus = [
|
|
|
|
"linux-x86_64",
|
|
|
|
],
|
|
|
|
prefix = "bin",
|
|
|
|
tags = ["manual"],
|
|
|
|
targets = [
|
|
|
|
"//upb_generator/minitable:protoc-gen-upb_minitable",
|
|
|
|
"//:protoc",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
# Run the cargo test with only a bundled linux-x86_64 protoc.
|
|
|
|
sh_binary(
|
|
|
|
name = "cargo_test",
|
|
|
|
srcs = ["cargo_test.sh"],
|
|
|
|
data = [
|
|
|
|
":codegen_crate_test",
|
|
|
|
":codegen_example_test",
|
|
|
|
":protobuf_crate_dist",
|
|
|
|
],
|
|
|
|
tags = ["manual"],
|
|
|
|
deps = ["@bazel_tools//tools/bash/runfiles"],
|
|
|
|
)
|
|
|
|
|
|
|
|
# Run the cargo test with all bundled protocs.
|
|
|
|
sh_binary(
|
|
|
|
name = "cargo_release_test",
|
|
|
|
srcs = ["cargo_test.sh"],
|
|
|
|
data = [
|
|
|
|
":codegen_crate_dist",
|
|
|
|
":codegen_example_test",
|
|
|
|
":protobuf_crate_dist",
|
|
|
|
],
|
|
|
|
tags = ["manual"],
|
|
|
|
deps = ["@bazel_tools//tools/bash/runfiles"],
|
|
|
|
)
|