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