diff --git a/.github/workflows/graal.yml b/.github/workflows/graal.yml index 57791f2..8a670fb 100644 --- a/.github/workflows/graal.yml +++ b/.github/workflows/graal.yml @@ -20,6 +20,11 @@ jobs: with: name: pork-linux-amd64 path: tool/build/native/nativeCompile/pork + - name: Archive Pork Runtime Executable + uses: actions/upload-artifact@v3 + with: + name: pork-rt-linux-amd64 + path: minimal/build/native/nativeCompile/pork-rt darwin-amd64: runs-on: macos-latest steps: @@ -39,6 +44,11 @@ jobs: with: name: pork-darwin-amd64 path: tool/build/native/nativeCompile/pork + - name: Archive Pork Runtime Executable + uses: actions/upload-artifact@v3 + with: + name: pork-rt-darwin-amd64 + path: minimal/build/native/nativeCompile/pork-rt windows-amd64: runs-on: windows-latest steps: @@ -58,3 +68,8 @@ jobs: with: name: pork-windows-amd64 path: tool/build/native/nativeCompile/pork.exe + - name: Archive Pork Runtime Executable + uses: actions/upload-artifact@v3 + with: + name: pork-rt-windows-amd64 + path: minimal/build/native/nativeCompile/pork-rt.exe diff --git a/minimal/build.gradle.kts b/minimal/build.gradle.kts new file mode 100644 index 0000000..350b87a --- /dev/null +++ b/minimal/build.gradle.kts @@ -0,0 +1,49 @@ +plugins { + application + id("gay.pizza.pork.module") + id("com.github.johnrengelman.shadow") version "8.1.1" + id("org.graalvm.buildtools.native") version "0.9.25" +} + +dependencies { + api(project(":ast")) + api(project(":parser")) + api(project(":frontend")) + api(project(":evaluator")) + api(project(":stdlib")) + api(project(":ffi")) + implementation(project(":common")) +} + +application { + applicationName = "pork-rt" + mainClass.set("gay.pizza.pork.minimal.MainKt") +} + +for (task in arrayOf(tasks.shadowDistTar, tasks.shadowDistZip, tasks.shadowJar)) { + val suffix = when { + task == tasks.shadowJar -> "" + task.name.startsWith("shadow") -> "-shadow" + else -> "" + } + task.get().archiveBaseName.set("pork-rt${suffix}") +} + +graalvmNative { + binaries { + named("main") { + imageName.set("pork-rt") + mainClass.set("gay.pizza.pork.minimal.MainKt") + sharedLibrary.set(false) + buildArgs("-march=compatibility") + resources { + includedPatterns.addAll(listOf( + ".*/*.pork$", + ".*/*.manifest$" + )) + } + } + } +} + +tasks.run.get().outputs.upToDateWhen { false } diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/FileTool.kt b/minimal/src/main/kotlin/gay/pizza/pork/minimal/FileTool.kt similarity index 94% rename from tool/src/main/kotlin/gay/pizza/pork/tool/FileTool.kt rename to minimal/src/main/kotlin/gay/pizza/pork/minimal/FileTool.kt index 8db9942..70fd898 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/FileTool.kt +++ b/minimal/src/main/kotlin/gay/pizza/pork/minimal/FileTool.kt @@ -1,4 +1,4 @@ -package gay.pizza.pork.tool +package gay.pizza.pork.minimal import gay.pizza.dough.fs.FsPath import gay.pizza.dough.fs.readString diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/Tool.kt b/minimal/src/main/kotlin/gay/pizza/pork/minimal/Tool.kt similarity index 77% rename from tool/src/main/kotlin/gay/pizza/pork/tool/Tool.kt rename to minimal/src/main/kotlin/gay/pizza/pork/minimal/Tool.kt index 2407525..88eeab0 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/Tool.kt +++ b/minimal/src/main/kotlin/gay/pizza/pork/minimal/Tool.kt @@ -1,13 +1,12 @@ -package gay.pizza.pork.tool +package gay.pizza.pork.minimal import gay.pizza.pork.ast.CompilationUnit import gay.pizza.pork.ast.NodeVisitor import gay.pizza.pork.ast.visit -import gay.pizza.pork.evaluator.CallableFunction -import gay.pizza.pork.evaluator.Evaluator -import gay.pizza.pork.evaluator.InternalNativeProvider -import gay.pizza.pork.evaluator.Scope +import gay.pizza.pork.evaluator.* import gay.pizza.pork.ffi.JavaAutogenContentSource +import gay.pizza.pork.ffi.JavaNativeProvider +import gay.pizza.pork.ffi.JnaNativeProvider import gay.pizza.pork.frontend.ContentSource import gay.pizza.pork.frontend.ImportLocator import gay.pizza.pork.frontend.DynamicImportSource @@ -45,4 +44,13 @@ abstract class Tool { val resultingScope = evaluator.evaluate(ImportLocator("local", rootFilePath())) return resultingScope.value("main") as CallableFunction } + + fun run(scope: Scope, quiet: Boolean = false) { + val main = loadMainFunction(scope, setupEvaluator = { + addNativeProvider("internal", InternalNativeProvider(quiet = quiet)) + addNativeProvider("ffi", JnaNativeProvider()) + addNativeProvider("java", JavaNativeProvider()) + }) + main.call(Arguments(emptyList())) + } } diff --git a/minimal/src/main/kotlin/gay/pizza/pork/minimal/main.kt b/minimal/src/main/kotlin/gay/pizza/pork/minimal/main.kt new file mode 100644 index 0000000..4b1124b --- /dev/null +++ b/minimal/src/main/kotlin/gay/pizza/pork/minimal/main.kt @@ -0,0 +1,16 @@ +package gay.pizza.pork.minimal + +import gay.pizza.dough.fs.PlatformFsProvider +import gay.pizza.pork.evaluator.Scope +import kotlin.system.exitProcess + +fun main(args: Array) { + if (args.size != 1) { + System.err.println("Usage: pork-rt ") + exitProcess(1) + } + val path = PlatformFsProvider.resolve(args[0]) + val tool = FileTool(path) + val scope = Scope() + tool.run(scope) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index bf388b3..5d5b50f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,5 +11,6 @@ include( ":stdlib", ":ffi", ":tool", + ":minimal", ":support:pork-idea" ) diff --git a/tool/build.gradle.kts b/tool/build.gradle.kts index 3fecbd9..6c7c56e 100644 --- a/tool/build.gradle.kts +++ b/tool/build.gradle.kts @@ -6,14 +6,8 @@ plugins { } dependencies { - api(project(":ast")) - api(project(":parser")) - api(project(":frontend")) - api(project(":evaluator")) - api(project(":stdlib")) - api(project(":ffi")) + api(project(":minimal")) api("com.github.ajalt.clikt:clikt:4.2.0") - implementation(project(":common")) } application { diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/AstCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/AstCommand.kt index e43f025..1b547ae 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/AstCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/AstCommand.kt @@ -4,6 +4,7 @@ import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.arguments.argument import gay.pizza.dough.fs.PlatformFsProvider import gay.pizza.pork.ast.Node +import gay.pizza.pork.minimal.FileTool import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/AttributeCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/AttributeCommand.kt index 440830a..8502f3e 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/AttributeCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/AttributeCommand.kt @@ -5,6 +5,7 @@ import com.github.ajalt.clikt.parameters.arguments.argument import gay.pizza.dough.fs.PlatformFsProvider import gay.pizza.pork.ast.NodeCoalescer import gay.pizza.pork.ast.visit +import gay.pizza.pork.minimal.FileTool import gay.pizza.pork.parser.TokenNodeAttribution class AttributeCommand : CliktCommand(help = "Attribute AST", name = "attribute") { diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/HighlightCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/HighlightCommand.kt index 5384893..97754a9 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/HighlightCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/HighlightCommand.kt @@ -3,6 +3,7 @@ package gay.pizza.pork.tool import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.arguments.argument import gay.pizza.dough.fs.PlatformFsProvider +import gay.pizza.pork.minimal.FileTool import gay.pizza.pork.parser.AnsiHighlightScheme class HighlightCommand : CliktCommand(help = "Syntax Highlighter", name = "highlight") { diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/ParseCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/ParseCommand.kt index 32d8296..ef4d6d3 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/ParseCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/ParseCommand.kt @@ -5,6 +5,7 @@ import com.github.ajalt.clikt.parameters.arguments.argument import com.github.ajalt.clikt.parameters.options.flag import com.github.ajalt.clikt.parameters.options.option import gay.pizza.dough.fs.PlatformFsProvider +import gay.pizza.pork.minimal.FileTool class ParseCommand : CliktCommand(help = "Parse Compilation Unit", name = "parse") { val loop by option("--loop", help = "Loop Parsing").flag() diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/ReprintCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/ReprintCommand.kt index 7ccb9a3..3e831da 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/ReprintCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/ReprintCommand.kt @@ -3,6 +3,7 @@ package gay.pizza.pork.tool import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.arguments.argument import gay.pizza.dough.fs.PlatformFsProvider +import gay.pizza.pork.minimal.FileTool class ReprintCommand : CliktCommand(help = "Reprint Parsed Compilation Unit", name = "reprint") { val path by argument("file") diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt index 5806388..49c4554 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/RunCommand.kt @@ -8,6 +8,7 @@ import gay.pizza.dough.fs.PlatformFsProvider import gay.pizza.pork.evaluator.* import gay.pizza.pork.ffi.JavaNativeProvider import gay.pizza.pork.ffi.JnaNativeProvider +import gay.pizza.pork.minimal.FileTool class RunCommand : CliktCommand(help = "Run Program", name = "run") { val loop by option("--loop", help = "Loop Program").flag() diff --git a/tool/src/main/kotlin/gay/pizza/pork/tool/TokenizeCommand.kt b/tool/src/main/kotlin/gay/pizza/pork/tool/TokenizeCommand.kt index 888282b..ffecc0e 100644 --- a/tool/src/main/kotlin/gay/pizza/pork/tool/TokenizeCommand.kt +++ b/tool/src/main/kotlin/gay/pizza/pork/tool/TokenizeCommand.kt @@ -3,6 +3,7 @@ package gay.pizza.pork.tool import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.parameters.arguments.argument import gay.pizza.dough.fs.PlatformFsProvider +import gay.pizza.pork.minimal.FileTool class TokenizeCommand : CliktCommand(help = "Tokenize Compilation Unit", name = "tokenize") { val path by argument("file")