summaryrefslogtreecommitdiff
path: root/scalanativelib/src/ScalaNativeWorkerApi.scala
diff options
context:
space:
mode:
Diffstat (limited to 'scalanativelib/src/ScalaNativeWorkerApi.scala')
-rw-r--r--scalanativelib/src/ScalaNativeWorkerApi.scala44
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]
+}