gnatmake with make : erreur lors de l'édition de lien.

gnatmake with make : erreur lors de l'édition de lien. - Ada - Programmation

Marsh Posté le 09-01-2015 à 16:58:45    

Bonjour,  
Je travaille dans une entreprise de développement logiciel qui s'appelle "Arch" qui est constitué de sous projet "Arch*"
 
Voici le makefile :

.PHONY: Archaos
part=`ls -d Arch*`
all:
        mrproper Archaos
 
Archaos:
        for i in $(part) ; do \
                echo $$i; \
                gnatmake $$i/src/$$i.adb -D $$i/obj/ -aIPragmARC; \
        done
mrproper:
        for i in $(part) ; do \
                echo $$i; \
                rm -f $$i/obj/*; \
        done
 
clean:
        for i in $(part) ; do \
                echo $$i; \
                rm -f $$i/src/lib/*~; \
        done


 
 
Voici la sortie de make :
 

Citation :

for i in `ls -d Arch*` ; do \
                echo $i; \
                gnatmake $i/src/$i.adb -D $i/obj/ -aIPragmARC; \
        done
Archadia
gnatmake: "Archadia.adb" not found
Archai
gnatmake: "Archai.adb" not found
Archaos
gcc-4.6 -c -IArchaos/src/ -IPragmARC -I- -o /home/manuel/Arch Chaos Engineering/Archaos/obj/Archaos.o Archaos/src/Archaos.adb
Archaos.adb:4:11: warning: file name does not match unit name, should be "archaos.adb"
gnatbind -aO/home/manuel/Arch Chaos Engineering/Archaos/obj -aIPragmARC -x /home/manuel/Arch Chaos Engineering/Archaos/obj/Archaos.ali
gnatlink /home/manuel/Arch Chaos Engineering/Archaos/obj/Archaos.ali
/usr/bin/ld: cannot open output file Archaos: Is a directory
collect2: ld returned 1 exit status
gnatlink: error when calling /usr/bin/gcc-4.6
gnatmake: *** link failed.
Archetypes
gnatmake: "Archetypes.adb" not found
Archmain
gnatmake: "Archmain.adb" not found
Archman
gnatmake: "Archman.adb" not found
Archnet
gnatmake: "Archnet.adb" not found
Archworks
gnatmake: "Archworks.adb" not found
make: *** [Archaos] Erreur 4


 
 
 
Chaque sous- répertoire de "Arch*" contient un sous- répertoire src et obj
 
Comment contourner quel problème ?
 
Je vois pas ! Svp. Merci.


Message édité par par l'anneau de l'ia le 09-01-2015 à 16:59:04

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 09-01-2015 à 16:58:45   

Reply

Marsh Posté le 09-01-2015 à 17:06:56    

J'ai trouvé.
 
C'est l'exécutable qu'il peut pas créer parce que il est à la racine est c'est le nom du sous-répertoire.
 
Si j'ajoute -o $$i/bin/$$i, ça doit le faire.
 
Merci.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 10-01-2015 à 18:05:17    

La suite de mon Makefile :
 

Code :
  1. .PHONY:
  2. part=`ls -d Arch*`
  3. libs=`for j in Arch*; do echo -aI$$j/src/lib; done`
  4. default: mrproper all
  5. all:
  6.        for i in $(part) ; do \
  7.                echo $$i; \
  8.                gnatmake $$i/src/$$i.adb $(libs) -D $$i/obj/ -o $$i/bin/$$i -aI../PragmARC; \
  9.        done
  10. mrproper:
  11.        for i in $(part) ; do \
  12.                echo $$i; \
  13.                rm -f $$i/obj/*; \
  14.        done
  15. clean:
  16.        for i in $(part) ; do \
  17.                echo $$i; \
  18.                rm -f $$i/src/lib/*~; \
  19.                rm -f $$i/src/*~; \
  20.                rm -f $$i/obj/*; \
  21.        done


 
 
J'inclue à présent chacune des sous- bibliothèque pour compiler le sous-projet courant.


Message édité par par l'anneau de l'ia le 10-01-2015 à 18:10:44

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 11-01-2015 à 15:35:18    

re- bonjour,
 
 
Ce Makefile, c'est tout simplement de la balle !
 
J'ai rajouté un contrôle de condition (un if [ -f $$i/src/$$i.adb ] then) pour ne faire appelle à gnatmake que si un fichier principal est présent dans les sources.
 
Le nouveau Makefile, j'ai enlevé le .PHONY qui ne sert à rien, j'ai ajouté l'option -q (quiet ::= silencieux), je cherche comment passer le nom du projet (ici Arch) en paramètre de ligne de commande !

part=`ls -d Arch*`
 
libs=`for j in Arch*; do echo -aI$$j/src/lib; done`
 
default: mrproper all clean
 
all:
        for i in $(part) ; do \
                if [ -f $$i/src/$$i.adb ]; then \
                        gnatmake -q $$i/src/$$i.adb $(libs) -D $$i/obj/ -o $$i/bin/$$i -aI../PragmARC; \
                fi; \
        done
mrproper:
        for i in $(part) ; do \
                rm -f $$i/obj/*; \
                rm -f $$i/bin/$$i; \
        done
clean:
        for i in $(part) ; do \
                rm -f $$i/src/lib/*~; \
                rm -f $$i/src/*~; \
                rm -f $$i/obj/*; \
        done


 
 
Pour que ça fonctionne, je pense qu'il faut garder/tester l'architecture à mettre en place.
 
Si je fais un "ls" du répertoire courant "Arch" j'ai :

Arch  Arch-Angels  Arch-Environment  Arch-Install  Archman  Arch-Window  Makefile


Dans chacun des sou-répertoire j'ai un répertoire "bin", "obj", "src/" et "src/lib".
 
Il faudrait trouver un moyen de générer le projet à partir des noms du sous-projets.
 
Ici Archman est le nom du sous-répertoire du programme principal, il contient "src/Archman.adb"
 
Si j'appelle make, par défault d'argument j'obtien :
 

for i in `ls -d Arch*`  ; do \
                rm -f $i/obj/*; \
                rm -f $i/bin/$i; \
        done
for i in `ls -d Arch*`  ; do \
                if [ -f $i/src/$i.adb ]; then \
                        gnatmake -q $i/src/$i.adb `for j in Arch*; do echo -aI$j/src/lib; done`  -D $i/obj/ -o $i/bin/$i -aI../PragmARC; \
                fi; \
        done
Archman.adb:3:11: warning: file name does not match unit name, should be "archman.adb"
for i in `ls -d Arch*`  ; do \
                rm -f $i/src/lib/*~; \
                rm -f $i/src/*~; \
                rm -f $i/obj/*; \
        done


 
 
Un warning pour nom de fichier "non conforme".
 

ls Archman/bin/


Citation :

Archman


 
J'ai bien un binaire dans Arch/Archman/bin/.
 
 
Bref, on est dimanche.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 11-01-2015 à 17:19:08    


Apparemment, impossible de faire comme je veux.
 
Mais j'ai créé un fichier qui contient le nom de projet et les noms des sous-projets.
 
Tel :  cat > Project.default  
Testing
Testing-Alpha
Testing-Omega
Testing
 
 
Ensuite j'ai modifier les variables te j'ai enrichi mon Makefile avec une cible "prepare" :
 

Code :
  1. Project_Name=`head -n 1 Project.default`
  2. Sub_Projects_Names=`tail -n +2 Project.default`
  3. libs=`for j in \`tail -n +2 Project.default\`; do if [ -d \`head -n 1 Project.default\`$$j ]; then echo -aI\`head -n 1 Project.default\`$$j/src/lib; fi; done`
  4. default: prepare mrproper all clean
  5. prepare:
  6.         echo Project Name = $(Project_Name);
  7.         echo Sub Projects Names = $(Sub_Projects_Names);
  8.         if [ ! -d $(Project_Name) ]; then \
  9.                 mkdir $(Project_Name); \
  10.         fi;
  11.         if [ -d $(Project_Name) ]; then \
  12.                 for i in $(Sub_Projects_Names) ; do \
  13.                         if [ ! -d  $(Project_Name)/$$i ]; then \
  14.                                 mkdir -p $(Project_Name)/$$i; \
  15.                                 mkdir -p $(Project_Name)/$$i/src/lib; \
  16.                                 mkdir -p $(Project_Name)/$$i/obj; \
  17.                                 mkdir -p $(Project_Name)/$$i/bin; \
  18.                         fi; \
  19.                 done; \
  20.         fi
  21. all:
  22.         for i in $(Sub_Projects_Names) ; do \
  23.                 if [ -f $(Project_Name)/$$i/src/$$i.adb ]; then \
  24.                         gnatmake $(Project_Name)/$$i/src/$$i.adb $(libs) -D $(Project_Name)/$$i/obj/ -o $(Project_Name)/$$i/bin/$$i; \
  25.                 fi; \
  26.         done
  27. mrproper:
  28.         for i in $(Sub_Projects_Names) ; do \
  29.                 rm -f $(Project_Name)/$$i/obj/*; \
  30.                 rm -f $(Project_Name)/$$i/bin/$$i; \
  31.         done
  32. clean:
  33.         for i in $(Sub_Projects_Names) ; do \
  34.                 rm -f $(Project_Name)/$$i/src/lib/*~; \
  35.                 rm -f $(Project_Name)/$$i/src/*~; \
  36.                 rm -f $(Project_Name)/$$i/obj/*; \
  37.         done


 
 
 
 
En vous souhaitant bonne prog !
 


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Marsh Posté le 11-01-2015 à 18:12:08    

Correction de la ligne 3 !
 

Code :
  1. libs=`for j in \`tail -n +2 Project.default\`; do if [ -d \`head -n 1 Project.default\`/$$j ]; then echo -aI\`head -n 1 Project.default\`/$$j/src/lib; fi; done`


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed