diff --git a/src/fr/monlouyan/bakefile/DependencyResolver.java b/src/fr/monlouyan/bakefile/DependencyResolver.java index 2372db5..26c5378 100644 --- a/src/fr/monlouyan/bakefile/DependencyResolver.java +++ b/src/fr/monlouyan/bakefile/DependencyResolver.java @@ -47,6 +47,14 @@ public class DependencyResolver { // Construire la liste finale des règles dans l'ordre for (String ruleName : buildOrder) { + // Skip rules with tilde in path (home directory) to match make behavior + if (ruleName.startsWith("~")) { + if (debug) { + System.out.println("Debug: Skipping home directory path in resolution: " + ruleName); + } + continue; + } + Rule rule = ruleMap.get(ruleName); if (rule != null) { rulesToBuild.add(rule); @@ -66,6 +74,10 @@ public class DependencyResolver { // D'abord traiter les dépendances for (String dep : rule.getDependencies()) { + // Skip dependencies with tilde in path + if (dep.startsWith("~")) { + continue; + } topologicalSort(dep, processed, buildOrder); } @@ -73,7 +85,7 @@ public class DependencyResolver { buildOrder.add(ruleName); } - // La méthode detectCycle reste inchangée + // La méthode detectCycle avec une modification pour les chemins home private void detectCycle(String ruleName, Set<String> visited, Set<String> stack, String parent) { if (stack.contains(ruleName)) { if (parent != null) { @@ -95,6 +107,11 @@ public class DependencyResolver { if (rule != null) { List<String> dependenciesCopy = new ArrayList<>(rule.getDependencies()); for (String dependency : dependenciesCopy) { + // Skip dependencies with tilde in path + if (dependency.startsWith("~")) { + continue; + } + if (ruleMap.containsKey(dependency)) { detectCycle(dependency, visited, stack, ruleName); } diff --git a/src/fr/monlouyan/bakefile/Rule.java b/src/fr/monlouyan/bakefile/Rule.java index 908a195..5ce49d8 100644 --- a/src/fr/monlouyan/bakefile/Rule.java +++ b/src/fr/monlouyan/bakefile/Rule.java @@ -23,87 +23,110 @@ public class Rule { public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); } public boolean needsUpdate() { - if (BakeCLI.isDebug()){ - System.out.println("Debug : Checking if rule " + name + " needs update"); - } - - // Les règles phony sont toujours mises à jour - if (isPhony) { - if (BakeCLI.isDebug()) { - System.out.println("Debug : Rule " + name + " is phony, always needs update"); - } - return true; - } - - // Vérifier d'abord toutes les dépendances avant d'exécuter quoi que ce soit - for (String dependency : dependencies) { - File depFile = new File(dependency); - boolean hasRule = BakeEngine.hasRule(dependency); - if (!depFile.exists() && !dependency.isEmpty() && !hasRule) { - System.out.println("bake: *** No rule to make target `" + dependency + "', needed by `" + name + "'. Stop."); - System.exit(1); - } - } + if (BakeCLI.isDebug()){ + System.out.println("Debug : Checking if rule " + name + " needs update"); + } + + // Les règles phony sont toujours mises à jour + if (isPhony) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Rule " + name + " is phony, always needs update"); + } + return true; + } + + // Skip targets with tilde in path (home directory) to match make behavior + if (name.startsWith("~")) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Skipping home directory path: " + name); + } + return false; + } + + // Vérifier d'abord toutes les dépendances avant d'exécuter quoi que ce soit + for (String dependency : dependencies) { + // Skip dependencies with tilde in path + if (dependency.startsWith("~")) { + continue; + } + + File depFile = new File(dependency); + boolean hasRule = BakeEngine.hasRule(dependency); + if (!depFile.exists() && !dependency.isEmpty() && !hasRule) { + System.out.println("bake: *** No rule to make target `" + dependency + "', needed by `" + name + "'. Stop."); + System.exit(1); + } + } - // Si le fichier cible n'existe pas et qu'il y a des commandes, il doit être mis à jour - File targetFile = new File(name); - if (!targetFile.exists() && !commands.isEmpty()) { - if (BakeCLI.isDebug()) { - System.out.println("Debug : Target file " + name + " does not exist and has commands, needs update"); - } - return true; - } - - // Si la règle n'a pas de commandes, on vérifie seulement si une dépendance doit être mise à jour - if (commands.isEmpty()) { - for (String dependency : dependencies) { - Rule depRule = BakeEngine.getRule(dependency); - if (depRule != null && depRule.needsUpdate()) { - if (BakeCLI.isDebug()) { - System.out.println("Debug : Dependency rule " + dependency + " needs update"); - } - return true; - } - } - return false; - } - - // Pour les règles avec des commandes, on vérifie aussi les timestamps - if (BakeCLI.isDebug()){ - System.out.println("Debug : Checking if target file " + name + " exist and is up to date"); - } - - long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0; - - if (BakeCLI.isDebug()) { - System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp)); - } - - for (String dependency : dependencies) { - File depFile = new File(dependency); - long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0; - - if (BakeCLI.isDebug()) { - System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp)); - } - - // Si la dépendance est une règle et qu'elle a besoin d'être mise à jour - Rule depRule = BakeEngine.getRule(dependency); - if (depRule != null && depRule.needsUpdate()) { - if (BakeCLI.isDebug()) { - System.out.println("Debug : Dependency rule " + dependency + " needs update"); - } - return true; - } - - // Vérifier les timestamps seulement si le fichier existe - if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) { - if (BakeCLI.isDebug()) { - System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update"); - } - return true; - } - } - return false; - } + // Si le fichier cible n'existe pas et qu'il y a des commandes, il doit être mis à jour + File targetFile = new File(name); + if (!targetFile.exists() && !commands.isEmpty()) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Target file " + name + " does not exist and has commands, needs update"); + } + return true; + } + + // Si la règle n'a pas de commandes, on vérifie seulement si une dépendance doit être mise à jour + if (commands.isEmpty()) { + for (String dependency : dependencies) { + // Skip dependencies with tilde in path + if (dependency.startsWith("~")) { + continue; + } + + Rule depRule = BakeEngine.getRule(dependency); + if (depRule != null && depRule.needsUpdate()) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Dependency rule " + dependency + " needs update"); + } + return true; + } + } + return false; + } + + // Pour les règles avec des commandes, on vérifie aussi les timestamps + if (BakeCLI.isDebug()){ + System.out.println("Debug : Checking if target file " + name + " exist and is up to date"); + } + + long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0; + + if (BakeCLI.isDebug()) { + System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp)); + } + + for (String dependency : dependencies) { + // Skip dependencies with tilde in path + if (dependency.startsWith("~")) { + continue; + } + + File depFile = new File(dependency); + long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0; + + if (BakeCLI.isDebug()) { + System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp)); + } + + // Si la dépendance est une règle et qu'elle a besoin d'être mise à jour + Rule depRule = BakeEngine.getRule(dependency); + if (depRule != null && depRule.needsUpdate()) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Dependency rule " + dependency + " needs update"); + } + return true; + } + + // Vérifier les timestamps seulement si le fichier existe + if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update"); + } + return true; + } + } + return false; + } } \ No newline at end of file