# 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)", output_files = "multiple", 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)", output_files = "multiple", 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"], )