Skip to content

Commit 1813d62

Browse files
authored
Merge pull request #3929 from Gedochao/maintenance/drop-legacy-scala3-bytecode-processing
Drop `scala3-runtime`, `scala3-graal` & `scala3-graal-processor` & deprecate pre-Scala-3.3 native images
2 parents a444d7a + 090d34a commit 1813d62

File tree

10 files changed

+45
-403
lines changed

10 files changed

+45
-403
lines changed

build.mill.scala

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import mill._
3939
import mill.api.Loose
4040
import scalalib.{publish => _, _}
4141
import mill.contrib.bloop.Bloop
42+
import mill.define.Task.Simple
4243
import mill.testrunner.TestResult
4344

4445
import _root_.scala.util.{Properties, Using}
@@ -109,15 +110,6 @@ object `test-runner` extends Cross[TestRunner](Scala.runnerScalaVersions)
109110
with CrossScalaDefaultToRunner
110111
object `tasty-lib` extends Cross[TastyLib](Scala.scala3MainVersions)
111112
with CrossScalaDefaultToInternal
112-
// Runtime classes used within native image on Scala 3 replacing runtime from Scala
113-
object `scala3-runtime` extends Cross[Scala3Runtime](Scala.scala3MainVersions)
114-
with CrossScalaDefaultToInternal
115-
// Logic to process classes that is shared between build and the scala-cli itself
116-
object `scala3-graal` extends Cross[Scala3Graal](Scala.scala3MainVersions)
117-
with CrossScalaDefaultToInternal
118-
// Main app used to process classpath within build itself
119-
object `scala3-graal-processor` extends Cross[Scala3GraalProcessor](Scala.scala3MainVersions)
120-
with CrossScalaDefaultToInternal
121113

122114
object `scala-cli-bsp` extends JavaModule with ScalaCliPublishModule {
123115
override def ivyDeps: T[Agg[Dep]] = super.ivyDeps() ++ Seq(
@@ -685,38 +677,6 @@ trait Options extends ScalaCliCrossSbtModule with ScalaCliPublishModule with Has
685677
}
686678
}
687679

688-
trait Scala3Runtime extends CrossSbtModule with ScalaCliPublishModule {
689-
override def crossScalaVersion: String = crossValue
690-
override def ivyDeps: T[Agg[Dep]] = super.ivyDeps()
691-
}
692-
693-
trait Scala3Graal extends ScalaCliCrossSbtModule
694-
with ScalaCliPublishModule with ScalaCliScalafixModule {
695-
override def crossScalaVersion: String = crossValue
696-
override def ivyDeps: T[Agg[Dep]] = super.ivyDeps() ++ Agg(
697-
Deps.asm,
698-
Deps.osLib
699-
)
700-
701-
override def resources: T[Seq[PathRef]] = Task.Sources {
702-
val extraResourceDir = Task.dest / "extra"
703-
// scala3RuntimeFixes.jar is also used within
704-
// resource-config.json and BytecodeProcessor.scala
705-
os.copy.over(
706-
`scala3-runtime`(crossScalaVersion).jar().path,
707-
extraResourceDir / "scala3RuntimeFixes.jar",
708-
createFolders = true
709-
)
710-
super.resources() ++ Seq(mill.PathRef(extraResourceDir))
711-
}
712-
}
713-
714-
trait Scala3GraalProcessor extends CrossScalaModule with ScalaCliPublishModule {
715-
override def moduleDeps: Seq[SonatypeCentralPublishModule] =
716-
Seq(`scala3-graal`(crossScalaVersion))
717-
override def finalMainClass: T[String] = "scala.cli.graal.CoursierCacheProcessor"
718-
}
719-
720680
trait Build extends ScalaCliCrossSbtModule
721681
with ScalaCliPublishModule
722682
with HasTests
@@ -926,7 +886,6 @@ trait Cli extends CrossSbtModule with ProtoBuildModule with CliLaunchers
926886
def moduleDeps: Seq[SonatypeCentralPublishModule] = Seq(
927887
`build-module`(crossScalaVersion),
928888
config(crossScalaVersion),
929-
`scala3-graal`(crossScalaVersion),
930889
`specification-level`(crossScalaVersion)
931890
)
932891

@@ -948,21 +907,31 @@ trait Cli extends CrossSbtModule with ProtoBuildModule with CliLaunchers
948907
Deps.signingCli.exclude((organization, "config_2.13")),
949908
Deps.slf4jNop, // to silence jgit
950909
Deps.sttp,
951-
Deps.scalafixInterfaces
910+
Deps.scalafixInterfaces,
911+
Deps.scala3Graal, // TODO: drop this if we ever bump internal JDK to 24+
912+
Deps.scala3GraalProcessor // TODO: drop this if we ever bump internal JDK to 24+
952913
)
953914
override def compileIvyDeps: T[Agg[Dep]] = super.compileIvyDeps() ++ Agg(
954915
Deps.jsoniterMacros,
955916
Deps.svm
956917
)
957918
override def mainClass: T[Option[String]] = Some("scala.cli.ScalaCli")
958919

