diff --git a/Makefile b/Makefile index 26000dc..c667e80 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ JARNAME = bakefile.jar CLASSP = ./build MANIFESTPATH = Manifest.MF SOURCEDIR = ./src/ +TESTDIR = ./tests/ SOURCES := $(shell find $(SOURCEDIR) -name '*.java') @@ -14,21 +15,17 @@ all: @make clean @make compile @make jar - @make run compile: @echo "Compiling..." javac -cp $(CLASSP) -d $(BUILDDIR) $(SOURCES) -Xlint:unchecked -Xlint:deprecation @echo "Done." -run: - @echo "Running..." - java -cp $(CLASSP):$(JARNAME) fr.monlouyan.bakefile.Main - @echo "Done." - clean: @echo "Cleaning up..." @rm -rf $(BUILDDIR)* $(DOCDIR)* + @rm -f $(JARNAME) + @find $(TESTDIR) -name "$(JARNAME)" -delete @echo "Done." javadoc: @@ -39,4 +36,10 @@ javadoc: jar: @echo "Creating jar..." @jar cfm $(JARNAME) $(MANIFESTPATH) -C $(BUILDDIR) fr/monlouyan/bakefile + @echo "Done." + @make deploy-tests + +deploy-tests: + @echo "Deploying JAR to test directories..." + @find $(TESTDIR) -type d -exec cp $(JARNAME) {} \; @echo "Done." \ No newline at end of file diff --git a/src/fr/monlouyan/bakefile/BakeEngine.java b/src/fr/monlouyan/bakefile/BakeEngine.java index dc3b1ca..7751a62 100644 --- a/src/fr/monlouyan/bakefile/BakeEngine.java +++ b/src/fr/monlouyan/bakefile/BakeEngine.java @@ -12,7 +12,7 @@ public class BakeEngine { public BakeEngine(BakeCLI cli) { this.cli = cli; this.parser = new BakefileParser("Bakefile"); - this.resolver = new DependencyResolver(); + this.resolver = new DependencyResolver(cli.isDebug()); this.executor = new CommandExecutor(cli.isDebug()); } diff --git a/src/fr/monlouyan/bakefile/BakefileParser.java b/src/fr/monlouyan/bakefile/BakefileParser.java index ab8a228..07cae52 100644 --- a/src/fr/monlouyan/bakefile/BakefileParser.java +++ b/src/fr/monlouyan/bakefile/BakefileParser.java @@ -3,39 +3,71 @@ package fr.monlouyan.bakefile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class BakefileParser { private String filename; + /** + * Regex pour détecter les targets et leurs dépendances. + * Format : "nom : dépendance1 dépendance2" + */ + private static final Pattern TARGET_PATTERN = Pattern.compile("^(\\S+)\\s*:\\s*(.*)$"); + + /** + * Regex pour détecter les lignes de commande associées à une target. + * Format : " gcc -o program program.c" (ligne indentée) + */ + private static final Pattern COMMAND_PATTERN = Pattern.compile("^\\s+(.+)$"); + public BakefileParser(String filename) { this.filename = filename; } - + public List<Target> parse() { List<Target> targets = new ArrayList<>(); if (!Files.exists(Paths.get(filename))) { System.out.println("*** No targets specified and no makefile found. Stop."); System.exit(1); } - + try { List<String> lines = Files.readAllLines(Paths.get(filename)); + String currentTarget = null; + List<String> dependencies = new ArrayList<>(); + List<String> commands = new ArrayList<>(); + for (String line : lines) { - if (line.contains(":")) { - String[] parts = line.split(":"); - String name = parts[0].trim(); - String[] deps = parts[1].trim().split(" "); - System.out.println("Target found: " + name + " with dependencies " + Arrays.toString(deps)); - targets.add(new Target(name, Arrays.asList(deps), "gcc -o " + name + " " + name + ".c")); + Matcher targetMatcher = TARGET_PATTERN.matcher(line); + Matcher commandMatcher = COMMAND_PATTERN.matcher(line); + + if (targetMatcher.matches()) { + // Sauvegarde de la précédente target si elle existe + if (currentTarget != null) { + targets.add(new Target(currentTarget, dependencies, String.join(" && ", commands))); + } + + // Nouvelle target détectée + currentTarget = targetMatcher.group(1); + dependencies = new ArrayList<>(Arrays.asList(targetMatcher.group(2).trim().split("\\s+"))); + commands = new ArrayList<>(); + + } else if (commandMatcher.matches()) { + // Ligne de commande associée à la dernière target trouvée + commands.add(commandMatcher.group(1)); } } + + // Ajout de la dernière target après la boucle + if (currentTarget != null) { + targets.add(new Target(currentTarget, dependencies, String.join(" && ", commands))); + } + } catch (IOException e) { e.printStackTrace(); } return targets; - } - -} \ No newline at end of file + } +} diff --git a/src/fr/monlouyan/bakefile/CommandExecutor.java b/src/fr/monlouyan/bakefile/CommandExecutor.java index 5341282..dd37dfc 100644 --- a/src/fr/monlouyan/bakefile/CommandExecutor.java +++ b/src/fr/monlouyan/bakefile/CommandExecutor.java @@ -10,9 +10,12 @@ public class CommandExecutor { } public void execute(Target target) { - if (!target.needsUpdate()) return; + if (!target.needsUpdate()){ + System.out.println("bake: '" + target.getName() + "' is up to date."); + return; + }; try { - System.out.println("Executing: " + target.getCommand()); + System.out.println(target.getCommand()); ProcessBuilder pb = new ProcessBuilder("sh", "-c", target.getCommand()); Process process = pb.start(); int exitCode = process.waitFor(); diff --git a/src/fr/monlouyan/bakefile/DependencyResolver.java b/src/fr/monlouyan/bakefile/DependencyResolver.java index 2dfd0ab..133d492 100644 --- a/src/fr/monlouyan/bakefile/DependencyResolver.java +++ b/src/fr/monlouyan/bakefile/DependencyResolver.java @@ -4,10 +4,19 @@ import java.util.ArrayList; import java.util.List; public class DependencyResolver { + private boolean debug; + + public DependencyResolver(boolean debug) { + this.debug = debug; + } + public List<Target> resolve(List<Target> allTargets, List<String> requestedTargets) { List<Target> targetsToBuild = new ArrayList<>(); for (Target target : allTargets) { if (requestedTargets.isEmpty() || requestedTargets.contains(target.getName())) { + if (debug){ + System.out.println("Target " + target.getName() + " is requested"); + } targetsToBuild.add(target); } } diff --git a/src/fr/monlouyan/bakefile/Main.java b/src/fr/monlouyan/bakefile/Main.java index 8e571f7..9bc4c09 100755 --- a/src/fr/monlouyan/bakefile/Main.java +++ b/src/fr/monlouyan/bakefile/Main.java @@ -16,7 +16,6 @@ public class Main{ * @return void */ public static void main(String[] args){ - System.out.println("Bakefile v1.0"); BakeCLI cli = new BakeCLI(args); BakeEngine engine = new BakeEngine(cli); engine.run(); diff --git a/tests/test-02-existe-deja/Bakefile b/tests/test-02-existe-deja/Bakefile index 4e0e544..d698de6 100644 --- a/tests/test-02-existe-deja/Bakefile +++ b/tests/test-02-existe-deja/Bakefile @@ -1,2 +1,2 @@ main: main.c - gcc -o main main.c \ No newline at end of file + gcc -o main main.c diff --git a/tests/test-02-existe-deja/main b/tests/test-02-existe-deja/main index 47ca4d5..a65d3dd 100755 Binary files a/tests/test-02-existe-deja/main and b/tests/test-02-existe-deja/main differ diff --git a/tests/test-02-existe-deja/main.c b/tests/test-02-existe-deja/main.c index 145de7a..dee38e7 100644 --- a/tests/test-02-existe-deja/main.c +++ b/tests/test-02-existe-deja/main.c @@ -2,5 +2,6 @@ int main(void) { printf("Ceci est un programme de test du Bakefile !\n"); + printf("test\n"); return 0; }