build.sbt (311 lines of code) (raw):
lazy val V = new {
val asm = "6.0"
val scala = computeScalaVersionFromTravisYml("2.12")
val scalafix = computeScalafixVersionFromBinScalafix()
val scalameta = "4.1.6"
val scalametaScalacPlugin = "4.2.5"
val scalatest = "3.0.5"
}
addCommandAlias("ci-fmt", ui.ciFmt)
addCommandAlias("ci-fast", ui.ciFast)
addCommandAlias("ci-slow", ui.ciSlow)
addCommandAlias("ci-scalafix", ui.ciScalafix)
addCommandAlias("ci", ui.ci)
addCommandAlias("cleanAll", ui.cleanAll)
addCommandAlias("compileAll", ui.compileAll)
addCommandAlias("fmtAll", ui.fmtAll)
addCommandAlias("testAll", ui.testAll)
addCommandAlias("benchAll", ui.benchAll)
addCommandAlias("clean", ui.cleanAll)
addCommandAlias("compile", ui.compile)
addCommandAlias("fast", ui.fastTest)
addCommandAlias("slow", ui.slowTest)
addCommandAlias("fest", ui.scalafixTest)
addCommandAlias("test", ui.test)
addCommandAlias("fmt", ui.fmtAll)
addCommandAlias("benchParse", ui.benchParse)
addCommandAlias("benchIndex", ui.benchIndex)
addCommandAlias("benchOutline", ui.benchOutline)
addCommandAlias("benchSemanticdb", ui.benchSemanticdb)
addCommandAlias("benchScalasig", ui.benchScalasig)
addCommandAlias("benchScalac", ui.benchScalac)
addCommandAlias("publish", ui.publish)
addCommandAlias("publishLocal", ui.publishLocal)
addCommandAlias("publishSigned", ui.publishSigned)
addCommandAlias("rewrite", ui.rewrite)
version.in(ThisBuild) := {
val rscVersion = version.in(ThisBuild).value.replace("+", "-")
println(s"[info] Welcome to Rsc $rscVersion")
val expectedJvmVersion = "1.8"
val actualJvmVersion = sys.props("java.specification.version")
if (actualJvmVersion != expectedJvmVersion) {
val error = s"expected $expectedJvmVersion, actual $actualJvmVersion"
sys.error(s"Unsupported JVM: $error")
}
rscVersion
}
lazy val bench = project
.in(file("bench"))
.dependsOn(tests)
.enablePlugins(JmhPlugin)
.settings(commonSettings)
lazy val check = project
.in(file("check"))
.dependsOn(rsc)
.settings(
commonSettings,
publishableSettings,
moduleName := "rsc-check",
scalacOptions += "-Xexperimental",
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3",
libraryDependencies += "com.github.pathikrit" %% "better-files" % "3.8.0",
libraryDependencies += "commons-cli" % "commons-cli" % "1.4",
libraryDependencies += "io.github.java-diff-utils" % "java-diff-utils" % "4.0",
libraryDependencies += "io.github.soc" % "directories" % "10",
libraryDependencies += "org.ow2.asm" % "asm" % V.asm,
libraryDependencies += "org.ow2.asm" % "asm-util" % V.asm,
libraryDependencies += "org.scala-lang" % "scalap" % V.scala,
libraryDependencies += "org.eclipse.jgit" % "org.eclipse.jgit" % "4.6.0.201612231935-r",
libraryDependencies += "org.scala-lang" % "scala-compiler" % V.scala,
libraryDependencies += "org.scalameta" %% "cli" % V.scalameta,
libraryDependencies += "org.scalameta" %% "metacp" % V.scalameta,
libraryDependencies += "org.slf4j" % "slf4j-api" % "1.7.25",
libraryDependencies += "org.slf4j" % "log4j-over-slf4j" % "1.7.25"
)
lazy val examplesCore = project
.in(file("examples/core"))
.dependsOn(examplesFunction)
.settings(
commonSettings,
semanticdbSettings,
libraryDependencies += "org.scala-lang" % "scala-reflect" % V.scala,
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4"
)
lazy val examplesDeps1 = project
.in(file("examples/deps1"))
.settings(commonSettings)
lazy val examplesDeps2 = project
.in(file("examples/deps2"))
.dependsOn(examplesDeps1)
.settings(commonSettings)
lazy val examplesDeps3 = project
.in(file("examples/deps3"))
.dependsOn(examplesDeps2)
.settings(commonSettings)
lazy val examplesError = project
.in(file("examples/error"))
.dependsOn(examplesErrordeps)
.settings(commonSettings)
lazy val examplesErrordeps = project
.in(file("examples/errordeps"))
.settings(commonSettings)
lazy val examplesFunction = project
.in(file("examples/function"))
.settings(commonSettings)
lazy val examplesOriginalCore = project
.in(file("examples/original/core"))
.dependsOn(examplesFunction)
.settings(
commonSettings,
semanticdbSettings,
libraryDependencies += "org.scala-lang" % "scala-reflect" % V.scala,
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4"
)
lazy val examplesSemantic = project
.in(file("examples/semantic"))
.dependsOn(examplesDeps3)
.settings(commonSettings)
lazy val rsc = project
.in(file("rsc"))
.dependsOn(scalasig)
.settings(
commonSettings,
publishableSettings,
libraryDependencies += "org.scalameta" %% "semanticdb" % V.scalameta,
libraryDependencies += "com.lihaoyi" %% "fastparse" % "1.0.0",
mainClass := Some("rsc.cli.Main")
)
lazy val scalafixInput = project
.in(file("scalafix/input"))
.settings(
commonSettings,
semanticdbSettings,
libraryDependencies += "com.twitter" %% "bijection-core" % "0.9.5"
)
lazy val scalafixOutput = project
.in(file("scalafix/output"))
.settings(
commonSettings,
semanticdbSettings,
libraryDependencies += "com.twitter" %% "bijection-core" % "0.9.5"
)
lazy val scalafixRules = project
.in(file("scalafix/rules"))
.dependsOn(rsc)
.settings(
commonSettings,
publishableSettings,
moduleName := "rsc-rules",
libraryDependencies += "ch.epfl.scala" %% "scalafix-core" % V.scalafix
)
lazy val scalafixTests = project
.in(file("scalafix/tests"))
.dependsOn(scalafixInput, scalafixRules)
.enablePlugins(ScalafixTestkitPlugin)
.settings(
commonSettings,
libraryDependencies += "ch.epfl.scala" % "scalafix-testkit" % V.scalafix % Test cross CrossVersion.full,
scalafixTestkitOutputSourceDirectories :=
sourceDirectories.in(scalafixOutput, Compile).value ++
sourceDirectories.in(examplesCore, Compile).value,
scalafixTestkitInputSourceDirectories :=
sourceDirectories.in(scalafixInput, Compile).value ++
sourceDirectories.in(examplesOriginalCore, Compile).value,
scalafixTestkitInputClasspath :=
fullClasspath.in(scalafixInput, Compile).value ++
fullClasspath.in(examplesOriginalCore, Compile).value
)
lazy val scalasig = project
.in(file("scalasig/scalasig"))
.settings(
commonSettings,
publishableSettings,
libraryDependencies += "org.ow2.asm" % "asm" % V.asm,
libraryDependencies += "org.ow2.asm" % "asm-tree" % V.asm
)
lazy val scalap = project
.in(file("scalasig/scalap"))
.dependsOn(scalasig)
.settings(
commonSettings,
publishableSettings,
libraryDependencies += "org.scalameta" %% "cli" % V.scalameta,
mainClass := Some("scala.meta.cli.Scalap")
)
lazy val tests = project
.in(file("tests"))
.dependsOn(check, rsc, scalap)
.enablePlugins(BuildInfoPlugin)
.configs(Fast, Slow)
.settings(
commonSettings,
libraryDependencies += "org.scalatest" %% "scalatest" % V.scalatest,
libraryDependencies += "org.scalatest" %% "scalatest" % V.scalatest % "test",
buildInfoUsePackageAsPath := true,
buildInfoKeys := Seq(
"sourceRoot" -> (baseDirectory in ThisBuild).value,
BuildInfoKey.map(dependencyClasspath.in(examplesCore, Compile)) {
case (k, v) => "coreClasspath" -> v.map(_.data)
},
BuildInfoKey.map(dependencyClasspath.in(examplesErrordeps, Compile)) {
case (k, v) => "errorClasspath" -> v.map(_.data)
},
BuildInfoKey.map(dependencyClasspath.in(examplesFunction, Compile)) {
case (k, v) => "functionClasspath" -> v.map(_.data)
},
BuildInfoKey.map(dependencyClasspath.in(examplesDeps1, Compile)) {
case (k, v) => "depsClasspath" -> v.map(_.data)
},
BuildInfoKey.map(dependencyClasspath.in(examplesSemantic, Compile)) {
case (k, v) => "semanticClasspath" -> v.map(_.data)
}
),
buildInfoPackage := "rsc.tests",
testOptions.in(Test) += Tests.Argument("-l", "org.scalatest.tags.Slow"),
inConfig(Fast)(Defaults.testTasks),
inConfig(Slow)(Defaults.testTasks),
testOptions.in(Slow) -= Tests.Argument("-l", "org.scalatest.tags.Slow"),
testOptions.in(Slow) += Tests.Argument("-n", "org.scalatest.tags.Slow")
)
lazy val commonSettings = Seq(
organization := "com.twitter",
scalaVersion := V.scala,
crossScalaVersions := Seq(V.scala),
scalacOptions ++= Seq("-Ypatmat-exhaust-depth", "off"),
scalacOptions += "-deprecation",
scalacOptions += "-unchecked",
scalacOptions += "-feature",
scalacOptions += "-Ywarn-unused-import",
scalacOptions ++= { if (isCI) List("-Xfatal-warnings") else Nil },
scalacOptions in (Compile, console) := Nil,
fork in run := true,
fork in Test := true,
javaOptions += "-Xmx4G",
baseDirectory in run := (baseDirectory in ThisBuild).value,
baseDirectory in Test := (baseDirectory in ThisBuild).value,
cancelable := true,
resolvers += Opts.resolver.sonatypeReleases,
resolvers += Opts.resolver.sonatypeSnapshots
)
lazy val publishableSettings = Seq(
publishTo := Some {
val prop = sys.props("repository")
if (prop != null) "adhoc" at prop
else if (version.value.endsWith("SNAPSHOT")) Opts.resolver.sonatypeSnapshots
else Opts.resolver.sonatypeStaging
},
credentials ++= {
val prop = sys.props("credentials")
if (prop != null) List(new FileCredentials(file(prop)))
else Nil
},
publishArtifact.in(Compile) := true,
publishArtifact.in(Test) := false,
publishMavenStyle := true,
pomIncludeRepository := { x =>
false
},
licenses += "Apache v2" -> url("https://github.com/twitter/rsc/blob/master/LICENSE.md"),
pomExtra := (
<url>https://github.com/twitter/rsc</url>
<inceptionYear>2017</inceptionYear>
<scm>
<url>git://github.com/twitter/rsc.git</url>
<connection>scm:git:git://github.com/twitter/rsc.git</connection>
</scm>
<issueManagement>
<system>GitHub</system>
<url>https://github.com/twitter/rsc/issues</url>
</issueManagement>
<developers>
<developer>
<id>xeno-by</id>
<name>Eugene Burmako</name>
<url>https://github.com/xeno-by</url>
</developer>
<developer>
<id>ShaneDelmore</id>
<name>Shane Delmore</name>
<url>https://github.com/ShaneDelmore</url>
</developer>
<developer>
<id>maxov</id>
<name>Max Ovsiankin</name>
<url>https://github.com/maxov</url>
</developer>
<developer>
<id>WiWa</id>
<name>Win Wang</name>
<url>https://github.com/WiWa</url>
</developer>
<developer>
<id>sundresh</id>
<name>Sameer Sundresh</name>
<url>https://github.com/sundresh</url>
</developer>
</developers>
)
)
lazy val semanticdbSettings = Def.settings(
scalacOptions -= "-deprecation",
scalacOptions -= "-unchecked",
scalacOptions -= "-feature",
scalacOptions -= "-Ywarn-unused-import",
scalacOptions -= "-Xfatal-warnings",
addCompilerPlugin(
"org.scalameta" %% "semanticdb-scalac" % V.scalametaScalacPlugin cross CrossVersion.full),
scalacOptions += "-Yrangepos",
scalacOptions += "-P:semanticdb:text:off",
scalacOptions += "-P:semanticdb:symbols:all",
scalacOptions += "-P:semanticdb:synthetics:on"
)