diff --git a/src/fr/monlouyan/bakefile/BakefileParser.java b/src/fr/monlouyan/bakefile/BakefileParser.java index 3393208..4d158e7 100644 --- a/src/fr/monlouyan/bakefile/BakefileParser.java +++ b/src/fr/monlouyan/bakefile/BakefileParser.java @@ -17,9 +17,10 @@ public class BakefileParser { /** * Regex pour détecter les targets et leurs dépendances. - * Format : "nom : dépendance1 dépendance2" + * Format : "nom1 nom2 nom3 : dépendance1 dépendance2" + * La nouvelle regex gère plusieurs cibles séparées par des espaces */ - private static final Pattern TARGET_PATTERN = Pattern.compile("^(\\S+)\\s*:\\s*([^#]*?)\\s*(?:#.*)?$"); + private static final Pattern TARGET_PATTERN = Pattern.compile("^([^:#]+?)\\s*:\\s*([^#]*?)\\s*(?:#.*)?$"); /** * Regex pour détecter les lignes de commande associées à une target. @@ -143,6 +144,18 @@ public class BakefileParser { .collect(Collectors.toList()); } + private List<String> splitTargets(String targetStr) { + if (targetStr == null || targetStr.trim().isEmpty()) { + return new ArrayList<>(); + } + + String resolvedStr = replaceVariables(targetStr.trim()); + return Arrays.stream(resolvedStr.split("\\s+")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toList()); + } + public List<Rule> parse() { List<Rule> rules = new ArrayList<>(); Set<String> phonyTargets = new HashSet<>(); @@ -154,7 +167,7 @@ public class BakefileParser { try { List<String> lines = Files.readAllLines(Paths.get(filename)); - String currentTarget = null; + List<String> currentTargets = null; List<String> dependencies = new ArrayList<>(); List<String> commands = new ArrayList<>(); @@ -200,22 +213,26 @@ public class BakefileParser { varValue = replaceVariables(varValue); variables.put(varName, varValue); } else if (targetMatcher.matches()) { - if (currentTarget != null) { - String resolvedTarget = replaceVariables(currentTarget.trim()); - rules.add(new Rule( - resolvedTarget, - splitDependencies(dependencies.stream() - .collect(Collectors.joining(" "))), - replaceVariablesInList(commands), - phonyTargets.contains(resolvedTarget) - )); - - if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { - firstTarget = resolvedTarget; + if (currentTargets != null) { + // Créer une règle pour chaque cible avec les mêmes dépendances et commandes + for (String target : currentTargets) { + String resolvedTarget = replaceVariables(target.trim()); + rules.add(new Rule( + resolvedTarget, + splitDependencies(dependencies.stream() + .collect(Collectors.joining(" "))), + replaceVariablesInList(commands), + phonyTargets.contains(resolvedTarget) + )); + + if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { + firstTarget = resolvedTarget; + } } } - currentTarget = targetMatcher.group(1); + String targetStr = targetMatcher.group(1); + currentTargets = splitTargets(targetStr); String depStr = targetMatcher.group(2); dependencies = splitDependencies(depStr); commands = new ArrayList<>(); @@ -224,17 +241,20 @@ public class BakefileParser { } } - if (currentTarget != null) { - String resolvedTarget = replaceVariables(currentTarget.trim()); - rules.add(new Rule( - resolvedTarget, - replaceVariablesInList(dependencies), - replaceVariablesInList(commands), - phonyTargets.contains(resolvedTarget) - )); - - if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { - firstTarget = resolvedTarget; + if (currentTargets != null) { + // Créer une règle pour chaque cible avec les mêmes dépendances et commandes + for (String target : currentTargets) { + String resolvedTarget = replaceVariables(target.trim()); + rules.add(new Rule( + resolvedTarget, + replaceVariablesInList(dependencies), + replaceVariablesInList(commands), + phonyTargets.contains(resolvedTarget) + )); + + if (firstTarget == null && !phonyTargets.contains(resolvedTarget)) { + firstTarget = resolvedTarget; + } } }