import mill._, scalalib._
val binCrossScalaVersions = Seq("2.11.11", "2.12.4")
val fullCrossScalaVersions = Seq(
"2.11.3", "2.11.4", "2.11.5", "2.11.6", "2.11.7", "2.11.8", "2.11.9", "2.11.11",
"2.12.0", "2.12.1", "2.12.2", "2.12.3", "2.12.4"
)
trait AmmModule extends mill.scalalib.CrossSbtModule{
def testFrameworks = Seq("utest.runner.Framework")
def scalacOptions = Seq("-P:acyclic:force", "-target:jvm-1.7")
def compileIvyDeps = Agg(ivy"com.lihaoyi::acyclic:0.1.7")
def scalacPluginIvyDeps = Agg(ivy"com.lihaoyi::acyclic:0.1.7")
trait Tests extends super.Tests{
def ivyDeps = Agg(ivy"com.lihaoyi::utest:0.6.0")
def testFrameworks = Seq("utest.runner.Framework")
}
def allIvyDeps = T{transitiveIvyDeps() ++ scalaLibraryIvyDeps()}
def externalSources = T{
resolveDeps(allIvyDeps, sources = true)()
}
}
object ops extends Cross[OpsModule](binCrossScalaVersions:_*)
class OpsModule(val crossScalaVersion: String) extends AmmModule{
def ivyDeps = Agg(ivy"com.lihaoyi::geny:0.1.2")
object test extends Tests
}
object terminal extends Cross[TerminalModule](binCrossScalaVersions:_*)
class TerminalModule(val crossScalaVersion: String) extends AmmModule{
def ivyDeps = Agg(
ivy"com.lihaoyi::sourcecode:0.1.3",
ivy"com.lihaoyi::fansi:0.2.4"
)
def compileIvyDeps = Agg(
ivy"${scalaOrganization()}:scala-reflect:$crossScalaVersion"
)
object test extends Tests
}
object amm extends Cross[MainModule](fullCrossScalaVersions:_*){
object util extends Cross[UtilModule](binCrossScalaVersions:_*)
class UtilModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(ops())
def ivyDeps = Agg(
ivy"com.lihaoyi::upickle:0.5.1",
ivy"com.lihaoyi::pprint:0.5.2",
ivy"com.lihaoyi::fansi:0.2.4"
)
def compileIvyDeps = Agg(
ivy"${scalaOrganization()}:scala-reflect:$crossScalaVersion"
)
}
object runtime extends Cross[RuntimeModule](binCrossScalaVersions:_*)
class RuntimeModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(ops(), amm.util())
def ivyDeps = Agg(
ivy"io.get-coursier::coursier:1.0.0",
ivy"io.get-coursier::coursier-cache:1.0.0",
ivy"org.scalaj::scalaj-http:2.3.0"
)
def generatedSources = T{
import ammonite.ops._
cp(build.millSourcePath/'project/"Constants.scala", T.ctx().dest/"Constants.scala")
Seq(PathRef(T.ctx().dest))
}
}
object interp extends Cross[InterpModule](fullCrossScalaVersions:_*)
class InterpModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(ops(), amm.util(), amm.runtime())
def ivyDeps = Agg(
ivy"${scalaOrganization()}:scala-compiler:$crossScalaVersion",
ivy"${scalaOrganization()}:scala-reflect:$crossScalaVersion",
ivy"com.lihaoyi::scalaparse:1.0.0",
ivy"org.javassist:javassist:3.21.0-GA"
)
}
object repl extends Cross[ReplModule](fullCrossScalaVersions:_*)
class ReplModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(
ops(), amm.util(),
amm.runtime(), amm.interp(),
terminal()
)
def ivyDeps = Agg(
ivy"jline:jline:2.14.3",
ivy"com.github.javaparser:javaparser-core:3.2.5",
ivy"com.github.scopt::scopt:3.5.0"
)
object test extends Tests{
def resources = T.sources {
super.resources() ++
ReplModule.this.sources() ++
ReplModule.this.externalSources()
}
}
}
}
class MainModule(val crossScalaVersion: String) extends AmmModule{
def mainClass = Some("ammonite.Main")
def moduleDeps = Seq(
terminal(), ops(),
amm.util(), amm.runtime(),
amm.interp(), amm.repl()
)
def ivyDeps = Agg(
ivy"com.github.scopt::scopt:3.5.0",
)
def runClasspath =
super.runClasspath() ++
ops().sources() ++
terminal().sources() ++
amm.util().sources() ++
amm.runtime().sources() ++
amm.interp().sources() ++
amm.repl().sources() ++
sources() ++
externalSources()
def prependShellScript =
"#!/usr/bin/env sh\n" +
"""exec java -jar -Xmx500m -XX:+UseG1GC $JAVA_OPTS "$0" "$@""""
object test extends Tests{
def moduleDeps = super.moduleDeps ++ Seq(amm.repl().test)
def ivyDeps = super.ivyDeps() ++ Agg(
ivy"com.chuusai::shapeless:2.3.2"
)
}
}
object shell extends Cross[ShellModule](fullCrossScalaVersions:_*)
class ShellModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(ops(), amm())
object test extends Tests{
def moduleDeps = super.moduleDeps ++ Seq(amm.repl().test)
def forkEnv = super.forkEnv() ++ Seq(
"AMMONITE_TEST_SHELL" -> shell().jar().path.toString,
"AMMONITE_TEST_ASSEMBLY" -> amm().assembly().path.toString
)
}
}
object integration extends Cross[IntegrationModule](fullCrossScalaVersions:_*)
class IntegrationModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(ops(), amm())
object test extends Tests {
def forkEnv = super.forkEnv() ++ Seq(
"AMMONITE_TEST_SHELL" -> shell().jar().path.toString,
"AMMONITE_TEST_ASSEMBLY" -> amm().assembly().path.toString
)
}
}
object sshd extends Cross[SshdModule](fullCrossScalaVersions:_*)
class SshdModule(val crossScalaVersion: String) extends AmmModule{
def moduleDeps = Seq(ops(), amm())
def ivyDeps = Agg(
// sshd-core 1.3.0 requires java8
ivy"org.apache.sshd:sshd-core:1.2.0",
ivy"org.bouncycastle:bcprov-jdk15on:1.56",
)
object test extends Tests {
def ivyDeps = super.ivyDeps() ++ Agg(
// slf4j-nop makes sshd server use logger that writes into the void
ivy"org.slf4j:slf4j-nop:1.7.12",
ivy"com.jcraft:jsch:0.1.54",
ivy"org.scalacheck::scalacheck:1.12.6"
)
}
}