summaryrefslogtreecommitdiff
path: root/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala')
-rw-r--r--contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala81
1 files changed, 73 insertions, 8 deletions
diff --git a/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala b/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala
index 64f7b386..0db3b7dc 100644
--- a/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala
+++ b/contrib/bloop/src/mill.contrib.bloop/BloopImpl.scala
@@ -7,7 +7,11 @@ import mill._
import mill.api.Loose
import mill.define.{Module => MillModule, _}
import mill.eval.Evaluator
+import mill.scalajslib.ScalaJSModule
+import mill.scalajslib.api.ModuleKind
import mill.scalalib._
+import mill.scalanativelib.ScalaNativeModule
+import mill.scalanativelib.api.ReleaseMode
import os.pwd
/**
@@ -46,6 +50,12 @@ class BloopImpl(ev: () => Evaluator, wd: Path) extends ExternalModule { outer =>
*/
trait Module extends MillModule with CirceCompat { self: JavaModule =>
+ /**
+ * Allows to tell Bloop whether it should use "fullOptJs" or
+ * "fastOptJs" when compiling. Used exclusively with ScalaJsModules.
+ */
+ def linkerMode: T[Option[BloopConfig.LinkerMode]] = None
+
object bloop extends MillModule {
def config = T {
new BloopOps(self).bloop.config()
@@ -82,6 +92,11 @@ class BloopImpl(ev: () => Evaluator, wd: Path) extends ExternalModule { outer =>
Task.traverse(jm.transitiveModuleDeps)(_.bloop.writeConfig)
}
}
+
+ def asBloop: Option[Module] = jm match {
+ case m: Module => Some(m)
+ case _ => None
+ }
}
private def computeModules: Seq[JavaModule] = {
@@ -193,14 +208,63 @@ class BloopImpl(ev: () => Evaluator, wd: Path) extends ExternalModule { outer =>
// Platform (Jvm/Js/Native)
////////////////////////////////////////////////////////////////////////////
- val platform = T.task {
- BloopConfig.Platform.Jvm(
- BloopConfig.JvmConfig(
- home = T.ctx().env.get("JAVA_HOME").map(s => Path(s).toNIO),
- options = module.forkArgs().toList
- ),
- mainClass = module.mainClass()
- )
+ def jsLinkerMode(m: JavaModule): Task[Config.LinkerMode] =
+ (m.asBloop match {
+ case Some(bm) => T.task(bm.linkerMode())
+ case None => T.task(None)
+ }).map(_.getOrElse(Config.LinkerMode.Debug))
+
+ val platform: Task[BloopConfig.Platform] = module match {
+ case m: ScalaJSModule =>
+ T.task {
+ BloopConfig.Platform.Js(
+ BloopConfig.JsConfig.empty.copy(
+ version = m.scalaJSVersion(),
+ mode = jsLinkerMode(m)(),
+ kind = m.moduleKind() match {
+ case ModuleKind.NoModule => Config.ModuleKindJS.NoModule
+ case ModuleKind.CommonJSModule =>
+ Config.ModuleKindJS.CommonJSModule
+ },
+ emitSourceMaps = m.nodeJSConfig().sourceMap,
+ jsdom = Some(false),
+ ),
+ mainClass = module.mainClass()
+ )
+ }
+ case m: ScalaNativeModule =>
+ T.task {
+ BloopConfig.Platform.Native(
+ BloopConfig.NativeConfig.empty.copy(
+ version = m.scalaNativeVersion(),
+ mode = m.releaseMode() match {
+ case ReleaseMode.Debug => BloopConfig.LinkerMode.Debug
+ case ReleaseMode.Release => BloopConfig.LinkerMode.Release
+ },
+ gc = m.nativeGC(),
+ targetTriple = m.nativeTarget(),
+ nativelib = m.nativeLibJar().path.toNIO,
+ clang = m.nativeClang().toNIO,
+ clangpp = m.nativeClangPP().toNIO,
+ options = Config.NativeOptions(
+ m.nativeLinkingOptions().toList,
+ m.nativeCompileOptions().toList
+ ),
+ linkStubs = m.nativeLinkStubs(),
+ ),
+ mainClass = module.mainClass()
+ )
+ }
+ case _ =>
+ T.task {
+ BloopConfig.Platform.Jvm(
+ BloopConfig.JvmConfig(
+ home = T.ctx().env.get("JAVA_HOME").map(s => Path(s).toNIO),
+ options = module.forkArgs().toList
+ ),
+ mainClass = module.mainClass()
+ )
+ }
}
////////////////////////////////////////////////////////////////////////////
@@ -241,6 +305,7 @@ class BloopImpl(ev: () => Evaluator, wd: Path) extends ExternalModule { outer =>
*/
def artifacts(repos: Seq[coursier.Repository],
deps: Seq[coursier.Dependency]): List[BloopConfig.Module] = {
+
import coursier._
import coursier.util._