# Protobuf Rust runtime packages. load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test") load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain") package( default_visibility = [ "//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"], }), 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 # unittesting). # # shared.rs is the root of the crate and has public items re-exported in protobuf.rs for user use. PROTOBUF_SHARED = [ "enum.rs", "internal.rs", "macros.rs", "optional.rs", "primitive.rs", "proxied.rs", "repeated.rs", "shared.rs", "string.rs", "vtable.rs", "map.rs", ] # 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"], visibility = [ "//rust:__subpackages__", "//src/google/protobuf:__subpackages__", ], deps = [ ":utf8", "//rust/upb_kernel:upb_c_api", ], ) rust_test( name = "protobuf_upb_test", crate = ":protobuf_upb", rustc_flags = ["--cfg=upb_kernel"], deps = [ "@crate_index//:googletest", ], ) # 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"], deps = [ "@crate_index//:googletest", ], ) 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"], ) # 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", }, )