Discovery of java homes

This commit is contained in:
Martynas Mickevičius 2018-04-18 16:28:43 +01:00 committed by Eugene Yokota
parent 7f808bd3a1
commit c31583e4f8
7 changed files with 110 additions and 0 deletions

View File

@ -0,0 +1,40 @@
/**
* This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]].
*/
// DO NOT EDIT MANUALLY
package sbt
final class JavaVersion private (
val vendor: Option[String],
val version: String) extends Serializable {
override def equals(o: Any): Boolean = o match {
case x: JavaVersion => (this.vendor == x.vendor) && (this.version == x.version)
case _ => false
}
override def hashCode: Int = {
37 * (37 * (37 * (17 + "sbt.JavaVersion".##) + vendor.##) + version.##)
}
override def toString: String = {
"JavaVersion(" + vendor + ", " + version + ")"
}
private[this] def copy(vendor: Option[String] = vendor, version: String = version): JavaVersion = {
new JavaVersion(vendor, version)
}
def withVendor(vendor: Option[String]): JavaVersion = {
copy(vendor = vendor)
}
def withVendor(vendor: String): JavaVersion = {
copy(vendor = Option(vendor))
}
def withVersion(version: String): JavaVersion = {
copy(version = version)
}
}
object JavaVersion {
def apply(version: String): JavaVersion = new JavaVersion(None, version)
def apply(vendor: Option[String], version: String): JavaVersion = new JavaVersion(vendor, version)
def apply(vendor: String, version: String): JavaVersion = new JavaVersion(Option(vendor), version)
}

View File

@ -17,3 +17,9 @@ enum PluginTrigger {
AllRequirements
NoTrigger
}
type JavaVersion {
vendor: String
version: String!
#xcompanion def apply(version: String): JavaVersion = new JavaVersion(None, version)
}

View File

@ -69,6 +69,7 @@ import sbt.librarymanagement.syntax._
import sbt.util.InterfaceUtil.{ toJavaFunction => f1 }
import sbt.util._
import sbt.util.CacheImplicits._
import scala.collection.immutable.ListMap
import scala.concurrent.duration.FiniteDuration
import scala.util.control.NonFatal
import scala.xml.NodeSeq
@ -159,6 +160,9 @@ object Defaults extends BuildCommon {
scalaHome :== None,
apiURL := None,
javaHome :== None,
discoveredJavaHomes := sbt.internal.CrossJava.discoverJavaHomes,
javaHomes :== ListMap.empty,
fullJavaHomes := discoveredJavaHomes.value ++ javaHomes.value,
testForkedParallel :== false,
javaOptions :== Nil,
sbtPlugin :== false,

View File

@ -271,6 +271,10 @@ 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 = taskKey[Map[JavaVersion, 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)

View File

@ -0,0 +1,50 @@
/*
* sbt
* Copyright 2011 - 2017, Lightbend, Inc.
* Copyright 2008 - 2010, Mark Harrah
* Licensed under BSD-3-Clause license (see LICENSE)
*/
package sbt
package internal
import java.io.File
import scala.collection.immutable.ListMap
import sbt.io.IO
import sbt.io.syntax._
private[sbt] object CrossJava {
def discoverJavaHomes: ListMap[JavaVersion, File] = {
val configs = Vector(JavaDiscoverConfig.linux, JavaDiscoverConfig.macOS)
ListMap(configs flatMap { _.javaHomes }: _*)
}
sealed trait JavaDiscoverConf {
def javaHomes: Vector[(JavaVersion, 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)] =
wrapNull(base.list()).collect {
case dir @ JavaHomeDir(ver) => JavaVersion(ver) -> (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)] =
wrapNull(base.list()).collect {
case dir @ JavaHomeDir(m, n) =>
JavaVersion(n) -> (base / dir / "Contents" / "Home")
}
}
}
def wrapNull(a: Array[String]): Vector[String] =
if (a eq null) Vector()
else a.toVector
}

View File

@ -0,0 +1,5 @@
Global / javaHomes += JavaVersion("6") -> file("/good/old/times/java-6")
TaskKey[Unit]("check") := {
assert(fullJavaHomes.value(JavaVersion("6")).getAbsolutePath.contains("java-6"))
}

View File

@ -0,0 +1 @@
> check