2017-03-27 3 views
1

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.

+0

Vous devez faire attention aux pragmas qui étaient à l'échelle de la partition et à ceux qui ne l'étaient pas. –

Répondre

1

Il semble s'agir de spécifier les répertoires de bibliothèque. Dans le répertoire dependent, et après avoir compilé dans le répertoire dependency,

$ gnatmake -m -A../dependency dependent.adb 

à savoir, utilisez -Adir (comme décrit dans la sortie de gnatmake lorsqu'il est exécuté sans rien). Puis,

$ ls 
dependent dependent.adb dependent.ali dependent.o gnat.adc