diff options
Diffstat (limited to 'scalanativelib/src/ScalaNativeWorkerApi.scala')
-rw-r--r-- | scalanativelib/src/ScalaNativeWorkerApi.scala | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/scalanativelib/src/ScalaNativeWorkerApi.scala b/scalanativelib/src/ScalaNativeWorkerApi.scala new file mode 100644 index 00000000..80325f1e --- /dev/null +++ b/scalanativelib/src/ScalaNativeWorkerApi.scala @@ -0,0 +1,44 @@ +package mill.scalanativelib + +import java.io.File +import java.net.URLClassLoader + +import mill.define.{Discover, Worker} +import mill.{Agg, T} +import mill.scalanativelib.api._ + + +class ScalaNativeWorker { + private var scalaInstanceCache = Option.empty[(Long, ScalaNativeWorkerApi)] + + def impl(toolsClasspath: Agg[os.Path]): ScalaNativeWorkerApi = { + val classloaderSig = toolsClasspath.map(p => p.toString().hashCode + os.mtime(p)).sum + scalaInstanceCache match { + case Some((sig, bridge)) if sig == classloaderSig => bridge + case _ => + val cl = new URLClassLoader( + toolsClasspath.map(_.toIO.toURI.toURL).toArray, + getClass.getClassLoader + ) + try { + val bridge = cl + .loadClass("mill.scalanativelib.worker.ScalaNativeWorkerImpl") + .getDeclaredConstructor() + .newInstance() + .asInstanceOf[ScalaNativeWorkerApi] + scalaInstanceCache = Some((classloaderSig, bridge)) + bridge + } + catch { + case e: Exception => + e.printStackTrace() + throw e + } + } + } +} + +object ScalaNativeWorkerApi extends mill.define.ExternalModule { + def scalaNativeWorker: Worker[ScalaNativeWorker] = T.worker { new ScalaNativeWorker() } + lazy val millDiscover = Discover[this.type] +} |