diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-18 12:15:46 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-18 12:15:46 +0100 |
| commit | 9e08a99b327c7d704f533e3535b77a1bbdc04919 (patch) | |
| tree | be0fc9ced28cfec9f14b315e80f5c5fb7d6d45c5 /src/main/java/org | |
| parent | 0272455c8bb06d5c63220172b2888510aeb7f40b (diff) | |
Run examples automatically
Diffstat (limited to 'src/main/java/org')
5 files changed, 69 insertions, 13 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java index c2cf941d..c1ff0c95 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -4,6 +4,7 @@ import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializer; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule; import org.shedlang.compiler.config.ProjectConfig; +import org.shedlang.compiler.filesystem.ShedCompilerFiles; import org.shedlang.compiler.stackir.instructions.Instruction; import org.shedlang.compiler.typechecker.TypeInfo; import org.shedlang.compiler.types.NamespaceName; @@ -36,24 +37,25 @@ public class LlvmBackend implements Backend { objectFilePaths.add(objectPath); } - var mainModule = LlvmCompiler.compileMain(config.main(), typeInfo); - var objectPath = compileLlvmModule(mainModule, config.targetDir(), "main"); - objectFilePaths.add(objectPath); + for (var bin : config.bins()) { + var mainModule = LlvmCompiler.compileMain(config.main(), typeInfo); + var objectPath = compileLlvmModule(mainModule, config.targetDir().resolve("bins"), bin.name()); + objectFilePaths.add(objectPath); - var gccArgs = new ArrayList<String>(); - gccArgs.add("gcc"); + var gccArgs = new ArrayList<String>(); + gccArgs.add("gcc"); - gccArgs.add("-o"); - gccArgs.add(config.targetDir().resolve("main").toString()); + gccArgs.add("-o"); + gccArgs.add(config.targetDir().resolve(bin.name()).toString()); - for (var objectFilePath : objectFilePaths) { - gccArgs.add(objectFilePath.toString()); - } + for (var objectFilePath : objectFilePaths) { + gccArgs.add(objectFilePath.toString()); + } - // TODO: don't assume we're in the project root - gccArgs.add("runtime/build/libshed.a"); + gccArgs.add(ShedCompilerFiles.getRoot().resolve("runtime/build/libshed.a").toString()); - run(gccArgs); + run(gccArgs); + } } private static Path compileLlvmModule( diff --git a/src/main/java/org/shedlang/compiler/config/BinConfig.java b/src/main/java/org/shedlang/compiler/config/BinConfig.java new file mode 100644 index 00000000..c3e70f2d --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/BinConfig.java @@ -0,0 +1,11 @@ +package org.shedlang.compiler.config; + +import org.tomlj.TomlTable; + +public record BinConfig(String name) { + public static BinConfig fromToml(TomlTable table) { + var name = table.getString("name"); + + return new BinConfig(name); + } +} diff --git a/src/main/java/org/shedlang/compiler/config/ExampleConfig.java b/src/main/java/org/shedlang/compiler/config/ExampleConfig.java new file mode 100644 index 00000000..46ca462d --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/ExampleConfig.java @@ -0,0 +1,12 @@ +package org.shedlang.compiler.config; + +import org.tomlj.TomlTable; + +public record ExampleConfig(String bin, String expectedOutput) { + public static ExampleConfig fromToml(TomlTable table) { + return new ExampleConfig( + table.getString("bin"), + table.getString("expected-output") + ); + } +} diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java index 1db4b87d..1d6a9a9f 100644 --- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java +++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java @@ -7,6 +7,8 @@ import org.tomlj.TomlTable; import java.io.IOException; import java.nio.file.Path; import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; public class ProjectConfig { public static ProjectConfig read(Path projectPath) throws IOException { @@ -36,4 +38,20 @@ public class ProjectConfig { public Path targetDir() { return root.resolve("target"); } + + public List<BinConfig> bins() { + var binsArray = config.getArray(List.of("shed", "bins")); + + return IntStream.range(0, binsArray.size()) + .mapToObj(binIndex -> BinConfig.fromToml(binsArray.getTable(binIndex))) + .toList(); + } + + public List<ExampleConfig> examples() { + var examplesArray = config.getArray(List.of("shed", "examples")); + + return IntStream.range(0, examplesArray.size()) + .mapToObj(exampleIndex -> ExampleConfig.fromToml(examplesArray.getTable(exampleIndex))) + .toList(); + } } diff --git a/src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java b/src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java new file mode 100644 index 00000000..62e61567 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/filesystem/ShedCompilerFiles.java @@ -0,0 +1,13 @@ +package org.shedlang.compiler.filesystem; + +import java.nio.file.Path; + +public class ShedCompilerFiles { + private ShedCompilerFiles() { + } + + public static Path getRoot() { + // TODO: don't assume we're in the project root + return Path.of("."); + } +} |
