From 17d26395b8de1b6cd6af6b62d1eb7c602697db87 Mon Sep 17 00:00:00 2001
From: Moncef STITI <moncef.stiti@etu.u-pec.fr>
Date: Tue, 11 Mar 2025 18:24:29 +0100
Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20du=20Makefile?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Makefile  | 144 +++++++++++++++++++++++++++++++++++++++++-------------
 README.md |   8 +++
 2 files changed, 119 insertions(+), 33 deletions(-)

diff --git a/Makefile b/Makefile
index b468cea..1c7b233 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
+# Définition des variables
 PACKAGE = fr.monlouyan.bakefile
 ENTRY = Main
-SOURCEDIR = ./src/fr/monlouyan/bakefile/
 BUILDDIR = ./build/
 DOCDIR = ./doc/
 JARNAME = bakefile.jar
@@ -9,42 +9,120 @@ MANIFESTPATH = Manifest.MF
 SOURCEDIR = ./src/
 TESTDIR = ./tests/
 
-SOURCES := $(shell find $(SOURCEDIR) -name '*.java')
+# Liste des fichiers source et leurs correspondances en .class
+BAKECLI_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/BakeCLI.class
+TIMESTAMPMANAGER_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/TimestampManager.class
+BAKEFILEPARSER_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/BakefileParser.class
+DEPENDENCYRESOLVER_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/DependencyResolver.class
+COMMANDEXECUTOR_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/CommandExecutor.class
+BAKEENGINE_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/BakeEngine.class
+RULE_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/Rule.class
+MAIN_CLASS = $(BUILDDIR)fr/monlouyan/bakefile/Main.class
 
-all:
-	@make clean
-	@make compile
-	@make jar
+# Fichiers source
+BAKECLI_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/BakeCLI.java
+TIMESTAMPMANAGER_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/TimestampManager.java
+BAKEFILEPARSER_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/BakefileParser.java
+DEPENDENCYRESOLVER_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/DependencyResolver.java
+COMMANDEXECUTOR_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/CommandExecutor.java
+BAKEENGINE_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/BakeEngine.java
+RULE_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/Rule.java
+MAIN_SRC = $(SOURCEDIR)fr/monlouyan/bakefile/Main.java
 
-compile:
-	@echo "Compiling..."
-	javac -cp $(CLASSP) -d $(BUILDDIR) $(SOURCES) -Xlint:unchecked -Xlint:deprecation
-	@echo "Done."
+# Cible principale
+all: init $(JARNAME) deploy-tests
 
