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)
}
}
|