summaryrefslogtreecommitdiff
path: root/build.sbt
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2015-02-11 18:39:44 +0100
committerAdriaan Moors <adriaan.moors@typesafe.com>2015-04-17 11:27:59 -0700
commit70cb911f54c8b049b23d77e28048fd4cdb217454 (patch)
tree2e97d27d31f305b95c374aeb8943ca8c2607071f /build.sbt
parentb730937493f8f25c985b1a4cf5fcfb7fc16092a4 (diff)
downloadscala-70cb911f54c8b049b23d77e28048fd4cdb217454.tar.gz
scala-70cb911f54c8b049b23d77e28048fd4cdb217454.tar.bz2
scala-70cb911f54c8b049b23d77e28048fd4cdb217454.zip
Introduce sbt build
It mimics the ant build as closely as necessary to compare the produced artifacts between the two builds, to build confidence in the transition: - all projects are built into the same directories in build/quick - include legacy projects: forkjoin, asm, actors - TODO: Include forkjoin & asm into library & compiler jars, respectively. We don't carry over ant's built-in bootstrapping process; this will be scripted outside of the build, publishing layers locally. NOTE: the root project cannot be named `scala`: it shadows the `scala` package in e.g., `projectConsole`.
Diffstat (limited to 'build.sbt')
-rw-r--r--build.sbt144
1 files changed, 144 insertions, 0 deletions
diff --git a/build.sbt b/build.sbt
new file mode 100644
index 0000000000..740d823435
--- /dev/null
+++ b/build.sbt
@@ -0,0 +1,144 @@
+/*
+ * The new, sbt-based build definition for Scala.
+ *
+ * What you see below is very much work-in-progress. Basics like compiling and packaging jars
+ * (into right location) work. Everything else is missing:
+ * building docs, placing shell scripts in right locations (so you can run compiler easily),
+ * running partest test, compiling and running JUnit test, and many, many other things.
+ *
+ * You'll notice that this build definition is much more complicated than your typical sbt build.
+ * The main reason is that we are not benefiting from sbt's conventions when it comes project
+ * layout. For that reason we have to configure a lot more explicitly. I've tried explain in
+ * comments the less obvious settings.
+ *
+ * This nicely leads me to explaning goal and non-goals of this build definition. Goals are:
+ *
+ * - to be easy to tweak it in case a bug or small inconsistency is found
+ * - to mimic Ant's behavior as closely as possible
+ * - to be super explicit about any departure from standard sbt settings
+ * - to achieve functional parity with Ant build as quickly as possible
+ * - to be readable and not necessarily succint
+ * - to provide the nicest development experience for people hacking on Scala
+ *
+ * Non-goals are:
+ *
+ * - to have the shortest sbt build definition possible; we'll beat Ant definition
+ * easily and that will thrill us already
+ * - to remove irregularities from our build process right away
+ * - to modularize the Scala compiler or library further
+ *
+ * It boils down to simple rules:
+ *
+ * - project laytout is set in stone for now
+ * - if you need to work on convincing sbt to follow non-standard layout then
+ * explain everything you did in comments
+ * - constantly check where Ant build produces class files, artifacts, what kind of other
+ * files generates and port all of that to here
+ *
+ * Note on bootstrapping:
+ *
+ * Let's start with reminder what bootstrapping means in our context. It's an answer
+ * to this question: which version of Scala are using to compile Scala? The fact that
+ * the question sounds circular suggests trickiness. Indeed, bootstrapping Scala
+ * compiler is a tricky process.
+ *
+ * Ant build used to have involved system of bootstrapping Scala. It would consist of
+ * three layers: starr, locker and quick. The sbt build for Scala ditches layering
+ * and strives to be as standard sbt project as possible. This means that we are simply
+ * building Scala with latest stable release of Scala.
+ * See this discussion for more details behind this decision:
+ * https://groups.google.com/d/topic/scala-internals/gp5JsM1E0Fo/discussion
+ */
+
+lazy val commonSettings = Seq[Setting[_]](
+ organization := "org.scala-lang",
+ version := "2.11.6-SNAPSHOT",
+ scalaVersion := "2.11.5",
+ // all project will have baseDirectory set to root folder; we shouldn't include
+ // any source from it in any project
+ sourcesInBase := false,
+ // we don't cross build Scala itself
+ crossPaths := false,
+ // do not add Scala library jar as a dependency automatically
+ autoScalaLibrary := false,
+ // we always assume that Java classes are standalone and do not have any dependency
+ // on Scala classes
+ compileOrder := CompileOrder.JavaThenScala,
+ // we don't want any unmanaged jars; as a reminder: unmanaged jar is a jar stored
+ // directly on the file system and it's not resolved through Ivy
+ // Ant's build stored unmanaged jars in `lib/` directory
+ unmanagedJars in Compile := Seq.empty,
+ // set baseDirectory to the root folder in all projects
+ baseDirectory := (baseDirectory in ThisBuild).value,
+ sourceDirectory in Compile := baseDirectory.value / "src" / name.value,
+ sourceDirectories in Compile := Seq(sourceDirectory.value),
+ scalaSource in Compile := (sourceDirectory in Compile).value,
+ javaSource in Compile := (sourceDirectory in Compile).value,
+ target := baseDirectory.value / "target" / name.value,
+ classDirectory in Compile := baseDirectory.value / "build/quick/classes" / name.value,
+ // given that classDirectory is overriden to be _outside_ of target directory, we have
+ // to make sure its being cleaned properly
+ cleanFiles += (classDirectory in Compile).value
+)
+
+lazy val library = project.
+ settings(commonSettings: _*).
+ settings(
+ scalacOptions ++= Seq[String]("-sourcepath", (scalaSource in Compile).value.toString)
+ ) dependsOn (forkjoin)
+
+lazy val reflect = project.
+ settings(commonSettings: _*).
+ dependsOn(library)
+
+lazy val compiler = project.
+ settings(commonSettings: _*).
+ settings(libraryDependencies += "org.apache.ant" % "ant" % "1.9.4").
+ dependsOn(library, reflect, asm)
+
+lazy val interactive = project.
+ settings(commonSettings: _*).
+ dependsOn(compiler)
+
+lazy val repl = project.
+ settings(commonSettings: _*).
+ // TODO: in Ant build def, this version is defined in versions.properties
+ // figure out whether we also want to externalize jline's version
+ settings(libraryDependencies += "jline" % "jline" % "2.12").
+ dependsOn(compiler)
+
+lazy val scaladoc = project.
+ settings(commonSettings: _*).
+ settings(
+ libraryDependencies ++= Seq(
+ "org.scala-lang.modules" %% "scala-xml" % "1.0.3",
+ "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.3",
+ "org.scala-lang.modules" %% "scala-partest" % "1.0.5"
+ )
+ ).
+ dependsOn(compiler)
+
+lazy val scalap = project.
+ settings(commonSettings: _*).
+ dependsOn(compiler)
+
+// deprecated Scala Actors project
+// TODO: it packages into actors.jar but it should be scala-actors.jar
+lazy val actors = project.
+ settings(commonSettings: _*).
+ dependsOn(library)
+
+lazy val forkjoin = project.
+ settings(commonSettings: _*)
+
+lazy val asm = project.
+ settings(commonSettings: _*)
+
+lazy val root = (project in file(".")).
+ aggregate(library, forkjoin, reflect, compiler, asm, interactive, repl,
+ scaladoc, scalap, actors).
+ // make the root project an aggragate-only
+ // we disable sbt's built-in Ivy plugin in the root project
+ // so it doesn't produce any artifact including not building
+ // an empty jar
+ disablePlugins(plugins.IvyPlugin)