+# Initialiser les répertoires nécessaires
+init:
+	@echo "Création des répertoires nécessaires..."
+	@mkdir -p $(BUILDDIR)
+	@mkdir -p $(BUILDDIR)fr/monlouyan/bakefile/
+	@echo "Répertoires créés."
+
+# ---- Phase 1: Compilation des classes sans dépendances circulaires ----
+phase1: init $(BAKECLI_CLASS) $(TIMESTAMPMANAGER_CLASS)
+
+$(BAKECLI_CLASS): $(BAKECLI_SRC)
+	@echo "Compilation de BakeCLI.java..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+$(TIMESTAMPMANAGER_CLASS): $(TIMESTAMPMANAGER_SRC)
+	@echo "Compilation de TimestampManager.java..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+# ---- Phase 2: Création de stubs pour gérer les dépendances circulaires ----
+STUBS_DIR = $(BUILDDIR)stubs/fr/monlouyan/bakefile/
+RULE_STUB = $(STUBS_DIR)Rule.java
+BAKEENGINE_STUB = $(STUBS_DIR)BakeEngine.java
+
+stubs: phase1
+	@echo "Création des stubs pour les classes avec dépendances circulaires..."
+	@mkdir -p $(STUBS_DIR)
+	@echo "package fr.monlouyan.bakefile; public class Rule { private String name; private java.util.List<String> dependencies; private java.util.List<String> commands; private boolean isPhony; public Rule(String name, java.util.List<String> dependencies, java.util.List<String> commands, boolean isPhony) { this.name = name; this.dependencies = dependencies; this.commands = commands; this.isPhony = isPhony; } public String getName() { return name; } public java.util.List<String> getDependencies() { return dependencies; } public java.util.List<String> getCommands() { return commands; } public boolean isPhony() { return isPhony; } public boolean needsUpdate() { return false; } public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); } }" > $(RULE_STUB)
+	@echo "package fr.monlouyan.bakefile; public class BakeEngine { public void run() {} public static boolean hasRule(String target) { return false; } public static Rule getRule(String target) { return null; } }" > $(BAKEENGINE_STUB)
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $(STUBS_DIR)*.java
+	@echo "Stubs créés."
+
+# ---- Phase 3: Compilation des classes avec stubs pour résoudre les dépendances circulaires ----
+phase3: stubs $(BAKEFILEPARSER_CLASS) $(DEPENDENCYRESOLVER_CLASS) $(COMMANDEXECUTOR_CLASS)
+
+$(BAKEFILEPARSER_CLASS): $(BAKEFILEPARSER_SRC)
+	@echo "Compilation de BakefileParser.java avec stubs..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+$(DEPENDENCYRESOLVER_CLASS): $(DEPENDENCYRESOLVER_SRC)
+	@echo "Compilation de DependencyResolver.java avec stubs..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+$(COMMANDEXECUTOR_CLASS): $(COMMANDEXECUTOR_SRC)
+	@echo "Compilation de CommandExecutor.java avec stubs..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+# ---- Phase 4: Compilation finale des classes avec dépendances circulaires ----
+phase4: phase3 $(BAKEENGINE_CLASS) $(RULE_CLASS) $(MAIN_CLASS)
+
+$(BAKEENGINE_CLASS): $(BAKEENGINE_SRC)
+	@echo "Compilation finale de BakeEngine.java..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+$(RULE_CLASS): $(RULE_SRC)
+	@echo "Compilation finale de Rule.java..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+$(MAIN_CLASS): $(MAIN_SRC)
+	@echo "Compilation de Main.java..."
+	@javac -cp $(CLASSP) -d $(BUILDDIR) $< -Xlint:unchecked -Xlint:deprecation
+
+# Création du fichier JAR (dépend de phase4 pour s'assurer que tout est compilé)
+$(JARNAME): phase4
+	@echo "Création du fichier JAR..."
+	@jar cfm $(JARNAME) $(MANIFESTPATH) -C $(BUILDDIR) fr/monlouyan/bakefile
+	@echo "Fichier JAR créé : $(JARNAME)"
+
+# Génération de la documentation Javadoc
+javadoc:
+	@echo "Génération de la documentation Javadoc..."
+	@javadoc -d $(DOCDIR) -sourcepath $(SOURCEDIR) -subpackages $(PACKAGE)
+	@echo "Documentation Javadoc générée dans $(DOCDIR)"
+
+see-javadoc: javadoc
+	@echo "Ouverture de la documentation Javadoc sur Firefox..."
+	@firefox $(DOCDIR)/index.html
+
+# Déploiement du JAR dans les répertoires de test
+deploy-tests: $(JARNAME)
+	@echo "Déploiement du JAR dans les répertoires de test..."
+	@find $(TESTDIR) -type d -name 'bake' -exec cp $(JARNAME) {} \;
+	@echo "Déploiement terminé."
+
+# Nettoyage des fichiers générés
 clean:
-	@echo "Cleaning up..."
-	@rm -rf $(BUILDDIR)* $(DOCDIR)*
+	@echo "Nettoyage des fichiers générés..."
+	@rm -rf $(BUILDDIR)
+	@rm -rf $(DOCDIR)
 	@rm -f $(JARNAME)
 	@find $(TESTDIR) -name "$(JARNAME)" -delete
-	@echo "Done."
+	@echo "Nettoyage terminé."
 
-javadoc:
-	@echo "Generating javadoc..."
-	@javadoc -d $(DOCDIR) -sourcepath src -subpackages $(PACKAGE)
-	@echo "Done."
-
-jar:
-	@echo "Creating jar..."
-	@jar cfm $(JARNAME) $(MANIFESTPATH) -C $(BUILDDIR) fr/monlouyan/bakefile
-	@echo "Done."
-	@make deploy-tests
-
-deploy-tests:
-	@echo "Deploying JAR to 'bake' directories..."
-	@find $(TESTDIR) -type d -name 'bake' -exec cp $(JARNAME) {} \;
-	@echo "Done."
-
-run_test:
-	@echo "Running tests..."
-	@java -cp build fr.monlouyan.bakefile.tests.BakeTestRunner
-	@echo "Done."
\ No newline at end of file
+# Cibles spéciales
+.PHONY: all init phase1 stubs phase3 phase4 javadoc deploy-tests clean
\ No newline at end of file
diff --git a/README.md b/README.md
index f82d13b..6e62e0c 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,14 @@ Le répertoire **tests** contient une liste de tests pour vérifier que Bake ré
 - **Contenu**:
 	- **[README.md](./tests/README.md)** : Documentation qui explique l'utilisation des tests.
 
+Pour générer et visualiser la documentation JavaDoc :
+```bash
+# Générer uniquement la JavaDoc
+make javadoc
+
+# Générer et afficher la JavaDoc dans votre navigateur
+make see-javadoc
+```
 
 ## Documentation
 Le répertoire **documentation** contient un rapport et des diagrammes détaillant le fonctionnement de Bake.