From ef5fff565a624f15e2057e651feddb97ca05f79c Mon Sep 17 00:00:00 2001
From: stiti <moncef.stiti@gmail.com>
Date: Sun, 2 Mar 2025 14:31:44 +0100
Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20d=C3=A9tection=20des=20timest?=
 =?UTF-8?q?amps=20futurs=20dans=20le=20syst=C3=A8me=20de=20build=20et=20mi?=
 =?UTF-8?q?se=20=C3=A0=20jour=20des=20messages=20d'avertissement?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../monlouyan/bakefile/CommandExecutor.java   |  18 ++++++
 src/fr/monlouyan/bakefile/Rule.java           |  23 ++++++-
 tests/C/test-22-future-timestamp/README.md    |  13 +---
 tests/C/test-22-future-timestamp/bake/main    | Bin 33432 -> 15440 bytes
 tests/C/test-22-future-timestamp/make/main    | Bin 33432 -> 15440 bytes
 .../C/test-22-future-timestamp/run_test22.sh  |  58 ++++++++++--------
 6 files changed, 75 insertions(+), 37 deletions(-)
 mode change 100644 => 100755 tests/C/test-22-future-timestamp/run_test22.sh

diff --git a/src/fr/monlouyan/bakefile/CommandExecutor.java b/src/fr/monlouyan/bakefile/CommandExecutor.java
index f09c767..1710f2d 100644
--- a/src/fr/monlouyan/bakefile/CommandExecutor.java
+++ b/src/fr/monlouyan/bakefile/CommandExecutor.java
@@ -7,6 +7,7 @@ public class CommandExecutor {
     private boolean debug;
     private boolean needsUpdate = false;  // Pour tracker si quelque chose doit être mis à jour
     private boolean isCircular = false;  // Pour tracker si un cycle a été détecté
+    private boolean futureTimestampDetected = false; // Pour détecter les timestamps dans le futur
 
     public CommandExecutor(boolean debug, boolean isCircular) {
         this.debug = debug;
@@ -18,6 +19,18 @@ public class CommandExecutor {
         boolean ruleNeedsUpdate = rule.needsUpdate();
         if (ruleNeedsUpdate) {
             needsUpdate = true;  // Au moins une règle doit être mise à jour
+            
+            // Vérifier les timestamps des dépendances pour détecter ceux dans le futur
+            for (String dependency : rule.getDependencies()) {
+                if (dependency.startsWith("~")) {
+                    continue;
+                }
+                
+                File depFile = new File(dependency);
+                if (depFile.exists() && TimestampManager.getTimestamp(depFile) > System.currentTimeMillis()) {
+                    futureTimestampDetected = true;
+                }
+            }
         }
 
         // Si la règle a besoin d'être mise à jour et qu'il n'y a pas de commandes
@@ -56,6 +69,11 @@ public class CommandExecutor {
             }
         }
 
+        // Si on a détecté des timestamps dans le futur, afficher un avertissement à la fin (comme make)
+        if (futureTimestampDetected && !isCircular) {
+            System.out.println("bake: warning:  Clock skew detected.  Your build may be incomplete.");
+        }
+
         // Vérifier si cette règle est une cible directement demandée par l'utilisateur
         boolean isRequestedTarget = BakeCLI.getTargets().contains(rule.getName()) || 
                                    (BakeCLI.getTargets().isEmpty() && rule.getName().equals(BakefileParser.getFirstTarget()));
diff --git a/src/fr/monlouyan/bakefile/Rule.java b/src/fr/monlouyan/bakefile/Rule.java
index 5ce49d8..761a0f7 100644
--- a/src/fr/monlouyan/bakefile/Rule.java
+++ b/src/fr/monlouyan/bakefile/Rule.java
@@ -2,6 +2,7 @@ package fr.monlouyan.bakefile;
 
 import java.io.File;
 import java.util.List;
+import java.util.Date;
 
 public class Rule {
     private String name;
@@ -97,6 +98,8 @@ public class Rule {
             System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp));
         }
     
+        long currentTime = System.currentTimeMillis();
+        
         for (String dependency : dependencies) {
             // Skip dependencies with tilde in path
             if (dependency.startsWith("~")) {
@@ -104,7 +107,22 @@ public class Rule {
             }
             
             File depFile = new File(dependency);
-            long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0;
+            if (!depFile.exists()) {
+                continue;
+            }
+            
+            long depTimestamp = TimestampManager.getTimestamp(depFile);
+    
+            // Vérifier si le timestamp de la dépendance est dans le futur
+            if (depTimestamp > currentTime) {
+                // Avertissement similaire à make
+                System.out.println("bake: Warning: File '" + dependency + "' has modification time " 
+                                  + ((depTimestamp - currentTime) / 1000) + " s in the future");
+                if (BakeCLI.isDebug()) {
+                    System.out.println("Debug : Dependency " + dependency + " has a timestamp in the future, needs update");
+                }
+                return true;
+            }
     
             if (BakeCLI.isDebug()) {
                 System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp));
@@ -120,13 +138,14 @@ public class Rule {
             }
     
             // Vérifier les timestamps seulement si le fichier existe
-            if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) {
+            if (depTimestamp > 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
diff --git a/tests/C/test-22-future-timestamp/README.md b/tests/C/test-22-future-timestamp/README.md
index 2dd8981..1eefdd6 100644
--- a/tests/C/test-22-future-timestamp/README.md
+++ b/tests/C/test-22-future-timestamp/README.md
@@ -89,15 +89,6 @@ Le test suit les étapes suivantes :
 
 ## Résultats attendus
 
-- Le comportement standard de GNU Make est de reconstruire l'exécutable si le fichier source a un timestamp dans le futur
+- Le comportement standard de Make est de reconstruire l'exécutable si le fichier source a un timestamp dans le futur
 - `bake` devrait adopter le même comportement et reconstruire l'exécutable
-- Les messages de sortie devraient indiquer la reconstruction
-
-## Explications techniques
-
-Les systèmes de build comme make utilisent les timestamps des fichiers pour déterminer quand une recompilation est nécessaire. Quand un fichier source a une date de modification qui se situe dans le futur :
-
-1. Certains systèmes de build considèrent toujours que le fichier a été modifié et déclenchent la reconstruction
-2. D'autres peuvent avoir des comportements particuliers ou des avertissements
-
-Ce test vérifie que `bake` gère correctement ce cas particulier en adoptant le même comportement que `make`, ce qui est important pour assurer une compatibilité complète, même dans des situations inhabituelles.
\ No newline at end of file
+- Les messages de sortie devraient indiquer la reconstruction
\ No newline at end of file
diff --git a/tests/C/test-22-future-timestamp/bake/main b/tests/C/test-22-future-timestamp/bake/main
index 1af39f5014e108b5de22f4f85b3b23a5122496cb..29e517eb67d2a212b0b8a0561519d93f16b346d7 100755
GIT binary patch
literal 15440
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
RWpn<w4{E~QF+xmLe+Nd4Y0&@x

literal 33432
zcmeI*Piz!b90%~X(`_kiYpWp!;-Ah%RMNCqEAc{{wJd)kp$$~BLdZ+EJKNpZ-EDSf
zA_&TY0vb%D6k|Q%pH#&tG|~ec8X8DUOiZ9CNQ|j?(9|HtMlV(i{(f&>x3i1N!2_4?
zOMd(2_ukBJ-h5_yoX)xFYu9Up2ncEh#hnypP>8+4q%9#9Q>>wovLn1YvN^J$okvTX
zI=FP`ri|;nLOV*?8Hsk5POIas(lMd)N*d;%C8;K*V{dbGLS1>i)+fA+Y1O-M&ev6J
zK~X4f(}t9J$BpHSL*@07x*i#+#<{;<wXQciFJ*V$$)z$qdjIlzj;{Bpp6A@({Iz*p
zN;mUdDifEfOd_lDQoj#%y{In2d3g;zr8>S3gA`J(40ncQTl@Nr-rcbDLqNT1Wqkz=
za`3&Xr;xHI>$?sATCbY+Rn78_*O{oI4gYg9_nfU;yZ))j%C+9A1mCTa=Yw)?gZd(Q
z&R>V_dx6)-$0eyFXO$-@Uq(3}wus_w%K3UOQ~wb4A&L$Pf8%{Q{Pq3wynVj#&)#>?
zoJqmYMYEgFHTR}s&GGHMamu;fL&59FJ@)g1?&Kr#t;IusE?J&@riI2#3h$hCRJ=}Y
zEB|?0f=g*mT_5$_Xzc~A!_T?D@p&Jo;5m<KHT@X{=GH>%*|<IL*y*Mxn`m9Bn0NFN
z>bU-3K?uHg59^%0xZOvg&cB=X@fNAZ@dE(}KmY;|fB*y_009U<00Izz00bZa0SG_<
z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwx`
z+a+-0B{4p;BXD%4P4rib!iLF^ICc7L!%14tL2-UXKfP#s_)5q+HM1jpl=kf(tB{xI
zo!Q}f!}>!Q4VT*N?v!cg9n;O2eYtE;t}C6k&A4qkJlL0Yb7rqjGG~TcTACJk?*ref
zFWBGnyS@DGuSGovzn{*{QonOQ{Qhtaz5iRU-z=syI5#T_zHMwm00Izz00bZa0SG_<
z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb
z2tWV=5P$##AOHafKmY;|fB*y_a2o_nI%fw(l!8C$?f<N||DOc#x5Q_g+P3H`?$+#x
zKGx8=?8~JxPNFy)km4>*c)mi6yhvLzos{-AyW4eanY6p&c23Msccn6-R;V3jcdrYm
zFOI8q-A#jav_Sr!2fR-HUkKC}m(1lkO!^}I&E=&k?_b*VM9ml--tU#6Um+IK7?lXT
zAPl;CLzUY~<IKZtz7V^GX{b-Tdn5n-OP{1yEuc<*qI23Ez5hh`$AMji1F_?clluq0
zKYZ}mx<w0XFYmk9{MRSDKK?YC{p_d2Sn%ud@n?<pXyuKaBRikp`_1TqHLo^)aI5(h
zErCtTjxSi+RQdXwFYk}GMJHO19Qq=5da7s4O+Qfe?spfj?wfieQSnY=)$-rF8xm8s
zp_5<z^4^6ld#?O&$QZeHtNQ<U{`#t+Z(n=*qhq1>gA<!RU-g@H<jc{at;6%qT(y3U
K40P<#SbqcJflIpp

diff --git a/tests/C/test-22-future-timestamp/make/main b/tests/C/test-22-future-timestamp/make/main
index 1af39f5014e108b5de22f4f85b3b23a5122496cb..29e517eb67d2a212b0b8a0561519d93f16b346d7 100755
GIT binary patch
literal 15440
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
RWpn<w4{E~QF+xmLe+Nd4Y0&@x

literal 33432
zcmeI*Piz!b90%~X(`_kiYpWp!;-Ah%RMNCqEAc{{wJd)kp$$~BLdZ+EJKNpZ-EDSf
zA_&TY0vb%D6k|Q%pH#&tG|~ec8X8DUOiZ9CNQ|j?(9|HtMlV(i{(f&>x3i1N!2_4?
zOMd(2_ukBJ-h5_yoX)xFYu9Up2ncEh#hnypP>8+4q%9#9Q>>wovLn1YvN^J$okvTX
zI=FP`ri|;nLOV*?8Hsk5POIas(lMd)N*d;%C8;K*V{dbGLS1>i)+fA+Y1O-M&ev6J
zK~X4f(}t9J$BpHSL*@07x*i#+#<{;<wXQciFJ*V$$)z$qdjIlzj;{Bpp6A@({Iz*p
zN;mUdDifEfOd_lDQoj#%y{In2d3g;zr8>S3gA`J(40ncQTl@Nr-rcbDLqNT1Wqkz=
za`3&Xr;xHI>$?sATCbY+Rn78_*O{oI4gYg9_nfU;yZ))j%C+9A1mCTa=Yw)?gZd(Q
z&R>V_dx6)-$0eyFXO$-@Uq(3}wus_w%K3UOQ~wb4A&L$Pf8%{Q{Pq3wynVj#&)#>?
zoJqmYMYEgFHTR}s&GGHMamu;fL&59FJ@)g1?&Kr#t;IusE?J&@riI2#3h$hCRJ=}Y
zEB|?0f=g*mT_5$_Xzc~A!_T?D@p&Jo;5m<KHT@X{=GH>%*|<IL*y*Mxn`m9Bn0NFN
z>bU-3K?uHg59^%0xZOvg&cB=X@fNAZ@dE(}KmY;|fB*y_009U<00Izz00bZa0SG_<
z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwx`
z+a+-0B{4p;BXD%4P4rib!iLF^ICc7L!%14tL2-UXKfP#s_)5q+HM1jpl=kf(tB{xI
zo!Q}f!}>!Q4VT*N?v!cg9n;O2eYtE;t}C6k&A4qkJlL0Yb7rqjGG~TcTACJk?*ref
zFWBGnyS@DGuSGovzn{*{QonOQ{Qhtaz5iRU-z=syI5#T_zHMwm00Izz00bZa0SG_<
z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb
z2tWV=5P$##AOHafKmY;|fB*y_a2o_nI%fw(l!8C$?f<N||DOc#x5Q_g+P3H`?$+#x
zKGx8=?8~JxPNFy)km4>*c)mi6yhvLzos{-AyW4eanY6p&c23Msccn6-R;V3jcdrYm
zFOI8q-A#jav_Sr!2fR-HUkKC}m(1lkO!^}I&E=&k?_b*VM9ml--tU#6Um+IK7?lXT
zAPl;CLzUY~<IKZtz7V^GX{b-Tdn5n-OP{1yEuc<*qI23Ez5hh`$AMji1F_?clluq0
zKYZ}mx<w0XFYmk9{MRSDKK?YC{p_d2Sn%ud@n?<pXyuKaBRikp`_1TqHLo^)aI5(h
zErCtTjxSi+RQdXwFYk}GMJHO19Qq=5da7s4O+Qfe?spfj?wfieQSnY=)$-rF8xm8s
zp_5<z^4^6ld#?O&$QZeHtNQ<U{`#t+Z(n=*qhq1>gA<!RU-g@H<jc{at;6%qT(y3U
K40P<#SbqcJflIpp

diff --git a/tests/C/test-22-future-timestamp/run_test22.sh b/tests/C/test-22-future-timestamp/run_test22.sh
old mode 100644
new mode 100755
index ab72593..4eb121f
--- a/tests/C/test-22-future-timestamp/run_test22.sh
+++ b/tests/C/test-22-future-timestamp/run_test22.sh
@@ -2,6 +2,7 @@
 
 # Script de test pour comparer bake et make
 # Test 22 - Gestion des timestamps dans le futur
+# À placer dans le répertoire test-22-future-timestamp
 
 # Création du répertoire de logs s'il n'existe pas
 mkdir -p logs
@@ -36,8 +37,19 @@ cd make
 echo "Compilation initiale avec make..." | tee -a "../$LOG_FILE"
 make 2>&1 | tee -a "../$LOG_FILE"
 
+# Enregistrons le timestamp de l'exécutable make après compilation initiale
+MAKE_INITIAL_TIMESTAMP=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
+echo "Timestamp initial de l'exécutable make: $(date -r main)" | tee -a "../$LOG_FILE"
+
 # Modification du timestamp du fichier main.c pour le mettre dans le futur (+ 1 jour)
-FUTURE_TIMESTAMP=$(date -d "+1 day" "+%Y%m%d%H%M.%S" 2>/dev/null || date -v+1d "+%Y%m%d%H%M.%S")
+# Utilisation de la syntaxe compatible avec macOS
+if [[ "$OSTYPE" == "darwin"* ]]; then
+    # macOS
+    FUTURE_TIMESTAMP=$(date -v+1d "+%Y%m%d%H%M.%S")
+else
+    # Linux et autres
+    FUTURE_TIMESTAMP=$(date -d "+1 day" "+%Y%m%d%H%M.%S")
+fi
 touch -t $FUTURE_TIMESTAMP main.c
 echo "Timestamp du fichier source main.c dans make modifié vers le futur: $(date -r main.c)" | tee -a "../$LOG_FILE"
 cd ..
@@ -47,6 +59,10 @@ cd bake
 echo "Compilation initiale avec bake..." | tee -a "../$LOG_FILE"
 java -cp bakefile.jar fr.monlouyan.bakefile.Main 2>&1 | tee -a "../$LOG_FILE"
 
+# Enregistrons le timestamp de l'exécutable bake après compilation initiale
+BAKE_INITIAL_TIMESTAMP=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
+echo "Timestamp initial de l'exécutable bake: $(date -r main)" | tee -a "../$LOG_FILE"
+
 # Modification du timestamp du fichier main.c pour le mettre dans le futur (+ 1 jour)
 touch -t $FUTURE_TIMESTAMP main.c
 echo "Timestamp du fichier source main.c dans bake modifié vers le futur: $(date -r main.c)" | tee -a "../$LOG_FILE"
@@ -59,23 +75,26 @@ echo "=================================" | tee -a "$LOG_FILE"
 echo "Exécution de MAKE avec un fichier source ayant un timestamp dans le futur:" | tee -a "$LOG_FILE"
 echo "=================================" | tee -a "$LOG_FILE"
 cd make
-# Enregistrer le timestamp actuel de l'exécutable
-MAKE_EXEC_TIME_BEFORE=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
 
+# On va aussi enregistrer la sortie de make dans un fichier temporaire
+# pour détecter si gcc a été exécuté
+MAKE_OUTPUT_FILE=$(mktemp)
 echo "$ make" | tee -a "../$LOG_FILE"
-make 2>&1 | tee -a "../$LOG_FILE"
+make 2>&1 | tee "$MAKE_OUTPUT_FILE" | tee -a "../$LOG_FILE"
 MAKE_EXIT_CODE=$?
 echo "" | tee -a "../$LOG_FILE"
 echo "Code de sortie: $MAKE_EXIT_CODE" | tee -a "../$LOG_FILE"
 
 # Vérifier si l'exécutable a été reconstruit
+# On peut aussi vérifier si "gcc" apparaît dans la sortie de make
 MAKE_EXEC_TIME_AFTER=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
-if [ "$MAKE_EXEC_TIME_AFTER" -ne "$MAKE_EXEC_TIME_BEFORE" ]; then
+if grep -q "gcc -o main" "$MAKE_OUTPUT_FILE" || [ "$MAKE_EXEC_TIME_AFTER" -ne "$MAKE_INITIAL_TIMESTAMP" ]; then
     echo "✅ make: L'exécutable a été reconstruit (avec un timestamp source dans le futur)" | tee -a "../$LOG_FILE"
     echo "Nouveau timestamp de l'exécutable: $(date -r main)" | tee -a "../$LOG_FILE"
 else
     echo "❌ make: L'exécutable n'a PAS été reconstruit malgré un timestamp source dans le futur" | tee -a "../$LOG_FILE"
 fi
+rm -f "$MAKE_OUTPUT_FILE"
 cd ..
 
 echo "" | tee -a "$LOG_FILE"
@@ -85,40 +104,31 @@ echo "=================================" | tee -a "$LOG_FILE"
 echo "Exécution de BAKE avec un fichier source ayant un timestamp dans le futur:" | tee -a "$LOG_FILE"
 echo "=================================" | tee -a "$LOG_FILE"
 cd bake
-# Enregistrer le timestamp actuel de l'exécutable
-BAKE_EXEC_TIME_BEFORE=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
 
+# On va aussi enregistrer la sortie de bake dans un fichier temporaire
+# pour détecter si gcc a été exécuté
+BAKE_OUTPUT_FILE=$(mktemp)
 echo "$ java -cp bakefile.jar fr.monlouyan.bakefile.Main" | tee -a "../$LOG_FILE"
-java -cp bakefile.jar fr.monlouyan.bakefile.Main 2>&1 | tee -a "../$LOG_FILE"
+java -cp bakefile.jar fr.monlouyan.bakefile.Main 2>&1 | tee "$BAKE_OUTPUT_FILE" | tee -a "../$LOG_FILE"
 BAKE_EXIT_CODE=$?
 echo "" | tee -a "../$LOG_FILE"
 echo "Code de sortie: $BAKE_EXIT_CODE" | tee -a "../$LOG_FILE"
 
 # Vérifier si l'exécutable a été reconstruit
+# On peut aussi vérifier si "gcc" apparaît dans la sortie de bake
 BAKE_EXEC_TIME_AFTER=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
-if [ "$BAKE_EXEC_TIME_AFTER" -ne "$BAKE_EXEC_TIME_BEFORE" ]; then
+if grep -q "gcc -o main" "$BAKE_OUTPUT_FILE" || [ "$BAKE_EXEC_TIME_AFTER" -ne "$BAKE_INITIAL_TIMESTAMP" ]; then
     echo "✅ bake: L'exécutable a été reconstruit (avec un timestamp source dans le futur)" | tee -a "../$LOG_FILE"
     echo "Nouveau timestamp de l'exécutable: $(date -r main)" | tee -a "../$LOG_FILE"
 else
     echo "❌ bake: L'exécutable n'a PAS été reconstruit malgré un timestamp source dans le futur" | tee -a "../$LOG_FILE"
 fi
+rm -f "$BAKE_OUTPUT_FILE"
 cd ..
 
-# Résumé des résultats
-echo "" | tee -a "$LOG_FILE"
-echo "=================================" | tee -a "$LOG_FILE"
-echo "RÉSUMÉ:" | tee -a "$LOG_FILE"
-echo "=================================" | tee -a "$LOG_FILE"
-
-if [ "$MAKE_EXEC_TIME_AFTER" -ne "$MAKE_EXEC_TIME_BEFORE" ] && [ "$BAKE_EXEC_TIME_AFTER" -ne "$BAKE_EXEC_TIME_BEFORE" ]; then
-    echo "✅ Les deux outils ont reconstruit l'exécutable face à un timestamp source dans le futur" | tee -a "$LOG_FILE"
-elif [ "$MAKE_EXEC_TIME_AFTER" -eq "$MAKE_EXEC_TIME_BEFORE" ] && [ "$BAKE_EXEC_TIME_AFTER" -eq "$BAKE_EXEC_TIME_BEFORE" ]; then
-    echo "❌ Les deux outils n'ont pas reconstruit l'exécutable malgré un timestamp source dans le futur" | tee -a "$LOG_FILE"
-else
-    echo "⚠️ Comportement différent entre make et bake:" | tee -a "$LOG_FILE"
-    echo "  - make: $([ "$MAKE_EXEC_TIME_AFTER" -ne "$MAKE_EXEC_TIME_BEFORE" ] && echo '✅ A reconstruit' || echo '❌ N'"'"'a pas reconstruit')" | tee -a "$LOG_FILE"
-    echo "  - bake: $([ "$BAKE_EXEC_TIME_AFTER" -ne "$BAKE_EXEC_TIME_BEFORE" ] && echo '✅ A reconstruit' || echo '❌ N'"'"'a pas reconstruit')" | tee -a "$LOG_FILE"
-fi
+# Vérification plus fiable du comportement de make et bake
+MAKE_REBUILT=$(grep -q "gcc -o main" "$MAKE_OUTPUT_FILE" 2>/dev/null || [ "$MAKE_EXEC_TIME_AFTER" -ne "$MAKE_INITIAL_TIMESTAMP" ] && echo "true" || echo "false")
+BAKE_REBUILT=$(grep -q "gcc -o main" "$BAKE_OUTPUT_FILE" 2>/dev/null || [ "$BAKE_EXEC_TIME_AFTER" -ne "$BAKE_INITIAL_TIMESTAMP" ] && echo "true" || echo "false")
 
 echo "" | tee -a "$LOG_FILE"
 echo "Test terminé. Résultats enregistrés dans: $LOG_FILE" | tee -a "$LOG_FILE"
\ No newline at end of file