2019-10-03 05:02:40 +02:00
/*
2021-01-08 17:55:38 +01:00
* Copyright ( C ) 2009 - 2021 Lightbend Inc . < https : //www.lightbend.com>
2019-10-03 05:02:40 +02:00
*/
package akka
import java.io.File
import scala.annotation.tailrec
import scala.collection.immutable.ListMap
import sbt._
import sbt.librarymanagement.SemanticSelector
import sbt.librarymanagement.VersionNumber
object JdkOptions extends AutoPlugin {
object autoImport {
2019-11-08 15:59:49 +01:00
val jdk8home = settingKey [ String ] ( "JDK 8 home. Only needs to be set when it cannot be auto-detected by sbt" ) ;
2020-08-05 13:12:29 +01:00
val targetSystemJdk = settingKey [ Boolean ] (
"Target the system JDK instead of building against JDK 8. When this is enabled resulting artifacts may not work on JDK 8!" )
2019-10-03 05:02:40 +02:00
}
import autoImport._
val specificationVersion : String = sys . props ( "java.specification.version" )
val isJdk8 : Boolean =
VersionNumber ( specificationVersion ) . matchesSemVer ( SemanticSelector ( s" =1.8 " ) )
val isJdk11orHigher : Boolean =
VersionNumber ( specificationVersion ) . matchesSemVer ( SemanticSelector ( ">=11" ) )
def notOnJdk8 [ T ] ( values : Seq [ T ] ) : Seq [ T ] = if ( isJdk8 ) Seq . empty [ T ] else values
2020-08-05 13:12:29 +01:00
def targetJdkScalacOptions (
targetSystemJdk : Boolean ,
jdk8home : Option [ File ] ,
2021-10-25 08:18:22 +02:00
fullJavaHomes : Map [ String , File ] ,
scalaVersion : String ) : Seq [ String ] =
2019-10-03 05:02:40 +02:00
selectOptions (
targetSystemJdk ,
2019-11-08 15:59:49 +01:00
jdk8home ,
2019-10-03 05:02:40 +02:00
fullJavaHomes ,
2021-10-25 08:18:22 +02:00
Seq ( if ( scalaVersion . startsWith ( "3.0" ) ) "-Xtarget:8" else "-target:jvm-1.8" ) ,
2019-11-29 13:40:47 +01:00
// '-release 8' is not enough, for some reason we need the 8 rt.jar
// explicitly. To test whether this has the desired effect, compile
// akka-remote and check the invocation of 'ByteBuffer.clear()' in
// EnvelopeBuffer.class with 'javap -c': it should refer to
//""java/nio/ByteBuffer.clear:()Ljava/nio/Buffer" and not
// "java/nio/ByteBuffer.clear:()Ljava/nio/ByteBuffer". Issue #27079
2020-08-05 13:12:29 +01:00
( java8home : File ) => Seq ( "-release" , "8" , "-javabootclasspath" , java8home + "/jre/lib/rt.jar" ) )
def targetJdkJavacOptions (
targetSystemJdk : Boolean ,
jdk8home : Option [ File ] ,
fullJavaHomes : Map [ String , File ] ) : Seq [ String ] =
2019-10-03 05:02:40 +02:00
selectOptions (
targetSystemJdk ,
2019-11-08 15:59:49 +01:00
jdk8home ,
2019-10-03 05:02:40 +02:00
fullJavaHomes ,
Nil ,
// '-release 8' would be a neater option here, but is currently not an
// option because it doesn't provide access to `sun.misc.Unsafe` #27079
2020-08-05 13:12:29 +01:00
( java8home : File ) => Seq ( "-source" , "8" , "-target" , "8" , "-bootclasspath" , java8home + "/jre/lib/rt.jar" ) )
2019-10-03 05:02:40 +02:00
2020-08-05 13:12:29 +01:00
private def selectOptions (
targetSystemJdk : Boolean ,
jdk8home : Option [ File ] ,
fullJavaHomes : Map [ String , File ] ,
jdk8options : Seq [ String ] ,
jdk11options : File => Seq [ String ] ) : Seq [ String ] =
2019-10-03 05:02:40 +02:00
if ( targetSystemJdk )
Nil
else if ( isJdk8 )
jdk8options
2020-08-05 13:12:29 +01:00
else
jdk8home . orElse ( fullJavaHomes . get ( "8" ) ) match {
case Some ( java8home ) =>
jdk11options ( java8home )
case None =>
throw new MessageOnlyException (
"A JDK 8 installation was not found, but is required to build Akka. To manually specify a JDK 8 installation, use the \"set every jdk8home := \\\"/path/to/jdk\\\" sbt command. If you have no JDK 8 installation, target your system JDK with the \"set every targetSystemJdk := true\" sbt command, but beware resulting artifacts will not work on JDK 8" )
}
2019-10-03 05:02:40 +02:00
2020-08-05 13:12:29 +01:00
val targetJdkSettings = Seq ( targetSystemJdk : = false , jdk8home : = sys . env . get ( "JAVA_8_HOME" ) . getOrElse ( "" ) )
2019-10-03 05:02:40 +02:00
}