From 6ae284b9b61558078e9003defc50966c3e41e45c Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Fri, 5 Feb 2021 09:47:22 +0100 Subject: Better ninja rules. --- .../io/trygvis/rules/engine/cli/NinjaCommand.java | 49 +++++++++++++++------- 1 file changed, 35 insertions(+), 14 deletions(-) (limited to 'src/ri-engine/src/main/java/io/trygvis/rules/engine/cli/NinjaCommand.java') diff --git a/src/ri-engine/src/main/java/io/trygvis/rules/engine/cli/NinjaCommand.java b/src/ri-engine/src/main/java/io/trygvis/rules/engine/cli/NinjaCommand.java index ef5ed1d..9e9d5f9 100644 --- a/src/ri-engine/src/main/java/io/trygvis/rules/engine/cli/NinjaCommand.java +++ b/src/ri-engine/src/main/java/io/trygvis/rules/engine/cli/NinjaCommand.java @@ -11,11 +11,11 @@ import java.io.FileWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.file.Path; -import java.util.List; import java.util.Objects; import java.util.concurrent.Callable; import java.util.stream.Collectors; +import static io.trygvis.rules.engine.cli.EngineFile.*; import static picocli.CommandLine.Command; @Command(name = "ninja") @@ -45,6 +45,23 @@ public class NinjaCommand implements Callable { dbDir = Path.of(f.dbDir); } + for (var job : f.jobs) { + if (job.outputs.isEmpty()) { + var output = new Output(); + output.name = job.name; + output.includes = job.outputIncludes; + job.outputIncludes = null; + + job.outputs.add(output); + } + } + + if (false) { + System.out.println("----------------------------------------------------"); + System.out.println(f); + System.out.println("----------------------------------------------------"); + } + var buf = new StringWriter(); var out = new PrintWriter(buf); @@ -69,25 +86,22 @@ public class NinjaCommand implements Callable { out.println(""); out.println("build engine.png: dot-to-png engine.dot"); out.println(""); - out.println("# Jobs"); + out.println("rule engine-run"); + out.println(" command=engine run $name $inputs $output_state $output_includes $generated_output $agenda_groups $modules"); + out.println(); + out.println("### Jobs"); for (var job : f.jobs) { out.println(""); - - out.println("rule %s".formatted(job.name)); - out.println(" command=engine run $name $inputs $output_state $output_includes $generated_output $agenda_groups $modules"); - out.println(); var dependencies = job.inputs.stream() .map(s -> dbDir.resolve(s + ".yaml").toString()) .collect(Collectors.joining(" ")); - var outputState = dbDir.resolve(job.name + ".yaml"); - - var generated = List.of(outputState).stream() - .map(Path::toString) + var generated = job.outputs.stream() + .map(output -> dbDir.resolve(output.name + ".yaml").toString()) .collect(Collectors.joining(" ")); - out.println("build %s: %s %s".formatted(generated, job.name, dependencies)); + out.println("build %s: engine-run %s".formatted(generated, dependencies)); out.println(" name=--name %s".formatted(job.name)); if (!job.inputs.isEmpty()) { @@ -98,9 +112,16 @@ public class NinjaCommand implements Callable { out.println(" inputs=$%s".formatted(is)); } - out.println(" output_state=--output-state %s".formatted(outputState)); - if (!job.outputIncludes.isEmpty()) { - var str = job.outputIncludes.stream() + if (job.outputs.size() != 1) { + System.err.println("Only one output supported for now."); + return 1; + } + + var output = job.outputs.get(0); + + out.println(" output_state=--output-state %s".formatted(dbDir.resolve(output.name + ".yaml"))); + if (!output.includes.isEmpty()) { + var str = output.includes.stream() .map(s -> "--output-include=" + s) .collect(Collectors.joining(" $\n ", "\n ", "")); -- cgit v1.2.3