diff --git a/src/fr/monlouyan/bakefile/BakefileParser.java b/src/fr/monlouyan/bakefile/BakefileParser.java index 3a1f92f..07b8d71 100644 --- a/src/fr/monlouyan/bakefile/BakefileParser.java +++ b/src/fr/monlouyan/bakefile/BakefileParser.java @@ -205,6 +205,7 @@ public class BakefileParser { public List<Rule> parse() { List<Rule> rules = new ArrayList<>(); Set<String> phonyTargets = new HashSet<>(); + List<String> allTargetNames = new ArrayList<>(); // Pour suivre l'ordre des cibles if (!Files.exists(Paths.get(filename))) { System.out.println("*** No targets specified and no bakefile found. Stop."); @@ -217,6 +218,18 @@ public class BakefileParser { List<String> dependencies = new ArrayList<>(); List<String> commands = new ArrayList<>(); + // Première passe : collecter toutes les cibles PHONY + for (String line : lines) { + if (line.trim().isEmpty()) continue; + + Matcher phonyMatcher = PHONY_PATTERN.matcher(line); + if (phonyMatcher.matches()) { + String[] phonies = phonyMatcher.group(1).trim().split("\\s+"); + Collections.addAll(phonyTargets, phonies); + } + } + + // Deuxième passe : analyser les règles en tenant compte des PHONY for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); @@ -247,8 +260,7 @@ public class BakefileParser { Matcher phonyMatcher = PHONY_PATTERN.matcher(line); if (phonyMatcher.matches()) { - String[] phonies = phonyMatcher.group(1).trim().split("\\s+"); - Collections.addAll(phonyTargets, phonies); + // Déjà traité dans la première passe continue; } @@ -271,9 +283,8 @@ public class BakefileParser { phonyTargets.contains(resolvedTarget) )); - if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { - firstTarget = resolvedTarget; - } + // Enregistrer le nom de la cible pour suivre l'ordre + allTargetNames.add(resolvedTarget); } } @@ -298,15 +309,32 @@ public class BakefileParser { phonyTargets.contains(resolvedTarget) )); - if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { - firstTarget = resolvedTarget; + // Enregistrer le nom de la cible pour suivre l'ordre + allTargetNames.add(resolvedTarget); + } + } + + // Définir la première cible (similaire à Make) + // Make prend la première cible non-PHONY, ou la première cible si toutes sont PHONY + if (!allTargetNames.isEmpty()) { + // Chercher d'abord une cible non-PHONY dans l'ordre d'apparition + for (String targetName : allTargetNames) { + if (!phonyTargets.contains(targetName)) { + firstTarget = targetName; + break; } } + + // Si toutes les cibles sont PHONY, prendre simplement la première + if (firstTarget == null) { + firstTarget = allTargetNames.get(0); + } } } catch (IOException e) { e.printStackTrace(); } + return rules; } diff --git a/tests/test-31-redirection/README.md b/tests/test-31-redirection/README.md new file mode 100644 index 0000000..7f6ae1d --- /dev/null +++ b/tests/test-31-redirection/README.md @@ -0,0 +1,2 @@ +En gros, ici on vérifie si ça marche les redirections +jors j'envoie mon echo dans un fichier \ No newline at end of file diff --git a/tests/test-31-redirection/bake/Bakefile b/tests/test-31-redirection/bake/Bakefile new file mode 100644 index 0000000..58e6e40 --- /dev/null +++ b/tests/test-31-redirection/bake/Bakefile @@ -0,0 +1,48 @@ +# Bakefile pour tester les redirections I/O + +.PHONY: all test-output test-append test-input test-multiple test-pipe test-cleanup + +all: test-output test-append test-input test-multiple test-pipe + @echo "Tous les tests de redirection I/O sont terminés" + +# Test de redirection de sortie standard (>) +test-output: + @echo "Test de redirection de sortie >" + echo "Contenu écrit avec redirection >" > output.txt + @cat output.txt + @echo "-----------------------------" + +# Test de redirection avec ajout (>>) +test-append: + @echo "Test de redirection avec ajout >>" + echo "Première ligne" > append.txt + echo "Deuxième ligne ajoutée" >> append.txt + @cat append.txt + @echo "-----------------------------" + +# Test de redirection d'entrée (<) +test-input: + @echo "Test de redirection d'entrée <" + echo "Contenu à lire" > input.txt + cat < input.txt + @echo "-----------------------------" + +# Test de redirections multiples +test-multiple: + @echo "Test de redirections multiples" + echo "Ligne 1" > multi.txt + echo "Ligne 2" >> multi.txt + cat < multi.txt > multi-output.txt + @cat multi-output.txt + @echo "-----------------------------" + +# Test de pipe | +test-pipe: + @echo "Test de pipe |" + echo "LIGNE UN\nLIGNE DEUX\nLIGNE TROIS" | grep LIGNE | wc -l + @echo "-----------------------------" + +# Nettoyage des fichiers créés +test-cleanup: + @echo "Nettoyage des fichiers de test" + rm -f output.txt append.txt input.txt multi.txt multi-output.txt \ No newline at end of file diff --git a/tests/test-31-redirection/make/Makefile b/tests/test-31-redirection/make/Makefile new file mode 100644 index 0000000..58e6e40 --- /dev/null +++ b/tests/test-31-redirection/make/Makefile @@ -0,0 +1,48 @@ +# Bakefile pour tester les redirections I/O + +.PHONY: all test-output test-append test-input test-multiple test-pipe test-cleanup + +all: test-output test-append test-input test-multiple test-pipe + @echo "Tous les tests de redirection I/O sont terminés" + +# Test de redirection de sortie standard (>) +test-output: + @echo "Test de redirection de sortie >" + echo "Contenu écrit avec redirection >" > output.txt + @cat output.txt + @echo "-----------------------------" + +# Test de redirection avec ajout (>>) +test-append: + @echo "Test de redirection avec ajout >>" + echo "Première ligne" > append.txt + echo "Deuxième ligne ajoutée" >> append.txt + @cat append.txt + @echo "-----------------------------" + +# Test de redirection d'entrée (<) +test-input: + @echo "Test de redirection d'entrée <" + echo "Contenu à lire" > input.txt + cat < input.txt + @echo "-----------------------------" + +# Test de redirections multiples +test-multiple: + @echo "Test de redirections multiples" + echo "Ligne 1" > multi.txt + echo "Ligne 2" >> multi.txt + cat < multi.txt > multi-output.txt + @cat multi-output.txt + @echo "-----------------------------" + +# Test de pipe | +test-pipe: + @echo "Test de pipe |" + echo "LIGNE UN\nLIGNE DEUX\nLIGNE TROIS" | grep LIGNE | wc -l + @echo "-----------------------------" + +# Nettoyage des fichiers créés +test-cleanup: + @echo "Nettoyage des fichiers de test" + rm -f output.txt append.txt input.txt multi.txt multi-output.txt \ No newline at end of file