build.sc
changeset 28 fe846f058e41
parent 27 f30a3e465836
--- a/build.sc	Sat Dec 26 21:46:29 2020 +0100
+++ b/build.sc	Sun Dec 27 22:54:33 2020 +0100
@@ -8,6 +8,7 @@
  * ./mill mill.scalalib.GenIdea/idea
  *
  */
+import ammonite.ops
 import mill._
 import mill.api.Loose
 import mill.define.{Command, Input, Sources, Target}
@@ -28,8 +29,24 @@
 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(
@@ -46,19 +63,7 @@
 
   override def artifactName = "purecss" 
 
-  override def scalacOptions = T{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"
-  )}
+  override def scalacOptions = T{compilerOptions}
 
   def hgId: Input[String] = T.input {
     os.proc("hg", "id", "-i").call().out.text.trim
@@ -106,6 +111,35 @@
   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()
@@ -115,6 +149,14 @@
   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()
   ()
 }
 
@@ -127,6 +169,14 @@
   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{
@@ -138,28 +188,77 @@
   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 extras extends Module {
+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)
 
-  class JvmModule(val crossScalaVersion: String) extends Common
-  class JsModule(val crossScalaVersion: String, crossJSVersion: String)
-    extends ScalaJSModule with Common {
+  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
+    })
 
-    override def scalaJSVersion: Target[String] = crossJSVersion
+    os.write(dir / "initializer.scala",
+      s"""
+         | package example
+         | trait ContentInitializer {
+         |   Seq(${ids mkString("`", "`, `", "`")})
+         | }
+      """.stripMargin)
 
-    override def millSourcePath = super.millSourcePath / os.up
+    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))
   }
 
-  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
-  )
+  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