From 4c75fc1c4c0ce55d1e7e5d9237d83037f3ec90dc Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 15 Jan 2025 16:09:38 -0800 Subject: [PATCH 1/2] feat: re-enable Java example of using pre-built protoc --- examples/MODULE.bazel | 4 ++-- examples/java/BUILD | 19 +++++++++---------- examples/java/Main.java | 10 +++++----- examples/proto/BUILD.bazel | 11 ++++------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/examples/MODULE.bazel b/examples/MODULE.bazel index c70cebd..9773da9 100644 --- a/examples/MODULE.bazel +++ b/examples/MODULE.bazel @@ -73,8 +73,8 @@ http_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_j http_jar( name = "protobuf-java", - sha256 = "0532ad1024d62361561acaedb974d7d16889e7670b36e23e9321dd6b9d334ef9", - urls = ["https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/4.27.0-RC3/protobuf-java-4.27.0-RC3.jar"], + integrity = "sha256-rSOIR3s7lplCQeZHMaE2iU3J/tbeufJ21ISosXGxRQw=", + urls = ["https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/4.28.0/protobuf-java-4.28.0.jar"], ) ####### RUST ########## diff --git a/examples/java/BUILD b/examples/java/BUILD index e0f5fe8..50d8d1c 100644 --- a/examples/java/BUILD +++ b/examples/java/BUILD @@ -1,10 +1,9 @@ -# See comment in examples/BUILD.bazel -# java_binary( -# name = "java", -# srcs = ["Main.java"], -# main_class = "Main", -# deps = [ -# "//:foo_java_proto", -# "@protobuf-java//jar", -# ], -# ) +java_binary( + name = "java", + srcs = ["Main.java"], + main_class = "Main", + deps = [ + "//proto:greeter_java_proto", + "@protobuf-java//jar", + ], +) diff --git a/examples/java/Main.java b/examples/java/Main.java index dd8deae..4efa820 100644 --- a/examples/java/Main.java +++ b/examples/java/Main.java @@ -1,14 +1,14 @@ import com.google.protobuf.InvalidProtocolBufferException; -import static proto.FooOuterClass.Foo; +import static proto.GreeterOuterClass.HelloReply; public class Main { public static void main(String[] args) throws InvalidProtocolBufferException { System.out.println(makeMessage("Hello World!")); } - public static Foo makeMessage(String msg) { - Foo.Builder person = Foo.newBuilder(); - person.setMsg(msg); - return person.build(); + public static HelloReply makeMessage(String msg) { + HelloReply.Builder response = HelloReply.newBuilder(); + response.setMessage(msg); + return response.build(); } } diff --git a/examples/proto/BUILD.bazel b/examples/proto/BUILD.bazel index 88c206c..588f1ea 100644 --- a/examples/proto/BUILD.bazel +++ b/examples/proto/BUILD.bazel @@ -17,13 +17,10 @@ py_proto_library( deps = [":greeter_proto"], ) -# Broken by https://github.com/protocolbuffers/protobuf/pull/19679 -# which causes building C++ code from source. -# TODO: re-enable once protobuf honors the toolchain -# java_proto_library( -# name = "greeter_java_proto", -# deps = [":greeter_proto"], -# ) +java_proto_library( + name = "greeter_java_proto", + deps = [":greeter_proto"], +) go_proto_library( name = "greeter_go_proto", From 09d1805cc22d0300f095cf01c3232c05c28e46ed Mon Sep 17 00:00:00 2001 From: Adin Cebic Date: Fri, 2 May 2025 20:14:37 +0200 Subject: [PATCH 2/2] Fix java example Signed-off-by: Adin Cebic --- examples/MODULE.bazel | 10 ++ examples/third_party/BUILD.bazel | 0 ...dcoded-dependency-on-protoc-from-lan.patch | 89 +++++++++++++ .../protobuf/0002-Switch-to-toolchains.patch | 123 ++++++++++++++++++ 4 files changed, 222 insertions(+) create mode 100644 examples/third_party/BUILD.bazel create mode 100644 examples/third_party/protobuf/0001-bazel-Remove-hardcoded-dependency-on-protoc-from-lan.patch create mode 100644 examples/third_party/protobuf/0002-Switch-to-toolchains.patch diff --git a/examples/MODULE.bazel b/examples/MODULE.bazel index 9773da9..6484b03 100644 --- a/examples/MODULE.bazel +++ b/examples/MODULE.bazel @@ -5,6 +5,16 @@ bazel_dep(name = "aspect_rules_py", version = "1.3.2") bazel_dep(name = "aspect_rules_ts", version = "3.5.1") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "protobuf", version = "29.3") +single_version_override( + module_name = "protobuf", + patch_strip = 1, + patches = [ + "//third_party:protobuf/0001-bazel-Remove-hardcoded-dependency-on-protoc-from-lan.patch", + "//third_party:protobuf/0002-Switch-to-toolchains.patch", + ], + version = "29.3", +) + bazel_dep(name = "rules_java", version = "8.6.3") bazel_dep(name = "rules_proto", version = "7.1.0") bazel_dep(name = "rules_python", version = "1.2.0-rc0") diff --git a/examples/third_party/BUILD.bazel b/examples/third_party/BUILD.bazel new file mode 100644 index 0000000..e69de29 diff --git a/examples/third_party/protobuf/0001-bazel-Remove-hardcoded-dependency-on-protoc-from-lan.patch b/examples/third_party/protobuf/0001-bazel-Remove-hardcoded-dependency-on-protoc-from-lan.patch new file mode 100644 index 0000000..8d28832 --- /dev/null +++ b/examples/third_party/protobuf/0001-bazel-Remove-hardcoded-dependency-on-protoc-from-lan.patch @@ -0,0 +1,89 @@ +From 755aafd6fa3de6ea507be6a7e5790c6b53e0e5f9 Mon Sep 17 00:00:00 2001 +From: Fabian Meumertzheim +Date: Mon, 16 Dec 2024 15:55:24 +0100 +Subject: [PATCH 1/2] bazel: Remove hardcoded dependency on `//:protoc` from + language runtimes + +Without this change, language runtimes still result in a build of `//:protoc` even with a prebuilt `proto_toolchain` registered or `--proto_compiler` set to a precompiled protoc. +--- + bazel/private/BUILD | 6 ++++++ + protobuf.bzl | 13 +++++-------- + 2 files changed, 11 insertions(+), 8 deletions(-) + +diff --git a/bazel/private/BUILD b/bazel/private/BUILD +index 8c1c94ac8..a5b3abeda 100644 +--- a/bazel/private/BUILD ++++ b/bazel/private/BUILD +@@ -1,4 +1,5 @@ + load("@bazel_skylib//:bzl_library.bzl", "bzl_library") ++load(":current_protoc.bzl", "current_protoc") + load(":native_bool_flag.bzl", "native_bool_flag") + + package(default_applicable_licenses = ["//:license"]) +@@ -28,6 +29,11 @@ toolchain_type( + visibility = ["//visibility:public"], + ) + ++current_protoc( ++ name = "current_protoc", ++ visibility = ["//:__subpackages__"], ++) ++ + bzl_library( + name = "upb_proto_library_internal_bzl", + srcs = [ +diff --git a/protobuf.bzl b/protobuf.bzl +index fdf09bd6b..736cc19cf 100644 +--- a/protobuf.bzl ++++ b/protobuf.bzl +@@ -2,6 +2,7 @@ load("@bazel_skylib//lib:versions.bzl", "versions") + load("@rules_cc//cc:defs.bzl", "objc_library") + load("@rules_python//python:defs.bzl", "py_library") + load("//bazel/common:proto_info.bzl", "ProtoInfo") ++load("//bazel/private:current_protoc.bzl", "ProtocFilesToRun") + + def _GetPath(ctx, path): + if ctx.label.workspace_root: +@@ -310,7 +311,7 @@ def _internal_gen_well_known_protos_java_impl(ctx): + args.add_all([src.path[offset:] for src in dep.direct_sources]) + + ctx.actions.run( +- executable = ctx.executable._protoc, ++ executable = ctx.attr._protoc[ProtocFilesToRun].files_to_run, + inputs = descriptors, + outputs = [srcjar], + arguments = [args], +@@ -335,9 +336,7 @@ internal_gen_well_known_protos_java = rule( + default = False, + ), + "_protoc": attr.label( +- executable = True, +- cfg = "exec", +- default = "//:protoc", ++ default = "//bazel/private:current_protoc", + ), + }, + ) +@@ -373,7 +372,7 @@ def _internal_gen_kt_protos(ctx): + args.add_all([src.path[offset:] for src in dep.direct_sources]) + + ctx.actions.run( +- executable = ctx.executable._protoc, ++ executable = ctx.attr._protoc[ProtocFilesToRun].files_to_run, + inputs = descriptors, + outputs = [srcjar], + arguments = [args], +@@ -398,9 +397,7 @@ internal_gen_kt_protos = rule( + default = False, + ), + "_protoc": attr.label( +- executable = True, +- cfg = "exec", +- default = "//:protoc", ++ default = "//bazel/private:current_protoc", + ), + }, + ) +-- +2.49.0 + diff --git a/examples/third_party/protobuf/0002-Switch-to-toolchains.patch b/examples/third_party/protobuf/0002-Switch-to-toolchains.patch new file mode 100644 index 0000000..8193b8f --- /dev/null +++ b/examples/third_party/protobuf/0002-Switch-to-toolchains.patch @@ -0,0 +1,123 @@ +From d2e4671e04bd72211d15183f891707c4ff2f11cd Mon Sep 17 00:00:00 2001 +From: Fabian Meumertzheim +Date: Mon, 16 Dec 2024 22:20:13 +0100 +Subject: [PATCH 2/2] Switch to toolchains + +--- + bazel/private/BUILD | 6 ------ + protobuf.bzl | 41 ++++++++++++++++++++++++++++++----------- + 2 files changed, 30 insertions(+), 17 deletions(-) + +diff --git a/bazel/private/BUILD b/bazel/private/BUILD +index a5b3abeda..8c1c94ac8 100644 +--- a/bazel/private/BUILD ++++ b/bazel/private/BUILD +@@ -1,5 +1,4 @@ + load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +-load(":current_protoc.bzl", "current_protoc") + load(":native_bool_flag.bzl", "native_bool_flag") + + package(default_applicable_licenses = ["//:license"]) +@@ -29,11 +28,6 @@ toolchain_type( + visibility = ["//visibility:public"], + ) + +-current_protoc( +- name = "current_protoc", +- visibility = ["//:__subpackages__"], +-) +- + bzl_library( + name = "upb_proto_library_internal_bzl", + srcs = [ +diff --git a/protobuf.bzl b/protobuf.bzl +index 736cc19cf..acb190942 100644 +--- a/protobuf.bzl ++++ b/protobuf.bzl +@@ -1,8 +1,9 @@ + load("@bazel_skylib//lib:versions.bzl", "versions") + load("@rules_cc//cc:defs.bzl", "objc_library") + load("@rules_python//python:defs.bzl", "py_library") ++load("//bazel/common:proto_common.bzl", "proto_common") + load("//bazel/common:proto_info.bzl", "ProtoInfo") +-load("//bazel/private:current_protoc.bzl", "ProtocFilesToRun") ++load("//bazel/private:toolchain_helpers.bzl", "toolchains") + + def _GetPath(ctx, path): + if ctx.label.workspace_root: +@@ -72,6 +73,26 @@ def _CsharpOuts(srcs): + for src in srcs + ] + ++_PROTOC_ATTRS = toolchains.if_legacy_toolchain({ ++ "_proto_compiler": attr.label( ++ cfg = "exec", ++ executable = True, ++ allow_files = True, ++ default = configuration_field("proto", "proto_compiler"), ++ ), ++}) ++_PROTOC_FRAGMENTS = ["proto"] ++_PROTOC_TOOLCHAINS = toolchains.use_toolchain(toolchains.PROTO_TOOLCHAIN) ++ ++def _protoc_files_to_run(ctx): ++ if proto_common.INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION: ++ toolchain = ctx.toolchains[toolchains.PROTO_TOOLCHAIN] ++ if not toolchain: ++ fail("Protocol compiler toolchain could not be resolved.") ++ return toolchain.proto.proto_compiler ++ else: ++ return ctx.attr._proto_compiler[DefaultInfo].files_to_run ++ + ProtoGenInfo = provider( + fields = ["srcs", "import_flags", "deps"], + ) +@@ -311,7 +332,7 @@ def _internal_gen_well_known_protos_java_impl(ctx): + args.add_all([src.path[offset:] for src in dep.direct_sources]) + + ctx.actions.run( +- executable = ctx.attr._protoc[ProtocFilesToRun].files_to_run, ++ executable = _protoc_files_to_run(ctx), + inputs = descriptors, + outputs = [srcjar], + arguments = [args], +@@ -335,10 +356,9 @@ internal_gen_well_known_protos_java = rule( + "javalite": attr.bool( + default = False, + ), +- "_protoc": attr.label( +- default = "//bazel/private:current_protoc", +- ), +- }, ++ } | _PROTOC_ATTRS, ++ fragments = _PROTOC_FRAGMENTS, ++ toolchains = _PROTOC_TOOLCHAINS, + ) + + def _internal_gen_kt_protos(ctx): +@@ -372,7 +392,7 @@ def _internal_gen_kt_protos(ctx): + args.add_all([src.path[offset:] for src in dep.direct_sources]) + + ctx.actions.run( +- executable = ctx.attr._protoc[ProtocFilesToRun].files_to_run, ++ executable = _protoc_files_to_run(ctx), + inputs = descriptors, + outputs = [srcjar], + arguments = [args], +@@ -396,10 +416,9 @@ internal_gen_kt_protos = rule( + "lite": attr.bool( + default = False, + ), +- "_protoc": attr.label( +- default = "//bazel/private:current_protoc", +- ), +- }, ++ } | _PROTOC_ATTRS, ++ fragments = _PROTOC_FRAGMENTS, ++ toolchains = _PROTOC_TOOLCHAINS, + ) + + def internal_objc_proto_library( +-- +2.49.0 +