pure-extras: example, publish(M2)Local/compileAll.
/*
* REPL:
*
* ./mill --repl -w
*
* Generate Idea project:
*
* ./mill mill.scalalib.GenIdea/idea
*
*/
import ammonite.ops
import mill._
import mill.api.Loose
import mill.define.{Command, Input, Sources, Target}
import mill.scalajslib._
import mill.scalalib._
import mill.scalalib.publish._
object V {
val app = "0.3-SNAPSHOT"
val scala211 = "2.11.12"
val scala212 = "2.12.12"
val scala213 = "2.13.4"
val scalaJs06 = "0.6.33"
val scalaJs = "1.3.1"
val scalatags = "0.9.2"
}
object D {
val scalatags211 = ivy"com.lihaoyi::scalatags::0.6.8"
val scalatags = ivy"com.lihaoyi::scalatags::${V.scalatags}"
val scalatex = ivy"org.openmole::scalatex-api:0.4.6"
val oslib = ivy"com.lihaoyi::os-lib::0.7.1"
}
val compilerOptions = Seq(
"-deprecation", // Emit warning and location for usages of deprecated APIs.
"-encoding", "utf-8", // Specify character encoding used by source files.
"-explaintypes", // Explain type errors in more detail.
"-feature", // Emit warning and location for usages of features that should be imported explicitly.
"-language:higherKinds", // Allow higher-kinded types
"-language:implicitConversions", // Allow definition of implicit functions called views
"-language:reflectiveCalls",
"-language:postfixOps",
"-unchecked", // Enable additional warnings where generated code depends on assumptions.
"-Xcheckinit", // Wrap field accessors to throw an exception on uninitialized access.
"-target:jvm-1.8"
)
trait Common extends CrossSbtModule with PublishModule {
def pomSettings: T[PomSettings] = PomSettings(
description = "Scalatags DSL for purecss.io framework",
organization = "cz.functionals",
url = "https://hg.functionals.cz/purecss",
licenses = Seq(License.`Apache-2.0`),
versionControl = VersionControl(developerConnection = Some(
"https://hg.functionals.cz/purecss")),
developers = Seq(
Developer("tzeman", "Tomas Zeman", "https://functionals.cz")
)
)
override def artifactName = "purecss"
override def scalacOptions = T{compilerOptions}
def hgId: Input[String] = T.input {
os.proc("hg", "id", "-i").call().out.text.trim
}
def hgNum: Input[String] = T.input {
os.proc("hg", "id", "-n").call().out.text.trim
}
private val maskedTags = Set("tip", "qtip", "qbase")
def hgTag: Input[Option[String]] = T.input {
os.proc("hg", "id", "-t").call().out.text.trim.split(' ').filterNot(v =>
maskedTags contains v).headOption
}
override def ivyDeps: Target[Loose.Agg[Dep]] = T{
if (scalaVersion() == V.scala211) Agg(D.scalatags211) else Agg(D.scalatags)
}
override def sources: Sources = T.sources{
super.sources() :+ PathRef(millSourcePath / 'shared / 'src / 'main / 'scala)
}
override def publishVersion: Input[String] = T.input{
val tv = hgTag() map(v => "-" + v.replace(".patch", "")) getOrElse ""
V.app.replace("SNAPSHOT", s"${hgNum()}-${hgId()}$tv")
}
}
class JvmModule(val crossScalaVersion: String) extends Common
class JsModule(val crossScalaVersion: String, crossJSVersion: String)
extends ScalaJSModule with Common {
override def scalaJSVersion: Target[String] = crossJSVersion
override def millSourcePath = super.millSourcePath / os.up
}
object jvm extends Cross[JvmModule](V.scala211, V.scala212, V.scala213)
object js extends Cross[JsModule](
V.scala211 -> V.scalaJs06,
V.scala212 -> V.scalaJs06,
V.scala212 -> V.scalaJs,
V.scala213 -> V.scalaJs06,
V.scala213 -> V.scalaJs
)
object extras extends Module {
val name = "pure-extras"
class JvmModule(val crossScalaVersion: String) extends Common {
override def artifactName = name
}
class JsModule(val crossScalaVersion: String, crossJSVersion: String)
extends ScalaJSModule with Common {
override def scalaJSVersion: Target[String] = crossJSVersion
override def millSourcePath = super.millSourcePath / os.up
override def artifactName = name
}
object jvm extends Cross[JvmModule](V.scala211, V.scala212, V.scala213)
object js extends Cross[JsModule](
V.scala211 -> V.scalaJs06,
V.scala212 -> V.scalaJs06,
V.scala212 -> V.scalaJs,
V.scala213 -> V.scalaJs06,
V.scala213 -> V.scalaJs
)
}
def compileAll(): Command[Unit] = T.command{
jvm(V.scala213).compile()
js(V.scala213, V.scalaJs).compile()
js(V.scala213, V.scalaJs06).compile()
jvm(V.scala212).compile()
js(V.scala212, V.scalaJs).compile()
js(V.scala212, V.scalaJs06).compile()
jvm(V.scala211).compile()
js(V.scala211, V.scalaJs06).compile()
extras.jvm(V.scala213).compile()
extras.js(V.scala213, V.scalaJs).compile()
extras.js(V.scala213, V.scalaJs06).compile()
extras.jvm(V.scala212).compile()
extras.js(V.scala212, V.scalaJs).compile()
extras.js(V.scala212, V.scalaJs06).compile()
extras.jvm(V.scala211).compile()
extras.js(V.scala211, V.scalaJs06).compile()
()
}
def publishLocal(): Command[Unit] = T.command{
jvm(V.scala213).publishLocal()()
js(V.scala213, V.scalaJs).publishLocal()()
js(V.scala213, V.scalaJs06).publishLocal()()
jvm(V.scala212).publishLocal()()
js(V.scala212, V.scalaJs).publishLocal()()
js(V.scala212, V.scalaJs06).publishLocal()()
jvm(V.scala211).publishLocal()()
js(V.scala211, V.scalaJs06).publishLocal()()
extras.jvm(V.scala213).publishLocal()()
extras.js(V.scala213, V.scalaJs).publishLocal()()
extras.js(V.scala213, V.scalaJs06).publishLocal()()
extras.jvm(V.scala212).publishLocal()()
extras.js(V.scala212, V.scalaJs).publishLocal()()
extras.js(V.scala212, V.scalaJs06).publishLocal()()
extras.jvm(V.scala211).publishLocal()()
extras.js(V.scala211, V.scalaJs06).publishLocal()()
}
def publishM2Local(p: os.Path): Command[Unit] = T.command{
jvm(V.scala213).publishM2Local(p.toString)()
js(V.scala213, V.scalaJs).publishM2Local(p.toString)()
js(V.scala213, V.scalaJs06).publishM2Local(p.toString)()
jvm(V.scala212).publishM2Local(p.toString)()
js(V.scala212, V.scalaJs).publishM2Local(p.toString)()
js(V.scala212, V.scalaJs06).publishM2Local(p.toString)()
jvm(V.scala211).publishM2Local(p.toString)()
js(V.scala211, V.scalaJs06).publishM2Local(p.toString)()
extras.jvm(V.scala213).publishM2Local(p.toString)()
extras.js(V.scala213, V.scalaJs).publishM2Local(p.toString)()
extras.js(V.scala213, V.scalaJs06).publishM2Local(p.toString)()
extras.jvm(V.scala212).publishM2Local(p.toString)()
extras.js(V.scala212, V.scalaJs).publishM2Local(p.toString)()
extras.js(V.scala212, V.scalaJs06).publishM2Local(p.toString)()
extras.jvm(V.scala211).publishM2Local(p.toString)()
extras.js(V.scala211, V.scalaJs06).publishM2Local(p.toString)()
()
}
object example extends ScalaModule {
override def scalaVersion: T[String] = V.scala213
override def scalacOptions = T{compilerOptions}
override def moduleDeps = Seq(jvm(V.scala213), extras.jvm(V.scala213))
override def ivyDeps = Agg(D.scalatex, D.oslib)
override def generatedSources: Target[Seq[PathRef]] = T{
val dir = T.ctx().dest
val src = sources() map(_.path)
val ids = src flatMap(ops.ls! _ filter(_.ext == "scalatex") map { p =>
val id = p.last replaceAllLiterally (".scalatex", "")
os.write(dir / s"$id.scala",
s"""
| package example
| import scalatags.Text.all._
| import scalatex._
| import purecss.Extras
| import purecss.text.PureCss._
| object `$id` {
| val id = "$id"
| val content = twf("${p.toString}")
| }
|
|/*
|${os.read(p)}
|*/
""".stripMargin)
id
})
os.write(dir / "initializer.scala",
s"""
| package example
| trait ContentInitializer {
| Seq(${ids mkString("`", "`, `", "`")})
| }
""".stripMargin)
os.write(dir / "main.scala",
s"""
| package example
| import os.Path
| object A extends ExampleApp with App {
| override def export: Path = Path("${exportDir().path}")
| }
""".stripMargin)
Seq(PathRef(dir))
}
override def mainClass: T[Option[String]] = Some("example.A")
def exportDir = T{
val dir = T.ctx().dest
PathRef(dir)
}
}
// vim: et ts=2 sw=2 syn=scala