920+
private def scala3GraalProcessorClassPath: T[Agg[PathRef]] = T {
921+
resolveDeps(T {
922+
val bind = bindDependency()
923+
Agg(Deps.scala3GraalProcessor).map(bind)
924+
})()
925+
}
926+
959927
override def nativeImageClassPath: T[Seq[PathRef]] = Task {
960928
val classpath = super.nativeImageClassPath().map(_.path).mkString(File.pathSeparator)
961929
val cache = Task.dest / "native-cp"
962-
// `scala3-graal-processor`.run() do not give me output and I cannot pass dynamically computed values like classpath
930+
// `scala3-graal-processor`.run() does not give me output and I cannot pass dynamically computed values like classpath
931+
// TODO: drop this if we ever bump internal JDK to 24+
963932
val res = mill.util.Jvm.callProcess(
964-
mainClass = `scala3-graal-processor`(crossScalaVersion).finalMainClass(),
965-
classPath = `scala3-graal-processor`(crossScalaVersion).runClasspath().map(_.path),
933+
mainClass = "scala.cli.graal.CoursierCacheProcessor",
934+
classPath = scala3GraalProcessorClassPath().map(_.path).toList,
966935
mainArgs = Seq(cache.toNIO.toString, classpath)
967936
)
968937
val cp = res.out.trim()

modules/cli/src/main/scala/scala/cli/packaging/NativeImage.scala

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import java.io.File
44

55
import scala.annotation.tailrec
66
import scala.build.internal.{ManifestJar, Runner}
7+
import scala.build.internals.ConsoleUtils.ScalaCliConsole.warnPrefix
78
import scala.build.internals.EnvVar
8-
import scala.build.{Build, Logger, Positioned}
9+
import scala.build.{Build, Logger, Positioned, coursierVersion}
910
import scala.cli.errors.GraalVMNativeImageError
1011
import scala.cli.graal.{BytecodeProcessor, TempCache}
1112
import scala.cli.internal.CachedBinary
@@ -206,7 +207,15 @@ object NativeImage {
206207
// seems native-image doesn't correctly parse paths in manifests - this is especially a problem on Windows
207208
wrongSimplePathsInManifest = true
208209
) { processedClassPath =>
209-
val needsProcessing = builds.head.scalaParams.exists(_.scalaVersion.startsWith("3."))
210+
val needsProcessing =
211+
builds.head.scalaParams.map(_.scalaVersion.coursierVersion)
212+
.exists(sv => (sv >= "3.0.0".coursierVersion) && (sv < "3.3.0".coursierVersion))
213+
if needsProcessing then
214+
logger.message(
215+
s"""$warnPrefix building native images with Scala 3 older than 3.3.0 is deprecated.
216+
|$warnPrefix support will be dropped in a future Scala CLI version.
217+
|$warnPrefix it is advised to upgrade to a more recent Scala version.""".stripMargin
218+
)
210219
val (classPath, toClean, scala3extraOptions) =
211220
if needsProcessing then {
212221
val cpString = processedClassPath.mkString(File.pathSeparator)

modules/integration/src/test/scala/scala/cli/integration/TestNativeImageOnScala3.scala

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,21 @@ class TestNativeImageOnScala3 extends ScalaCliSuite {
4040
}
4141
}
4242

43-
test("lazy vals") {
44-
runTest("1")("2") {
45-
"""//> using scala 3.1.1
46-
|class A(a: String) { lazy val b = a.toInt + 1 }
47-
|@main def add1(i: String) = println(A(i).b)
48-
|""".stripMargin
49-
}
43+
for {
44+
scalaVersion <- TestUtil.legacyScalaVersionsOnePerMinor.sorted ++ Seq(
45+
Constants.scala3Lts,
46+
Constants.scala3Next,
47+
Constants.scala3NextRc
48+
)
5049
}
50+
test(s"lazy vals ($scalaVersion)") {
51+
runTest("1")("2") {
52+
s"""//> using scala $scalaVersion
53+
|class A(a: String) { lazy val b = a.toInt + 1 }
54+
|@main def add1(i: String) = println(A(i).b)
55+
|""".stripMargin
56+
}
57+
}
5158

5259
test("lazy vals and enums with default scala version") {
5360
runTest("1")("2", "A") {

modules/scala3-graal-processor/src/scala/cli/graal/CoursierCacheProcessor.scala

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)