diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-12-12 16:56:02 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-12 16:56:02 -0800 |
commit | 9ba4cb69331386dfde9bac69dc2d5b22401face3 (patch) | |
tree | 120349e8015ae5717d36bd44209cde6ff9543518 /scalanativelib/src/ScalaNativeWorkerApi.scala | |
parent | ea7fceb6e56f53bde3517586dfc57e10a605a524 (diff) | |
download | mill-9ba4cb69331386dfde9bac69dc2d5b22401face3.tar.gz mill-9ba4cb69331386dfde9bac69dc2d5b22401face3.tar.bz2 mill-9ba4cb69331386dfde9bac69dc2d5b22401face3.zip |
collapse boilerplate folder structure within src/ folders (#505)
* collapse boilerplate folder structure within src/ folders
* .
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] +} |