Après une récente mise à jour de GCC, nous avons remarqué que certaines de nos fonctions communes précompilées étaient recompilées chaque fois qu'une application les utilisant était compilée. Il semble être lié à notre utilisation des fichiers gnat.adc pour stocker des pragmas. J'ai une solution de contournement, mais ce n'est pas joli et j'espérais que quelqu'un pourrait me dire si je fais quelque chose de mal.Recompilations de dépendances Ada inutiles (GCC 5.3.0)
Structure du répertoire:
~/adatest
-dependency
dependency.ads
dependency.adb
gnat.adc
-dependent
dependent.adb
gnat.adc
Fichiers:
--dependency.ads
package dependency is
procedure donothing;
end dependency;
--dependency.adb
with ada.text_io;
package body dependency is
procedure donothing is
begin
ada.text_io.put_line("Doing nothing");
end;
end dependency;
--dependent.adb
with dependency;
procedure dependent is
begin
dependency.donothing;
end dependent;
fichiers gnat.adc sont tous les deux vides.
Compiling:
cd ~/adatest/dependency
/usr/gnat/bin/gnatmake -m dependency.adb
ls
dependency.adb dependency.ads dependency.ali dependency.o gnat.adc
cd ../dependent/
/usr/gnat/bin/gnatmake -m dependent.adb -I../dependency
ls
dependency.ali dependency.o dependent dependent.adb dependent.ali dependent.o gnat.adc
Donc, la compilation de dépendance recompilé à charge, même si la dépendance était déjà compilé. En utilisant le drapeau bavard de gnatmake, je peux voir pourquoi:
gcc -c -I../dependency dependent.adb
"~/adatest/dependency/dependency.ali" being checked ...
-> "gnat.adc" time stamp mismatch
Il semble que l'horodatage de gnat.adc stocké dans dependency.ali (qui est l'horodatage de gnat.adc du répertoire de dépendance) est comparée à l'horodatage le gnat.adc du répertoire dépendant, provoquant la discordance et la recompilation. La suppression de l'un ou l'autre fichier gnat.adc arrête la recompilation, mais nous avons besoin de ces pragmas dans notre programme actuel. Il semble que notre précédente version de GCC (4.8.2) ne stockait pas les horodatages de gnat.adc, donc ce problème ne s'est jamais produit. Quoi qu'il en soit, notre solution de contournement actuelle consiste à renommer tous les fichiers gnat.adc en gnat.adc.tmp, puis à spécifier le fichier avec le paramètre du fichier de configuration de gnatmake (-gnatec = gnat.adc.tmp). L'extension .tmp empêche les fichiers d'être indexés dans le fichier .ali, ce qui résout le problème. Je n'aime pas vraiment ce kludge, cependant, et espérais qu'il y avait une solution plus propre.
Vous devez faire attention aux pragmas qui étaient à l'échelle de la partition et à ceux qui ne l'étaient pas. –