Skip to content

Commit baf584f

Browse files
committed
Update ScalaPB wrapper for Scala > 2.11, add notes
Tested by setting the `protobuf` dependencies to a versions I know will break `ScalaPB` 0.11.17: - `abseil-cpp`: 20220623.1 => 20240722.0 - `protobuf`: v21.7 => v26.1 Then running the following (since Bazel 6.5.0 can't build `abseil-cpp` 20240722.0 without setting C++14 compiler flags), showing that it will crash instead of hang. Stashing the temporary changes produced a working build. ```txt $ USE_BAZEL_VERSION=7.4.1 bazel build //third_party/test/proto:scala [ ...snip... ] ERROR: third_party/test/proto/BUILD.bazel:4:14: ProtoScalaPBRule third_party/test/proto/proto_jvm_extra_protobuf_generator_scalapb.srcjar failed: (Exit 1): scalapb_worker failed: error executing ProtoScalaPBRule command (from target //third_party/test/proto:proto) bazel-out/darwin_arm64-opt-exec-ST-a828a81199fe/bin/src/scala/scripts/scalapb_worker ... (remaining 2 arguments skipped) --jvm_extra_protobuf_generator_out: java.lang.VerifyError: Cannot inherit from final class at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1022) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) at java.base/jdk.internal.loader.BuiltinClassLoader$4.run(BuiltinClassLoader.java:711) at java.base/jdk.internal.loader.BuiltinClassLoader$4.run(BuiltinClassLoader.java:706) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527) at scalapb.options.Scalapb.<clinit>(Scalapb.java:24835) at scalapb.options.compiler.Scalapb$.registerAllExtensions(Scalapb.scala:8) at scalarules.test.extra_protobuf_generator.ExtraProtobufGenerator$.run(ExtraProtobufGenerator.scala:52) at protocbridge.frontend.PluginFrontend$.runWithBytes(PluginFrontend.scala:48) at protocbridge.frontend.PluginFrontend$.runWithInputStream(PluginFrontend.scala:113) at protocbridge.frontend.SocketBasedPluginFrontend.$anonfun$prepare$2(SocketBasedPluginFrontend.scala:31) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) at scala.concurrent.impl.ExecutionContextImpl$DefaultThreadFactory$$anon$1$$anon$2.block(ExecutionContextImpl.scala:75) at java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3118) at scala.concurrent.impl.ExecutionContextImpl$DefaultThreadFactory$$anon$1.blockOn(ExecutionContextImpl.scala:87) at scala.concurrent.package$.blocking(package.scala:146) at protocbridge.frontend.SocketBasedPluginFrontend.$anonfun$prepare$1(SocketBasedPluginFrontend.scala:23) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:659) at scala.util.Success.$anonfun$map$1(Try.scala:255) at scala.util.Success.map(Try.scala:213) at scala.concurrent.Future.$anonfun$map$1(Future.scala:292) at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:42) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:74) at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) java.lang.RuntimeException: Exit with code 1 at scala.sys.package$.error(package.scala:30) at scripts.ScalaPBWorker$.work(ScalaPBWorker.scala:44) at io.bazel.rulesscala.worker.Worker.persistentWorkerMain(Worker.java:96) at io.bazel.rulesscala.worker.Worker.workerMain(Worker.java:49) at scripts.ScalaPBWorker$.main(ScalaPBWorker.scala:39) at scripts.ScalaPBWorker.main(ScalaPBWorker.scala) Target //third_party/test/proto:scala failed to build ERROR: third_party/test/proto/BUILD.bazel:4:14 scala @//third_party/test/proto:proto failed: (Exit 1): scalapb_worker failed: error executing ProtoScalaPBRule command (from target //third_party/test/proto:proto) bazel-out/darwin_arm64-opt-exec-ST-a828a81199fe/bin/src/scala/scripts/scalapb_worker ... (remaining 2 arguments skipped) ```
1 parent d1c6f86 commit baf584f

File tree

4 files changed

+22
-13
lines changed

4 files changed

+22
-13
lines changed

scala_proto/scala_proto_toolchain.bzl

+7
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ scala_proto_toolchain = rule(
8080
default = Label("//src/scala/scripts:scalapb_worker"),
8181
allow_files = True,
8282
),
83+
# `scripts.ScalaPbCodeGenerator` and `_main_generator_dep` are currently
84+
# necessary to support protoc-bridge < 0.9.8, specifically 0.7.14
85+
# required by Scala 2.11. See #1647 and scalapb/ScalaPB#1771.
86+
#
87+
# If we drop 2.11 support, restore `scalapb.ScalaPbCodeGenerator` here,
88+
# remove `_main_generator_dep`, and delete
89+
# `//src/scala/scripts:scalapb_codegenerator_wrapper` and its files.
8390
"main_generator": attr.string(
8491
default = "scripts.ScalaPbCodeGenerator",
8592
),

src/scala/scripts/BUILD

+7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ scala_binary(
2323
],
2424
)
2525

