From 238a02796b8e067e7f588d30b200dda63ea57da7 Mon Sep 17 00:00:00 2001 From: Yanis HAMOUDI <yanis.hamoudi@etu.u-pec.fr> Date: Tue, 4 Feb 2025 16:27:07 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9liorations=20du=20code=20en=20ajoutant?= =?UTF-8?q?=20des=20patterns/regex=20+=20Am=C3=A9lioration=20du=20mode=20d?= =?UTF-8?q?ebug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 15 +++-- src/fr/monlouyan/bakefile/BakeEngine.java | 2 +- src/fr/monlouyan/bakefile/BakefileParser.java | 60 ++++++++++++++---- .../monlouyan/bakefile/CommandExecutor.java | 7 +- .../bakefile/DependencyResolver.java | 9 +++ src/fr/monlouyan/bakefile/Main.java | 1 - tests/test-02-existe-deja/Bakefile | 2 +- tests/test-02-existe-deja/main | Bin 33432 -> 33432 bytes tests/test-02-existe-deja/main.c | 1 + 9 files changed, 72 insertions(+), 25 deletions(-) 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 47ca4d583d8dfcc47038f905b5b989ae6b8a1b88..a65d3dd9b959ca4f10f3c1016eb97ce7e8accec9 100755 GIT binary patch delta 300 zcmbQy$~2>uX~G3T4SNO#Mg|532L=exnE23MFas*c0}*4$m~6;sFIWN<HHM0oY;I)y z&nOU+JtK7eT;uA!i|#C2T6SUi<O$3cj2fFyGRIp_wy>AwyI?z!gMncR0|UbZh8DZY z;r4#4C8@<FT$7jC%khG&2U!im8JjQKFLPjAF}b2afpNv;nGN!c8k2W6tkMHXg6w3> zP0Y+==&I<mUhCR)!h!#z)1gD<+5gOvKK@fXX?kw!Y7U+nLF>sA8yytnLl!LbuK%#P z-AqvR(FuctGCC%SU!ESh$?BLrU)AfM$>fiX4eGi1&m!5vb+(>7yE>re@yesDn<K4V VEUsQvWm?a&IV)BlWG4dy0{~FiVdDS* delta 288 zcmbQy$~2>uX~G3T3ws6zMg|5369x#dnE23MFb68g0}*4$nQX{tFIWK;)rE>yY;I)y z&nPgZ-tYPKHFk2#zeEXzr>+;CJb~GQ(PHyS=6LJL0W1QOHSA@X9@tI}w)bOXn7qth zju&L50|NsC2<L3RXur&XamVC}1_j0)lV>)_Gg?gE*|16v<{rk}#LPSfNz1oI3pUJM z6wbXdTEIUeY4>EuizoO_NBV^}{t`?19X@$tqk}@o8}ozh@3LmKWSo96#lG^g-A5s% z&EMEkS{j`XeO!J1?BtJ)4eHB1&Rk$&Yhc(^Ss(OPS>)k423?txi*qbrCaXPp75Kvu G>Nfx~{$O_i 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; }