From 9b7c224f93ef9ca2a81d43cdd1a406f15531376b Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 30 May 2018 00:59:12 -0400 Subject: [PATCH] use stringly-typed key so we can define it machine-wide --- main/src/main/scala/sbt/Keys.scala | 8 ++-- .../main/scala/sbt/internal/CrossJava.scala | 44 ++++++++++++------- sbt/src/sbt-test/java/cross/build.sbt | 2 +- .../sbt-test/java/home-discovery/build.sbt | 4 +- .../sbt/scriptedtest/ScriptedTests.scala | 1 + 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index f9e57bc1a..bf8c9549f 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -222,7 +222,7 @@ object Keys { val scalaCompilerBridgeSource = settingKey[ModuleID]("Configures the module ID of the sources of the compiler bridge.").withRank(CSetting) val scalaArtifacts = settingKey[Seq[String]]("Configures the list of artifacts which should match the Scala binary version").withRank(CSetting) val enableBinaryCompileAnalysis = settingKey[Boolean]("Writes the analysis file in binary format") - val crossJavaVersions = settingKey[Seq[JavaVersion]]("The java versions used during JDK cross testing").withRank(BPlusSetting) + val crossJavaVersions = settingKey[Seq[String]]("The java versions used during JDK cross testing").withRank(BPlusSetting) val clean = taskKey[Unit]("Deletes files produced by the build, such as generated sources, compiled classes, and task caches.").withRank(APlusTask) val console = taskKey[Unit]("Starts the Scala interpreter with the project classes on the classpath.").withRank(APlusTask) @@ -272,9 +272,9 @@ object Keys { val outputStrategy = settingKey[Option[sbt.OutputStrategy]]("Selects how to log output when running a main class.").withRank(DSetting) val connectInput = settingKey[Boolean]("If true, connects standard input when running a main class forked.").withRank(CSetting) val javaHome = settingKey[Option[File]]("Selects the Java installation used for compiling and forking. If None, uses the Java installation running the build.").withRank(ASetting) - val discoveredJavaHomes = settingKey[Map[JavaVersion, File]]("Discovered Java home directories") - val javaHomes = settingKey[Map[JavaVersion, File]]("The user-defined additional Java home directories") - val fullJavaHomes = settingKey[Map[JavaVersion, File]]("Combines discoveredJavaHomes and custom javaHomes.").withRank(CTask) + val discoveredJavaHomes = settingKey[Map[String, File]]("Discovered Java home directories") + val javaHomes = settingKey[Map[String, File]]("The user-defined additional Java home directories") + val fullJavaHomes = settingKey[Map[String, File]]("Combines discoveredJavaHomes and custom javaHomes.").withRank(CTask) val javaOptions = taskKey[Seq[String]]("Options passed to a new JVM when forking.").withRank(BPlusTask) val envVars = taskKey[Map[String, String]]("Environment variables used when forking a new JVM").withRank(BTask) diff --git a/main/src/main/scala/sbt/internal/CrossJava.scala b/main/src/main/scala/sbt/internal/CrossJava.scala index 5836b2c17..9ee668042 100644 --- a/main/src/main/scala/sbt/internal/CrossJava.scala +++ b/main/src/main/scala/sbt/internal/CrossJava.scala @@ -44,6 +44,11 @@ private[sbt] object CrossJava { } } + def lookupJavaHome(jv: String, mappings: Map[String, File]): File = { + val ms = mappings map { case (k, v) => (JavaVersion(k), v) } + lookupJavaHome(JavaVersion(jv), ms) + } + def lookupJavaHome(jv: JavaVersion, mappings: Map[JavaVersion, File]): File = { mappings.get(jv) match { case Some(dir) => dir @@ -72,7 +77,7 @@ private[sbt] object CrossJava { def versionAndCommand(spacePresent: Boolean) = { val x = Project.extract(state) import x._ - val javaHomes = getJavaHomes(x, currentRef) + val javaHomes = getJavaHomesTyped(x, currentRef) val knownVersions = javaHomes.keysIterator.map(_.numberStr).toVector val version: Parser[SwitchTarget] = (token( @@ -105,15 +110,22 @@ private[sbt] object CrossJava { private def getJavaHomes( extracted: Extracted, proj: ResolvedReference - ): Map[JavaVersion, File] = { + ): Map[String, File] = { import extracted._ (Keys.fullJavaHomes in proj get structure.data).get } + private def getJavaHomesTyped( + extracted: Extracted, + proj: ResolvedReference + ): Map[JavaVersion, File] = { + getJavaHomes(extracted, proj) map { case (k, v) => (JavaVersion(k), v) } + } + private def getCrossJavaVersions( extracted: Extracted, proj: ResolvedReference - ): Seq[JavaVersion] = { + ): Seq[String] = { import extracted._ import Keys._ (crossJavaVersions in proj get structure.data).getOrElse(Nil) @@ -138,7 +150,7 @@ private[sbt] object CrossJava { // filter out subprojects based on switch target e.g. "10" vs what's in crossJavaVersions // for the subproject. Only if crossJavaVersions is non-empty, and does NOT include "10" // it will skip the subproject. - val projects: Seq[(ResolvedReference, Seq[JavaVersion])] = { + val projects: Seq[(ResolvedReference, Seq[String])] = { val projectJavaVersions = structure.allProjectRefs.map(proj => proj -> getCrossJavaVersions(extracted, proj)) if (switch.target.force) projectJavaVersions @@ -157,7 +169,7 @@ private[sbt] object CrossJava { def setJavaHomeForProjects: State = { val newSettings = projects.flatMap { case (proj, javaVersions) => - val fjh = getJavaHomes(extracted, proj) + val fjh = getJavaHomesTyped(extracted, proj) val home = switch.target match { case SwitchTarget(Some(v), _, _) => lookupJavaHome(v, fjh) case SwitchTarget(_, Some(h), _) => h @@ -286,33 +298,33 @@ private[sbt] object CrossJava { state.put(JavaCapturedSession, extracted.session.rawAppend) } - def discoverJavaHomes: ListMap[JavaVersion, File] = { + def discoverJavaHomes: ListMap[String, File] = { import JavaDiscoverConfig._ val configs = Vector(jabba, linux, macOS) ListMap(configs flatMap { _.javaHomes }: _*) } sealed trait JavaDiscoverConf { - def javaHomes: Vector[(JavaVersion, File)] + def javaHomes: Vector[(String, File)] } object JavaDiscoverConfig { val linux = new JavaDiscoverConf { val base: File = file("/usr") / "lib" / "jvm" val JavaHomeDir = """java-([0-9]+)-.*""".r - def javaHomes: Vector[(JavaVersion, File)] = + def javaHomes: Vector[(String, File)] = wrapNull(base.list()).collect { - case dir @ JavaHomeDir(ver) => JavaVersion(ver) -> (base / dir) + case dir @ JavaHomeDir(ver) => JavaVersion(ver).toString -> (base / dir) } } val macOS = new JavaDiscoverConf { val base: File = file("/Library") / "Java" / "JavaVirtualMachines" val JavaHomeDir = """jdk-?(1\.)?([0-9]+).*""".r - def javaHomes: Vector[(JavaVersion, File)] = + def javaHomes: Vector[(String, File)] = wrapNull(base.list()).collect { case dir @ JavaHomeDir(m, n) => - JavaVersion(nullBlank(m) + n) -> (base / dir / "Contents" / "Home") + JavaVersion(nullBlank(m) + n).toString -> (base / dir / "Contents" / "Home") } } @@ -320,10 +332,10 @@ private[sbt] object CrossJava { val jabba = new JavaDiscoverConf { val base: File = Path.userHome / ".jabba" / "jdk" val JavaHomeDir = """([\w\-]+)\@(1\.)?([0-9]+).*""".r - def javaHomes: Vector[(JavaVersion, File)] = + def javaHomes: Vector[(String, File)] = wrapNull(base.list()).collect { case dir @ JavaHomeDir(vendor, m, n) => - val v = JavaVersion(nullBlank(m) + n).withVendor(vendor) + val v = JavaVersion(nullBlank(m) + n).withVendor(vendor).toString if ((base / dir / "Contents" / "Home").exists) v -> (base / dir / "Contents" / "Home") else v -> (base / dir) } @@ -338,10 +350,12 @@ private[sbt] object CrossJava { private val oneDot = Map((1L to 20L).toVector flatMap { i => Vector(Vector(i) -> Vector(1L, i), Vector(1L, i) -> Vector(i)) }: _*) - def expandJavaHomes(hs: Map[JavaVersion, File]): Map[JavaVersion, File] = + def expandJavaHomes(hs: Map[String, File]): Map[String, File] = hs flatMap { case (k, v) => - if (oneDot.contains(k.numbers)) Vector(k -> v, k.withNumbers(oneDot(k.numbers)) -> v) + val jv = JavaVersion(k) + if (oneDot.contains(jv.numbers)) + Vector(k -> v, jv.withNumbers(oneDot(jv.numbers)).toString -> v) else Vector(k -> v) } diff --git a/sbt/src/sbt-test/java/cross/build.sbt b/sbt/src/sbt-test/java/cross/build.sbt index dad1dc347..c71bd179e 100644 --- a/sbt/src/sbt-test/java/cross/build.sbt +++ b/sbt/src/sbt-test/java/cross/build.sbt @@ -5,7 +5,7 @@ val check = inputKey[Unit]("Runs the check") lazy val root = (project in file(".")) .settings( ThisBuild / scalaVersion := "2.12.6", - crossJavaVersions := List(JavaVersion("1.8")), + crossJavaVersions := List("1.8"), // read out.txt and see if it starts with the passed in number check := { diff --git a/sbt/src/sbt-test/java/home-discovery/build.sbt b/sbt/src/sbt-test/java/home-discovery/build.sbt index 7dd72c1d1..7177ca692 100644 --- a/sbt/src/sbt-test/java/home-discovery/build.sbt +++ b/sbt/src/sbt-test/java/home-discovery/build.sbt @@ -1,5 +1,5 @@ -Global / javaHomes += JavaVersion("6") -> file("/good/old/times/java-6") +Global / javaHomes += "6" -> file("/good/old/times/java-6") TaskKey[Unit]("check") := { - assert(fullJavaHomes.value(JavaVersion("1.6")).getAbsolutePath.contains("java-6")) + assert(fullJavaHomes.value("1.6").getAbsolutePath.contains("java-6")) } diff --git a/scripted/sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala b/scripted/sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala index dabaeeca1..77e3b7467 100644 --- a/scripted/sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala +++ b/scripted/sbt/src/main/scala/sbt/scriptedtest/ScriptedTests.scala @@ -206,6 +206,7 @@ final class ScriptedTests( case "dependency-management/update-sbt-classifiers" => LauncherBased // tbd case "dependency-management/url" => LauncherBased // tbd case "java/argfile" => LauncherBased // sbt/Package$ + case "java/cross" => LauncherBased // sbt/Package$ case "java/basic" => LauncherBased // sbt/Package$ case "java/varargs-main" => LauncherBased // sbt/Package$ case "package/lazy-name" => LauncherBased // sbt/Package$