summaryrefslogtreecommitdiff
path: root/scalanativelib/worker/0.3/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala
blob: b32e84ffde97af859b88c3da0088eeb06d9e0e6a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package mill.scalanativelib.worker

import java.io.File
import java.lang.System.{err, out}

import scala.scalanative.build.{Build, Config, Discover, GC, Logger, Mode}
import mill.scalanativelib.api.{NativeConfig, NativeLogLevel, ReleaseMode}
import sbt.testing.Framework

import scala.scalanative.testinterface.ScalaNativeFramework


class ScalaNativeWorkerImpl extends mill.scalanativelib.api.ScalaNativeWorkerApi {
  def logger(level: NativeLogLevel) =
    Logger(
      debugFn = msg => if (level >= NativeLogLevel.Debug) out.println(msg),
      infoFn  = msg => if (level >= NativeLogLevel.Info)  out.println(msg),
      warnFn  = msg => if (level >= NativeLogLevel.Warn)  out.println(msg),
      errorFn = msg => if (level >= NativeLogLevel.Error) err.println(msg))

  def discoverClang: os.Path = os.Path(Discover.clang())
  def discoverClangPP: os.Path = os.Path(Discover.clangpp())
  def discoverTarget(clang: os.Path, workdir: os.Path): String = Discover.targetTriple(clang.toNIO, workdir.toNIO)
  def discoverCompileOptions: Seq[String] = Discover.compileOptions()
  def discoverLinkingOptions: Seq[String] = Discover.linkingOptions()
  def defaultGarbageCollector: String = GC.default.name

  def config(nativeLibJar: os.Path,
             mainClass: String,
             classpath: Seq[os.Path],
             nativeWorkdir: os.Path,
             nativeClang: os.Path,
             nativeClangPP: os.Path,
             nativeTarget: String,
             nativeCompileOptions: Seq[String],
             nativeLinkingOptions: Seq[String],
             nativeGC: String,
             nativeLinkStubs: Boolean,
             releaseMode: ReleaseMode,
             logLevel: NativeLogLevel): NativeConfig =
    {
      val entry = mainClass + "$"

      val config =
        Config.empty
          .withNativelib(nativeLibJar.toNIO)
          .withMainClass(entry)
          .withClassPath(classpath.map(_.toNIO))
          .withWorkdir(nativeWorkdir.toNIO)
          .withClang(nativeClang.toNIO)
          .withClangPP(nativeClangPP.toNIO)
          .withTargetTriple(nativeTarget)
          .withCompileOptions(nativeCompileOptions)
          .withLinkingOptions(nativeLinkingOptions)
          .withGC(GC(nativeGC))
          .withLinkStubs(nativeLinkStubs)
          .withMode(Mode(releaseMode.name))
          .withLogger(logger(logLevel))
      NativeConfig(config)
    }

  def nativeLink(nativeConfig: NativeConfig, outPath: os.Path): os.Path = {
    val config = nativeConfig.config.asInstanceOf[Config]
    Build.build(config, outPath.toNIO)
    outPath
  }

  override def newScalaNativeFrameWork(framework: Framework, id: Int, testBinary: File,
                                       logLevel: NativeLogLevel, envVars: Map[String, String]): Framework =
  {
    new ScalaNativeFramework(framework, id, logger(logLevel), testBinary, envVars)
  }
}