mirror of
https://github.com/enso-org/enso.git
synced 2024-12-26 07:15:10 +03:00
9daca288f4
Add checks of Java and GraalVM versions before the `sbt` project is fully loaded. This ensures that all the devs have exactly the version specified in our `build.sbt`. # Important Notes Trying to start `sbt` with a different java versions now results in: ``` $ java -version openjdk version "21" 2023-09-19 OpenJDK Runtime Environment GraalVM CE 21+35.1 (build 21+35-jvmci-23.1-b15) OpenJDK 64-Bit Server VM GraalVM CE 21+35.1 (build 21+35-jvmci-23.1-b15, mixed mode, sharing) $ sbt [info] welcome to sbt 1.9.7 (GraalVM Community Java 21) [info] loading settings for project enso-build from plugins.sbt ... [info] loading project definition from /home/pavel/dev/enso/project [info] loading settings for project enso from build.sbt ... [info] resolving key references (65272 settings) ... [info] set current project to enso (in build file:/home/pavel/dev/enso/) [error] Running on GraalVM version 21. Expected GraalVM version 21.0.2. [error] Total time: 0 s, completed Feb 20, 2024, 1:06:18 PM [warn] Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? (default: r) ``` ``` $ java -version openjdk version "17.0.10" 2024-01-16 OpenJDK Runtime Environment JBR-17.0.10+1-1087.17-jcef (build 17.0.10+1-b1087.17) OpenJDK 64-Bit Server VM JBR-17.0.10+1-1087.17-jcef (build 17.0.10+1-b1087.17, mixed mode) $ sbt [info] welcome to sbt 1.9.7 (JetBrains s.r.o. Java 17.0.10) [info] loading settings for project enso-build from plugins.sbt ... [info] loading project definition from /home/pavel/dev/enso/project [info] compiling 44 Scala sources to /home/pavel/dev/enso/project/target/scala-2.12/sbt-1.0/classes ... [info] loading settings for project enso from build.sbt ... [info] resolving key references (65272 settings) ... [info] set current project to enso (in build file:/home/pavel/dev/enso/) [warn] Running on non-GraalVM JVM (The actual java.vendor is JetBrains s.r.o.). Expected GraalVM Community java.vendor. [error] Running on Java version 17. Expected Java version 21. [error] Total time: 0 s, completed Feb 20, 2024, 1:07:40 PM [warn] Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? (default: r) ```
172 lines
6.2 KiB
Scala
172 lines
6.2 KiB
Scala
import sbt.Keys.*
|
|
import sbt.*
|
|
import sbt.internal.util.ManagedLogger
|
|
import sbt.io.IO
|
|
import sbt.librarymanagement.{ConfigurationFilter, DependencyFilter}
|
|
|
|
import scala.collection.immutable.Seq
|
|
|
|
/** A collection of utility methods for everything related to the GraalVM and Truffle.
|
|
*/
|
|
object GraalVM {
|
|
// Keep in sync with graalMavenPackagesVersion in build.sbt
|
|
val version: String = "23.1.2"
|
|
|
|
/** The list of modules that are included in the `component` directory in engine distribution.
|
|
* When invoking the `java` command, these modules need to be put on the module-path.
|
|
*/
|
|
val modules: Seq[ModuleID] = Seq(
|
|
"org.graalvm.sdk" % "nativeimage" % version,
|
|
"org.graalvm.sdk" % "word" % version,
|
|
"org.graalvm.sdk" % "jniutils" % version,
|
|
"org.graalvm.sdk" % "collections" % version,
|
|
"org.graalvm.polyglot" % "polyglot" % version,
|
|
"org.graalvm.truffle" % "truffle-api" % version,
|
|
"org.graalvm.truffle" % "truffle-runtime" % version,
|
|
"org.graalvm.truffle" % "truffle-compiler" % version
|
|
)
|
|
|
|
val sdkPkgs = Seq(
|
|
"org.graalvm.sdk" % "polyglot-tck" % version,
|
|
"org.graalvm.sdk" % "nativeimage" % version,
|
|
"org.graalvm.sdk" % "word" % version,
|
|
"org.graalvm.sdk" % "jniutils" % version,
|
|
"org.graalvm.sdk" % "collections" % version
|
|
)
|
|
|
|
val polyglotPkgs = Seq(
|
|
"org.graalvm.polyglot" % "polyglot" % version
|
|
)
|
|
|
|
val trufflePkgs = Seq(
|
|
"org.graalvm.truffle" % "truffle-api" % version,
|
|
"org.graalvm.truffle" % "truffle-runtime" % version,
|
|
"org.graalvm.truffle" % "truffle-compiler" % version,
|
|
"org.graalvm.truffle" % "truffle-dsl-processor" % version
|
|
)
|
|
|
|
/** Manually maintained GraalVM languages and their dependencies. Optimally,
|
|
* we would use 'org.graalvm.polyglot:js-community' or 'org.graavm.polyglot:python-community'
|
|
* maven artifacts and all their transitive dependencies, but we have to copy all these artifacts
|
|
* into engine distribution build, so we have to maintain these manually.
|
|
*/
|
|
|
|
val pythonPkgs = Seq(
|
|
"org.graalvm.python" % "python-language" % version,
|
|
"org.graalvm.python" % "python-resources" % version,
|
|
"org.bouncycastle" % "bcutil-jdk18on" % "1.76",
|
|
"org.bouncycastle" % "bcpkix-jdk18on" % "1.76",
|
|
"org.bouncycastle" % "bcprov-jdk18on" % "1.76",
|
|
"org.graalvm.llvm" % "llvm-api" % version,
|
|
"org.graalvm.truffle" % "truffle-nfi" % version,
|
|
"org.graalvm.truffle" % "truffle-nfi-libffi" % version,
|
|
"org.graalvm.regex" % "regex" % version,
|
|
"org.graalvm.tools" % "profiler-tool" % version,
|
|
"org.graalvm.shadowed" % "json" % version,
|
|
"org.graalvm.shadowed" % "icu4j" % version,
|
|
"org.tukaani" % "xz" % "1.9"
|
|
)
|
|
|
|
val jsPkgs = Seq(
|
|
"org.graalvm.js" % "js-language" % version,
|
|
"org.graalvm.regex" % "regex" % version,
|
|
"org.graalvm.shadowed" % "icu4j" % version
|
|
)
|
|
|
|
val chromeInspectorPkgs = Seq(
|
|
"org.graalvm.tools" % "chromeinspector-tool" % version,
|
|
"org.graalvm.shadowed" % "json" % version,
|
|
"org.graalvm.tools" % "profiler-tool" % version
|
|
)
|
|
|
|
val debugAdapterProtocolPkgs = Seq(
|
|
"org.graalvm.tools" % "dap-tool" % version
|
|
)
|
|
|
|
val insightPkgs = Seq(
|
|
"org.graalvm.tools" % "insight-tool" % version
|
|
)
|
|
|
|
val espressoPkgs = if ("espresso".equals(System.getenv("ENSO_JAVA"))) {
|
|
Seq(
|
|
"org.graalvm.espresso" % "espresso-language" % version,
|
|
"org.graalvm.espresso" % "espresso-libs-resources-linux-amd64" % version,
|
|
"org.graalvm.espresso" % "espresso-runtime-resources-linux-amd64" % version
|
|
)
|
|
} else {
|
|
Seq()
|
|
}
|
|
|
|
val toolsPkgs = chromeInspectorPkgs ++ debugAdapterProtocolPkgs ++ insightPkgs
|
|
|
|
val langsPkgs = jsPkgs ++ pythonPkgs ++ espressoPkgs
|
|
|
|
/** Augments a state transition to do GraalVM version check.
|
|
*
|
|
* @param graalVersion the GraalVM version that should be used for
|
|
* building this project
|
|
* @param graalPackagesVersion Version of Truffle and GraalVM packages that
|
|
* will be downloaded from Maven
|
|
* @param javaVersion Version of the Java source code
|
|
* @return an augmented state transition that does all the state changes of
|
|
* oldTransition but also runs the version checks
|
|
*/
|
|
def versionCheck(
|
|
graalVersion: String,
|
|
graalPackagesVersion: String,
|
|
javaVersion: String,
|
|
log: ManagedLogger
|
|
): Unit = {
|
|
if (graalPackagesVersion != version) {
|
|
log.error(
|
|
s"Expected GraalVM packages version $version, but got $graalPackagesVersion. " +
|
|
s"Version specified in build.sbt and GraalVM.scala must be in sync"
|
|
)
|
|
throw new IllegalStateException("GraalVM version check failed")
|
|
}
|
|
val javaVendor = System.getProperty("java.vendor")
|
|
if (javaVendor != "GraalVM Community") {
|
|
log.warn(
|
|
s"Running on non-GraalVM JVM (The actual java.vendor is $javaVendor). " +
|
|
s"Expected GraalVM Community java.vendor."
|
|
)
|
|
}
|
|
|
|
val javaSpecVersion = System.getProperty("java.specification.version")
|
|
if (javaSpecVersion != javaVersion) {
|
|
log.error(
|
|
s"Running on Java version $javaSpecVersion. " +
|
|
s"Expected Java version $javaVersion."
|
|
)
|
|
throw new IllegalStateException("java.specification.vendor check failed")
|
|
}
|
|
|
|
val vmVersion = System.getProperty("java.vm.version")
|
|
tryParseJavaVMVersion(vmVersion) match {
|
|
case Some(version) =>
|
|
if (version != graalVersion) {
|
|
log.error(
|
|
s"Running on GraalVM version $version. " +
|
|
s"Expected GraalVM version $graalVersion."
|
|
)
|
|
throw new IllegalStateException("java.vm.version check failed")
|
|
}
|
|
case None =>
|
|
log.error(
|
|
s"Could not parse GraalVM version from java.vm.version: $vmVersion."
|
|
)
|
|
throw new IllegalStateException("java.vm.version check failed")
|
|
}
|
|
}
|
|
|
|
private def tryParseJavaVMVersion(
|
|
version: String
|
|
): Option[String] = {
|
|
if (version.contains('+')) {
|
|
Some(version.split('+')(0))
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
}
|