pekko/project/AkkaBuild.scala

258 lines
11 KiB
Scala
Raw Normal View History

/*
* Copyright (C) 2009-2019 Lightbend Inc. <https://www.lightbend.com>
*/
2011-09-23 10:21:03 +02:00
package akka
import java.io.{FileInputStream, InputStreamReader}
import java.util.Properties
import sbt.Keys._
2017-06-09 04:34:21 -07:00
import sbt._
2017-10-04 14:22:25 +02:00
import scala.collection.breakOut
2011-07-04 19:16:43 +12:00
object AkkaBuild {
val enableMiMa = true
2016-05-10 10:49:33 +02:00
val parallelExecutionByDefault = false // TODO: enable this once we're sure it does not break things
2015-05-21 21:07:37 +02:00
lazy val buildSettings = Dependencies.Versions ++ Seq(
2017-10-06 10:30:28 +02:00
organization := "com.typesafe.akka",
// use the same value as in the build scope, so it can be overriden by stampVersion
version := (version in ThisBuild).value)
2011-07-04 19:16:43 +12:00
lazy val rootSettings = Release.settings ++
UnidocRoot.akkaSettings ++
2017-10-06 10:30:28 +02:00
Formatting.formatSettings ++
Protobuf.settings ++ Seq(
parallelExecution in GlobalScope := System.getProperty("akka.parallelExecution", parallelExecutionByDefault.toString).toBoolean,
version in ThisBuild := "2.5-SNAPSHOT"
)
lazy val mayChangeSettings = Seq(
description := """|This module of Akka is marked as
|'may change', which means that it is in early
|access mode, which also means that it is not covered
|by commercial support. An module marked 'may change' doesn't
|have to obey the rule of staying binary compatible
|between minor releases. Breaking API changes may be
|introduced in minor releases without notice as we
|refine and simplify based on your feedback. Additionally
|such a module may be dropped in major releases
|without prior deprecation.
2017-10-06 10:30:28 +02:00
|""".stripMargin)
val (mavenLocalResolver, mavenLocalResolverSettings) =
System.getProperty("akka.build.M2Dir") match {
2017-10-06 10:30:28 +02:00
case null (Resolver.mavenLocal, Seq.empty)
case path
// Maven resolver settings
def deliverPattern(outputPath: File): String =
(outputPath / "[artifact]-[revision](-[classifier]).[ext]").absolutePath
val resolver = Resolver.file("user-publish-m2-local", new File(path))
(resolver, Seq(
2017-10-06 10:30:28 +02:00
otherResolvers := resolver :: publishTo.value.toList,
publishM2Configuration := Classpaths.publishConfig(
publishMavenStyle.value,
deliverPattern(crossTarget.value),
if (isSnapshot.value) "integration" else "release",
ivyConfigurations.value.map(c => ConfigRef(c.name)).toVector,
artifacts = packagedArtifacts.value.toVector,
resolverName = resolver.name,
checksums = checksums.in(publishM2).value.toVector,
logging = ivyLoggingLevel.value,
overwrite = true)))
}
lazy val resolverSettings = {
// should we be allowed to use artifacts published to the local maven repository
2017-10-06 10:30:28 +02:00
if (System.getProperty("akka.build.useLocalMavenResolver", "false").toBoolean)
Seq(resolvers += mavenLocalResolver)
else Seq.empty
} ++ {
// should we be allowed to use artifacts from sonatype snapshots
2017-10-06 10:30:28 +02:00
if (System.getProperty("akka.build.useSnapshotSonatypeResolver", "false").toBoolean)
Seq(resolvers += Resolver.sonatypeRepo("snapshots"))
else Seq.empty
} ++ Seq(
2017-10-06 10:30:28 +02:00
pomIncludeRepository := (_ false) // do not leak internal repositories during staging
)
private def allWarnings: Boolean = System.getProperty("akka.allwarnings", "false").toBoolean
2015-01-30 11:33:33 +01:00
final val DefaultScalacOptions = Seq("-encoding", "UTF-8", "-feature", "-unchecked", "-Xlog-reflective-calls", "-Xlint", "-Ywarn-unused")
// -XDignore.symbol.file suppresses sun.misc.Unsafe warnings
final val DefaultJavacOptions = Seq("-encoding", "UTF-8", "-Xlint:unchecked", "-XDignore.symbol.file")
2016-01-13 12:00:46 +01:00
lazy val defaultSettings = resolverSettings ++
TestExtras.Filter.settings ++
2017-10-15 18:01:54 +02:00
Protobuf.settings ++ Seq[Setting[_]](
2017-10-06 10:30:28 +02:00
// compile options
scalacOptions in Compile ++= DefaultScalacOptions,
Various scala-2.13.0-M5 fixes fix akka-actor-tests compile errors some tests still fail though Fix test failures in akka-actor-test Manually work arround missing implicit Factory[Nothing, Seq[Nothing]] see https://github.com/scala/scala-collection-compat/issues/137 akka-remote scalafix changes Fix shutdownAll compile error test:akka-remote scalafix changes akka-multi-node-testkit scalafix Fix akka-remote-tests multi-jvm compile errors akka-stream-tests/test:scalafix Fix test:akka-stream-tests Crude implementation of ByteString.map scalafix akka-actor-typed, akka-actor-typed-tests akka-actor-typed-tests compile and succeed scalafix akka-camel scalafix akka-cluster akka-cluster compile & test scalafix akka-cluster-metrics Fix akka-cluster-metrics scalafix akka-cluster-tools akka-cluster-tools compile and test scalafix akka-distributed-data akka-distributed-data fixes scalafix akka-persistence scalafix akka-cluster-sharding fix akka-cluster-sharding scalafix akka-contrib Fix akka-cluster-sharding-typed test scalafix akka-docs Use scala-stm 0.9 (released for M5) akka-docs Remove dependency on collections-compat Cherry-pick the relevant constructs to our own private utils Shorten 'scala.collections.immutable' by importing it Duplicate 'immutable' imports Use 'foreach' on futures Replace MapLike with regular Map Internal API markers Simplify ccompat by moving PackageShared into object Since we don't currently need to differentiate between 2.11 and Avoid relying on 'union' (and ++) being left-biased Fix akka-actor/doc by removing -Ywarn-unused Make more things more private Copyright headers Use 'unsorted' to go from SortedSet to Set Duplicate import Use onComplete rather than failed.foreach Clarify why we partly duplicate scala-collection-compat
2018-11-22 16:18:10 +01:00
// On 2.13, adding -Ywarn-unused breaks 'sbt ++2.13.0-M5 akka-actor/doc'
// https://github.com/akka/akka/issues/26119
scalacOptions in Compile --= (CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, 13)) => Seq("-Ywarn-unused")
case _ => Seq.empty
}),
// Makes sure that, even when compiling with a jdk version greater than 8, the resulting jar will not refer to
// methods not found in jdk8. 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":
scalacOptions in Compile ++= (
if (System.getProperty("java.version").startsWith("1."))
Seq("-target:jvm-1.8")
else
if (scalaBinaryVersion.value == "2.11")
Seq("-target:jvm-1.8", "-javabootclasspath", CrossJava.Keys.fullJavaHomes.value("8") + "/jre/lib/rt.jar")
else
// -release 8 is not enough, for some reason we need the 8 rt.jar explicitly #25330
Seq("-release", "8", "-javabootclasspath", CrossJava.Keys.fullJavaHomes.value("8") + "/jre/lib/rt.jar")),
2017-10-06 10:30:28 +02:00
scalacOptions in Compile ++= (if (allWarnings) Seq("-deprecation") else Nil),
scalacOptions in Test := (scalacOptions in Test).value.filterNot(opt
opt == "-Xlog-reflective-calls" || opt.contains("genjavadoc")) ++ Seq(
"-Ywarn-unused"),
javacOptions in compile ++= DefaultJavacOptions ++ (
if (System.getProperty("java.version").startsWith("1."))
Seq()
else
Seq("-source", "8", "-target", "8", "-bootclasspath", CrossJava.Keys.fullJavaHomes.value("8") + "/jre/lib/rt.jar")
),
javacOptions in test ++= DefaultJavacOptions ++ (
if (System.getProperty("java.version").startsWith("1."))
Seq()
else
Seq("-source", "8", "-target", "8", "-bootclasspath", CrossJava.Keys.fullJavaHomes.value("8") + "/jre/lib/rt.jar")
),
2017-10-06 10:30:28 +02:00
javacOptions in compile ++= (if (allWarnings) Seq("-Xlint:deprecation") else Nil),
javacOptions in doc ++= Seq(),
2011-07-04 19:16:43 +12:00
2017-10-06 10:30:28 +02:00
crossVersion := CrossVersion.binary,
// Adds a `src/main/scala-2.13+` source directory for Scala 2.13 and newer
// and a `src/main/scala-2.13-` source directory for Scala version older than 2.13
unmanagedSourceDirectories in Compile += {
val sourceDir = (sourceDirectory in Compile).value
CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, n)) if n >= 13 => sourceDir / "scala-2.13+"
case _ => sourceDir / "scala-2.13-"
}
},
2017-10-06 10:30:28 +02:00
ivyLoggingLevel in ThisBuild := UpdateLogging.Quiet,
2017-10-06 10:30:28 +02:00
licenses := Seq(("Apache License, Version 2.0", url("http://www.apache.org/licenses/LICENSE-2.0"))),
homepage := Some(url("http://akka.io/")),
2017-10-06 10:30:28 +02:00
apiURL := Some(url(s"http://doc.akka.io/api/akka/${version.value}")),
2017-10-06 10:30:28 +02:00
initialCommands :=
"""|import language.postfixOps
|import akka.actor._
|import ActorDSL._
|import scala.concurrent._
|import com.typesafe.config.ConfigFactory
|import scala.concurrent.duration._
|import akka.util.Timeout
|var config = ConfigFactory.parseString("akka.stdout-loglevel=INFO,akka.loglevel=DEBUG,pinned{type=PinnedDispatcher,executor=thread-pool-executor,throughput=1000}")
2016-09-29 15:01:05 +02:00
|var remoteConfig = ConfigFactory.parseString("akka.remote.netty{port=0,use-dispatcher-for-io=akka.actor.default-dispatcher,execution-pool-size=0},akka.actor.provider=remote").withFallback(config)
|var system: ActorSystem = null
|implicit def _system = system
|def startSystem(remoting: Boolean = false) { system = ActorSystem("repl", if(remoting) remoteConfig else config); println("dont forget to system.terminate()!") }
|implicit def ec = system.dispatcher
|implicit val timeout = Timeout(5 seconds)
|""".stripMargin,
2017-10-06 10:30:28 +02:00
/**
* Test settings
*/
fork in Test := true,
// default JVM config for tests
javaOptions in Test ++= {
val defaults = Seq(
// ## core memory settings
"-XX:+UseG1GC",
// most tests actually don't really use _that_ much memory (>1g usually)
// twice used (and then some) keeps G1GC happy - very few or to no full gcs
"-Xms3g", "-Xmx3g",
// increase stack size (todo why?)
"-Xss2m",
// ## extra memory/gc tuning
// this breaks jstat, but could avoid costly syncs to disc see http://www.evanjones.ca/jvm-mmap-pause.html
"-XX:+PerfDisableSharedMem",
// tell G1GC that we would be really happy if all GC pauses could be kept below this as higher would
// likely start causing test failures in timing tests
"-XX:MaxGCPauseMillis=300",
// nio direct memory limit for artery/aeron (probably)
"-XX:MaxDirectMemorySize=256m",
// faster random source
"-Djava.security.egd=file:/dev/./urandom")
if (sys.props.contains("akka.ci-server"))
defaults ++ Seq("-XX:+PrintGCTimeStamps", "-XX:+PrintGCDetails")
else
defaults
},
// all system properties passed to sbt prefixed with "akka." will be passed on to the forked jvms as is
javaOptions in Test := {
val base = (javaOptions in Test).value
val akkaSysProps: Seq[String] =
sys.props.filter(_._1.startsWith("akka"))
.map { case (key, value) s"-D$key=$value" }(breakOut)
base ++ akkaSysProps
},
// with forked tests the working directory is set to each module's home directory
// rather than the Akka root, some tests depend on Akka root being working dir, so reset
testGrouping in Test := {
val original: Seq[Tests.Group] = (testGrouping in Test).value
original.map { group
group.runPolicy match {
case Tests.SubProcess(forkOptions)
group.copy(runPolicy = Tests.SubProcess(forkOptions.withWorkingDirectory(
2017-10-06 10:30:28 +02:00
workingDirectory = Some(new File(System.getProperty("user.dir"))))))
case _ group
}
2017-10-04 14:22:25 +02:00
}
2017-10-06 10:30:28 +02:00
},
2014-04-25 16:32:43 +02:00
2017-10-06 10:30:28 +02:00
parallelExecution in Test := System.getProperty("akka.parallelExecution", parallelExecutionByDefault.toString).toBoolean,
logBuffered in Test := System.getProperty("akka.logBufferedTests", "false").toBoolean,
2017-10-04 14:22:25 +02:00
2017-10-06 10:30:28 +02:00
// show full stack traces and test case durations
2017-10-15 18:01:54 +02:00
testOptions in Test += Tests.Argument("-oDF")) ++
2017-10-06 10:30:28 +02:00
mavenLocalResolverSettings ++
docLintingSettings ++
CrossJava.crossJavaSettings
2016-01-13 12:00:46 +01:00
lazy val docLintingSettings = Seq(
2017-10-06 10:30:28 +02:00
javacOptions in compile ++= Seq("-Xdoclint:none"),
javacOptions in test ++= Seq("-Xdoclint:none"),
javacOptions in doc ++= Seq("-Xdoclint:none", "--ignore-source-errors"))
2011-07-08 12:53:36 +12:00
def loadSystemProperties(fileName: String): Unit = {
import scala.collection.JavaConverters._
val file = new File(fileName)
if (file.exists()) {
println("Loading system properties from file `" + fileName + "`")
val in = new InputStreamReader(new FileInputStream(file), "UTF-8")
val props = new Properties
props.load(in)
in.close()
sys.props ++ props.asScala
}
}
2017-10-06 10:30:28 +02:00
def majorMinor(version: String): Option[String] = """\d+\.\d+""".r.findFirstIn(version)
2011-07-04 19:16:43 +12:00
}