From c1e01392dfe95b0e6a34dc6d917f8cd6b8aa6ded Mon Sep 17 00:00:00 2001
From: Louay DARDOURI <louay.dardouri@etu.u-pec.fr>
Date: Sun, 16 Mar 2025 12:39:09 +0100
Subject: [PATCH] readme src

---
 src/fr/monlouyan/bakefile/README.md | 147 ++++++++++++++++++++++++++++
 1 file changed, 147 insertions(+)
 create mode 100644 src/fr/monlouyan/bakefile/README.md

diff --git a/src/fr/monlouyan/bakefile/README.md b/src/fr/monlouyan/bakefile/README.md
new file mode 100644
index 0000000..35f0343
--- /dev/null
+++ b/src/fr/monlouyan/bakefile/README.md
@@ -0,0 +1,147 @@
+# Documentation du répertoire `src` 📂
+
+Ce répertoire contient les fichiers source Java de l'outil **Bake**, organisé en plusieurs classes principales responsables du parsing du Bakefile, de la gestion des règles et de l'exécution des commandes.
+
+## Structure des fichiers
+
+| Fichier                 | Description |
+|-------------------------|-------------|
+| `Main.java`            | Point d'entrée du programme, initialise Bake. |
+| `BakeCLI.java`         | Gestion des arguments en ligne de commande. |
+| `BakeEngine.java`      | Moteur principal qui orchestre la compilation. |
+| `BakefileParser.java`  | Analyse et interprète le fichier `Bakefile`. |
+| `CommandExecutor.java` | Exécute les commandes associées aux règles. |
+| `DependencyResolver.java` | Gère les dépendances entre règles. |
+| `Rule.java`            | Représente une règle de compilation avec ses dépendances et commandes. |
+| `TimestampManager.java` | Gère les timestamps des fichiers pour déterminer s'ils doivent être recompilés. |
+
+---
+
+## Détail des fichiers
+
+### 🔹 `Main.java`
+📌 **Rôle :**  
+- Classe principale qui initialise et lance le moteur `BakeEngine`.
+- Passe les arguments de la ligne de commande à `BakeCLI`.
+
+🔗 **Extrait de code :**
+```java
+public static void main(String[] args) {
+    BakeCLI cli = new BakeCLI(args);
+    BakeEngine engine = new BakeEngine();
+    engine.run();
+}
+```
+
+---
+
+### 🔹 `BakeCLI.java`
+📌 **Rôle :**  
+- Gère les arguments passés en ligne de commande.
+- Active le mode debug avec `-d`.
+- Récupère les cibles demandées.
+
+🔗 **Méthodes clés :**
+```java
+public static boolean isDebug() { return debug; }
+public static List<String> getTargets() { return targets; }
+```
+
+---
+
+### 🔹 `BakeEngine.java`
+📌 **Rôle :**  
+- Parse le `Bakefile` pour récupérer les règles.
+- Résout les dépendances entre les règles.
+- Exécute les règles dans l’ordre correct.
+
+🔗 **Étapes clés du `run()` :**
+```java
+List<Rule> rules = parser.parse();
+List<Rule> rulesToBuild = resolver.resolve(rules, BakeCLI.getTargets());
+for (Rule rule : rulesToBuild) {
+    executor.execute(rule);
+}
+```
+
+---
+
+### 🔹 `BakefileParser.java`
+📌 **Rôle :**  
+- Lit et interprète le fichier `Bakefile`.
+- Extrait les règles, leurs dépendances et commandes associées.
+
+🔗 **Fonctionnalités :**
+- Gestion des variables `VAR = valeur`.
+- Détection des règles `.PHONY`.
+- Support des lignes de continuation (`\`).
+
+```java
+Pattern TARGET_PATTERN = Pattern.compile("(.+?)\s*:\s*(.+?)");
+Pattern COMMAND_PATTERN = Pattern.compile("^\t(.+)$");
+```
+
+---
+
+### 🔹 `CommandExecutor.java`
+📌 **Rôle :**  
+- Exécute les commandes définies dans les règles.
+- Gère les erreurs (`exit code`).
+- Supporte les commandes silencieuses (`@`) et les suppressions forcées (`-`).
+
+🔗 **Gestion des erreurs :**
+```java
+if (exitCode != 0) {
+    System.err.println("bake: *** [" + rule.getName() + "] Error " + exitCode);
+    System.exit(2);
+}
+```
+
+---
+
+### 🔹 `DependencyResolver.java`
+📌 **Rôle :**  
+- Résout les dépendances entre règles.
+- Détecte et gère les dépendances circulaires.
+
+🔗 **Détection des cycles :**
+```java
+if (stack.contains(ruleName)) {
+    System.out.println("bake: Circular dependency detected: " + ruleName);
+}
+```
+
+---
+
+### 🔹 `Rule.java`
+📌 **Rôle :**  
+- Représente une règle du `Bakefile`.
+- Contient le nom, les dépendances et les commandes associées.
+
+🔗 **Définition d’une règle :**
+```java
+public Rule(String name, List<String> dependencies, List<String> commands, boolean isPhony) {
+    this.name = name;
+    this.dependencies = dependencies;
+    this.commands = commands;
+    this.isPhony = isPhony;
+}
+```
+
+---
+
+### 🔹 `TimestampManager.java`
+📌 **Rôle :**  
+- Vérifie si un fichier doit être recompilé en comparant ses timestamps.
+
+🔗 **Gestion des timestamps :**
+```java
+public static long getTimestamp(File file) {
+    return file.exists() ? file.lastModified() : 0;
+}
+```
+
+---
+
+## 📌 Conclusion
+Ce répertoire contient les éléments clés de **Bake**, organisés pour assurer une exécution efficace des `Bakefile`. Chaque classe joue un rôle spécifique dans la gestion du parsing, des règles et de l'exécution des commandes.