26+
# Used by `scala_proto_toolchain()` to support protoc-bridge < 0.9.8,
27+
# specifically 0.7.14 required by Scala 2.11. See #1647 and
28+
# scalapb/ScalaPB#1771.
29+
#
30+
# If we drop 2.11 support, delete this target and its files, and update
31+
# `scala_proto_toolchain()` (in `scala_proto/scala_proto_toolchain.bzl`) to use
32+
# `scalapb.ScalaPbCodeGenerator` as its `main_generator`.
2633
scala_library(
2734
name = "scalapb_codegenerator_wrapper",
2835
srcs = select_for_scala_version(

src/scala/scripts/ScalaPbCodeGeneratorWrapper.scala

+2-11
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,6 @@ package scripts
33
import protocgen.{CodeGenApp,CodeGenRequest,CodeGenResponse}
44

55
object ScalaPbCodeGenerator extends CodeGenApp {
6-
def process(request: CodeGenRequest): CodeGenResponse = {
7-
try {
8-
scalapb.ScalaPbCodeGenerator.process(request)
9-
10-
} catch {
11-
case e: Throwable =>
12-
val stackStream = new java.io.ByteArrayOutputStream
13-
e.printStackTrace(new java.io.PrintStream(stackStream))
14-
CodeGenResponse.fail(stackStream.toString())
15-
}
16-
}
6+
def process(request: CodeGenRequest): CodeGenResponse =
7+
scalapb.ScalaPbCodeGenerator.process(request)
178
}

test/src/main/scala/scalarules/test/extra_protobuf_generator/ExtraProtobufGenerator.scala

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ class CustomProtobufGenerator(
4343

4444
}
4545

46-
4746
object ExtraProtobufGenerator extends ProtocCodeGenerator {
4847
override def run(req: Array[Byte]): Array[Byte] = {
4948
val b = CodeGeneratorResponse.newBuilder
@@ -58,7 +57,12 @@ object ExtraProtobufGenerator extends ProtocCodeGenerator {
5857
case e: Throwable =>
5958
// Yes, we want to catch _all_ errors and send them back to the
6059
// requestor. Otherwise uncaught errors will cause the generator to
61-
// die and the worker invoking it to hang.
60+
// die and the worker invoking it to hang under protoc-bridge < 0.9.8.
61+
// See #1647 and scalapb/ScalaPB#1771.
62+
//
63+
// Scala 2.11 is stuck at protoc-bridge 0.7.14. If/when we drop
64+
// Scala 2.11 support, we can remove this `catch` block (and elide the
65+
// `ProtobufAdapter` implementation and delete its files).
6266
val stackStream = new java.io.ByteArrayOutputStream
6367
e.printStackTrace(new java.io.PrintStream(stackStream))
6468
b.setError(stackStream.toString())

0 commit comments

Comments
 (0)