Skip to content

Commit 6c88ff7

Browse files
WojciechMazurjchyb
andauthored
Add initial scala-native-p script (#7)
* Add scala-native-p, a NIR deserialization program It is based on the dumping feature of Scala Native, but slighly redesigned to allow directly passing regular files and printing to stdout instead of saving to a file. Because of that, it requires the Scala Native utils dependency. It features --help, --version and --classpath options. The last one allows to pass a classpath where the NIR files are meant to be found. If not passed, the files are looked for in cwd. * Update sbt build to use a default main class * Set main class in assembly * Use NIR classloader to read contents of the files * Add bash/batch scripts * Adjust standalone scripts to allow testing scala-native-p * Add mising blacnk lines in scripts * Run scalafmt Co-authored-by: Jan Chyb <[email protected]>
1 parent 63e8c04 commit 6c88ff7

File tree

9 files changed

+126
-2
lines changed

9 files changed

+126
-2
lines changed

build.sbt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ lazy val cli = project
2222
.enablePlugins(BuildInfoPlugin, ScriptedPlugin)
2323
.settings(
2424
name := "scala-native-cli",
25+
Compile / run / mainClass :=
26+
Some("scala.scalanative.cli.ScalaNativeCli"),
2527
scalacOptions += "-Ywarn-unused:imports",
2628
libraryDependencies ++= Seq(
2729
"org.scala-native" %% "tools" % scalaNativeVersion.value,
@@ -35,6 +37,7 @@ lazy val cli = project
3537
buildInfoPackage := "scala.scalanative.cli.options",
3638
cliAssemblyJarName := s"${normalizedName.value}-assembly_${scalaBinaryVersion.value}-${scalaNativeVersion.value}.jar",
3739
assembly / assemblyJarName := cliAssemblyJarName.value,
40+
assembly / mainClass := (Compile / run / mainClass).value,
3841
scriptedLaunchOpts ++= {
3942
val jarName = cliAssemblyJarName.value
4043
val cliPath = (Compile / crossTarget).value / jarName
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package scala.scalanative.cli
2+
3+
import caseapp.core.app.CaseApp
4+
import caseapp.core.RemainingArgs
5+
import java.nio.file.Paths
6+
import java.io.File
7+
import scala.scalanative.util.Scope
8+
import scala.scalanative.cli.options._
9+
import scala.scalanative.nir.Global
10+
import scala.scalanative.build.Config
11+
import scala.scalanative.linker.ClassLoader
12+
13+
object ScalaNativeP extends CaseApp[POptions] {
14+
15+
def run(options: POptions, args: RemainingArgs): Unit = {
16+
if (options.misc.version) {
17+
println(BuildInfo.nativeVersion)
18+
exit(0)
19+
}
20+
21+
if (args.all.isEmpty) {
22+
System.err.println("Required NIR file not specified.")
23+
exit(1)
24+
}
25+
26+
val (classpath, ignoredPaths) =
27+
options.classpath
28+
.flatMap(_.split(File.pathSeparator))
29+
.map(Paths.get(_))
30+
.partition(_.toFile().exists())
31+
ignoredPaths.foreach { path =>
32+
System.err.println(s"Ignoring non existing path: $path")
33+
}
34+
35+
Scope { implicit scope =>
36+
val classLoader =
37+
ClassLoader.fromDisk {
38+
Config.empty.withClassPath(classpath)
39+
}
40+
41+
for {
42+
fileName <- args.all
43+
} {
44+
classLoader.load(Global.Top(fileName)) match {
45+
case Some(defns) =>
46+
defns
47+
.sortBy(_.name.mangle)
48+
.foreach { d =>
49+
println(d.show)
50+
println()
51+
}
52+
case None => fail(s"Not found class/object with name `${fileName}`")
53+
}
54+
}
55+
}
56+
}
57+
58+
private def fail(msg: String): Nothing = {
59+
Console.err.println(msg)
60+
exit(1)
61+
}
62+
63+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package scala.scalanative.cli.options
2+
3+
import caseapp._
4+
5+
@ProgName("scala-native-p")
6+
@ArgsName("Class names")
7+
case class POptions(
8+
@HelpMessage("Specify where to find user class files")
9+
@ExtraName("cp")
10+
@ValueDescription("<path>")
11+
classpath: List[String] = "." :: Nil,
12+
@Recurse
13+
misc: MiscOptions
14+
)

cli/src/sbt-test/integration/standalone/Main.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,11 @@ object Main {
33
println("Hello world")
44
}
55
}
6+
7+
class Foo {
8+
def foo = Foo.foo
9+
}
10+
11+
object Foo {
12+
val foo = "bar"
13+
}

cli/src/sbt-test/integration/standalone/build.sbt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ val runExec = inputKey[Unit](
1414
)
1515

1616
runScript := {
17-
val scriptName +: args = spaceDelimited("<arg>").parsed.toSeq
17+
val scriptName +: rawArgs = spaceDelimited("<arg>").parsed.toSeq
1818
val cliPackDir = System.getProperty("scala-native-cli-pack")
1919
val isWindows = System
2020
.getProperty("os.name", "unknown")
@@ -48,6 +48,15 @@ runScript := {
4848
}(Set(scalaBinDir))
4949

5050
val script = Paths.get(cliPackDir, "bin", scriptName).toString
51+
val args = rawArgs.map {
52+
case "@NATIVE_LIB@" =>
53+
Paths
54+
.get(cliPackDir, "lib")
55+
.toFile()
56+
.listFiles()
57+
.mkString(File.pathSeparator)
58+
case arg => arg
59+
}
5160
val proc =
5261
if (isWindows)
5362
new ProcessBuilder(

cli/src/sbt-test/integration/standalone/test

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
> runScript scala-native-c Main.scala
22
$ exists Main$.nir
3+
$ exists Foo.nir
4+
$ exists Foo$.nir
5+
6+
> runScript scala-native-p Main$ Foo Foo$
7+
> runScript scala-native-p Main$ --cp . --classpath target --cp IgnoredNotExistingDir
8+
> runScript scala-native-p --cp @NATIVE_LIB@ java.lang.Runnable
9+
10+
-> runScript scala-native-p not.existing.Class
311

412
> runScript scala-native-ld --main Main . -o scala-native-out.exe -v -v
513
$ exists scala-native-out.exe

cli/src/script/scala-native-ld.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ set CLILIB=%BASE%\scala-native-cli-assembly_%SCALA_BIN_VER%-%SCALANATIVE_VER%.ja
1212
set PLUGIN=%BASE%\nscplugin_%SCALA_VER%-%SCALANATIVE_VER%.jar
1313
set NATIVELIB=%BASE%\nativelib%SUFFIX% %BASE%\clib%SUFFIX% %BASE%\posixlib%SUFFIX% %BASE%\windowslib%SUFFIX% %BASE%\auxlib%SUFFIX% %BASE%\javalib%SUFFIX% %BASE%\scalalib%SUFFIX%
1414

15-
scala -classpath %CLILIB% scala.scalanative.cli.ScalaNativeCli %* %NATIVELIB%
15+
scala -classpath %CLILIB% scala.scalanative.cli.ScalaNativeCli %* %NATIVELIB%

cli/src/script/scala-native-p

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#! /bin/sh
2+
3+
SCALA_BIN_VER="@SCALA_BIN_VER@"
4+
SCALANATIVE_VER="@SCALANATIVE_VER@"
5+
6+
BASE="$(dirname $0)/.."
7+
CLILIB="$BASE/lib/scala-native-cli-assembly_$SCALA_BIN_VER-$SCALANATIVE_VER.jar"
8+
9+
scala -classpath "$CLILIB" scala.scalanative.cli.ScalaNativeP "$@"

cli/src/script/scala-native-p.bat

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@ECHO OFF
2+
SetLocal
3+
4+
set SCALA_BIN_VER=@SCALA_BIN_VER@
5+
set SCALANATIVE_VER=@SCALANATIVE_VER@
6+
7+
set BASE=%~dp0\..\lib
8+
set CLILIB=%BASE%\scala-native-cli-assembly_%SCALA_BIN_VER%-%SCALANATIVE_VER%.jar
9+
10+
scala -classpath %CLILIB% scala.scalanative.cli.ScalaNativeP %*

0 commit comments

Comments
 (0)