blob: aa7b3c2b863b3bd23851e7f0b9fc40954207d33f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
import org.apache.commons.io.FileUtils
import sbt._
import sbt.Keys._
import sbtbuildinfo._
import sbtbuildinfo.BuildInfoKeys._
import scoverage.ScoverageSbtPlugin
//import coursier.Keys._
import com.typesafe.sbt.pgp.PgpKeys._
import scala.util.{Try, Properties}
object Common {
// Parameters for publishing to artifact repositories
private val versionNumber = Properties.envOrElse("VERSION", "0.0.0-dev")
private val snapshot = Properties.envOrElse("IS_SNAPSHOT","true").toBoolean
private val gpgLocation = Properties.envOrElse("GPG","/usr/local/bin/gpg")
private val gpgPassword = Properties.envOrElse("GPG_PASSWORD","")
private val buildOrganization = "org.apache.toree"
private val buildVersion = if (snapshot) s"$versionNumber-SNAPSHOT" else versionNumber
private val buildScalaVersion = "2.10.4"
val buildInfoSettings = Seq(
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion, "sparkVersion" -> sparkVersion),
buildInfoPackage := buildOrganization,
buildInfoOptions += BuildInfoOption.BuildTime
)
def ToreeProject(projectName: String, doFork: Boolean = false, needsSpark: Boolean = false):Project = (
ToreeProject(s"toree-$projectName", projectName, doFork, needsSpark)
)
def ToreeProject(projectName: String, projectDir: String, doFork: Boolean, needsSpark: Boolean):Project = (
Project(projectName, file(projectDir))
.configs( UnitTest )
.configs( IntegrationTest )
.configs( SystemTest )
.configs( ScratchTest )
.settings(commonSettings:_*)
.settings( inConfig(UnitTest)(Defaults.testTasks) : _*)
.settings( inConfig(IntegrationTest)(Defaults.testTasks) : _*)
.settings( inConfig(SystemTest)(Defaults.testTasks) : _*)
.settings( inConfig(ScratchTest)(Defaults.testTasks) : _*)
.settings(
testOptions in UnitTest := Seq(Tests.Filter(unitFilter)),
testOptions in IntegrationTest := Seq(Tests.Filter(intFilter)),
testOptions in SystemTest := Seq(Tests.Filter(sysFilter)),
testOptions in ScratchTest := Seq(Tests.Filter(scratchFilter))
).settings(
fork in Test := doFork,
fork in UnitTest := doFork,
fork in IntegrationTest := doFork,
fork in SystemTest := doFork,
fork in ScratchTest := doFork,
libraryDependencies ++= (
if (needsSpark) sparkLibraries
else Nil
)
)
)
def scratchFilter(name: String): Boolean =
(name endsWith "SpecForScratch") || (name startsWith "scratch.")
def sysFilter(name: String): Boolean =
(name endsWith "SpecForSystem") || (name startsWith "system.")
def intFilter(name: String): Boolean =
(name endsWith "SpecForIntegration") || (name startsWith "integration.")
def unitFilter(name: String): Boolean =
(name endsWith "Spec") && !intFilter(name) &&
!sysFilter(name) && !scratchFilter(name)
lazy val UnitTest = config("unit") extend Test
lazy val IntegrationTest = config("integration") extend Test
lazy val SystemTest = config("system") extend Test
lazy val ScratchTest = config("scratch") extend Test
private lazy val sparkVersion = {
val sparkEnvironmentVariable = "APACHE_SPARK_VERSION"
val defaultSparkVersion = "1.6.1"
val _sparkVersion = Properties.envOrNone(sparkEnvironmentVariable)
if (_sparkVersion.isEmpty) {
scala.Console.out.println(
s"""
|[INFO] Using default Apache Spark $defaultSparkVersion!
""".stripMargin.trim.replace('\n', ' '))
defaultSparkVersion
} else {
val version = _sparkVersion.get
scala.Console.out.println(
s"""
|[INFO] Using Apache Spark $version provided from
|$sparkEnvironmentVariable!
""".stripMargin.trim.replace('\n', ' '))
version
}
}
private val sparkLibraries = Seq(
"org.apache.spark" %% "spark-core" % sparkVersion % "provided" excludeAll( // Apache v2
// Exclude netty (org.jboss.netty is for 3.2.2.Final only)
ExclusionRule(
organization = "org.jboss.netty",
name = "netty"
)
),
"org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
"org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
"org.apache.spark" %% "spark-mllib" % sparkVersion % "provided",
"org.apache.spark" %% "spark-graphx" % sparkVersion % "provided",
"org.apache.spark" %% "spark-repl" % sparkVersion % "provided"
)
val commonSettings: Seq[Def.Setting[_]] = Seq(
organization := buildOrganization,
useGpg := true,
gpgCommand := gpgLocation,
pgpPassphrase in Global := Some(gpgPassword.toArray),
version := buildVersion,
scalaVersion := buildScalaVersion,
isSnapshot := snapshot,
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/",
// Test dependencies
libraryDependencies ++= Seq(
"org.scalatest" %% "scalatest" % "2.2.6" % "test", // Apache v2
"org.mockito" % "mockito-all" % "1.10.19" % "test", // MIT
// use the same jackson version in test than the one provided at runtime by Spark 2.0.0
"com.fasterxml.jackson.core" % "jackson-databind" % "2.6.5" % "test" // Apache v2
),
ScoverageSbtPlugin.ScoverageKeys.coverageHighlighting := false,
pomExtra :=
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>10</version>
</parent>
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<url>http://toree.incubator.apache.org/</url>
<scm>
<connection>scm:git:git@github.com:apache/incubator-toree.git</connection>
<developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-toree.git</developerConnection>
<url>scm:git:git@github.com:apache/incubator-toree.git</url>
<tag>HEAD</tag>
</scm>,
mappings in packageBin in Compile += file("LICENSE") -> "LICENSE",
mappings in packageBin in Compile += file("NOTICE") -> "NOTICE",
/*coursierVerbosity := {
val level = Try(Integer.valueOf(Properties.envOrElse(
"TOREE_RESOLUTION_VERBOSITY", "1")
).toInt).getOrElse(1)
scala.Console.out.println(
s"[INFO] Toree Resolution Verbosity Level = $level"
)
level
},*/
scalacOptions in (Compile, doc) ++= Seq(
// Ignore packages (for Scaladoc) not from our project
"-skip-packages", Seq(
"akka",
"scala"
).mkString(":")
),
// Scala-based options for compilation
scalacOptions ++= Seq(
"-deprecation", "-unchecked", "-feature",
//"-Xlint", // Scala 2.11.x only
"-Xfatal-warnings",
"-Ywarn-all",
"-language:reflectiveCalls",
"-target:jvm-1.6"
),
// Java-based options for compilation (all tasks)
// NOTE: Providing a blank flag causes failures, only uncomment with options
//javacOptions in Compile ++= Seq(""),
// Java-based options for just the compile task
javacOptions in (Compile, compile) ++= Seq(
"-Xlint:all", // Enable all Java-based warnings
"-Xlint:-path", // Suppress path warnings since we get tons of them
"-Xlint:-options",
"-Xlint:-processing",
"-Werror", // Treat warnings as errors
"-source", "1.6",
"-target", "1.6"
),
// Options provided to forked JVMs through sbt, based on our .jvmopts file
javaOptions ++= Seq(
"-Xms1024M", "-Xmx4096M", "-Xss2m", "-XX:MaxPermSize=1024M",
"-XX:ReservedCodeCacheSize=256M", "-XX:+TieredCompilation",
"-XX:+CMSPermGenSweepingEnabled", "-XX:+CMSClassUnloadingEnabled",
"-XX:+UseConcMarkSweepGC", "-XX:+HeapDumpOnOutOfMemoryError"
),
// Add additional test option to show time taken per test
testOptions in Test += Tests.Argument("-oD"),
// Add a global resource directory with compile/ and test/ for resources in all projects
unmanagedResourceDirectories in Compile += file("resources/compile"),
unmanagedResourceDirectories in Test += file("resources/test"),
// Publish Settings
publishTo := {
if (isSnapshot.value)
Some("Apache Staging Repo" at "https://repository.apache.org/content/repositories/snapshots/")
else
Some("Apache Staging Repo" at "https://repository.apache.org/service/local/staging/deploy/maven2/")
},
publishMavenStyle := true,
// Add rebuild ivy xml to the following tasks
compile <<= (compile in Compile) dependsOn (rebuildIvyXml dependsOn deliverLocal)
) ++ rebuildIvyXmlSettings // Include our rebuild ivy xml settings
// ==========================================================================
// = REBUILD IVY XML SETTINGS BELOW
// ==========================================================================
lazy val rebuildIvyXml = TaskKey[Unit](
"rebuild-ivy-xml",
"Rebuilds the ivy xml using deliver-local and copies it to src " +
"resource directories"
)
// TODO: Figure out how to retrieve the configuration being used to avoid
// this duplication
lazy val rebuildIvyXmlSettings = Seq(
rebuildIvyXml := {
val s: TaskStreams = streams.value
val inputFile = (crossTarget.value / s"ivy-${version.value}.xml").getAbsoluteFile
val outputFile =
((resourceDirectory in Compile).value / s"${name.value}-ivy.xml").getAbsoluteFile
s.log.info(s"Copying ${inputFile.getPath} to ${outputFile.getPath}")
FileUtils.copyFile(inputFile, outputFile)
}
)
}