Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1054 connectés 

  FORUM HardWare.fr
  Programmation
  Ada

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2247904
par l'anne​au de l'ia
word master
Posté le 09-01-2015 à 16:58:45  profilanswer
 

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.
mood
Publicité
Posté le 09-01-2015 à 16:58:45  profilanswer
 

n°2247909
par l'anne​au de l'ia
word master
Posté le 09-01-2015 à 17:06:56  profilanswer
 

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.
n°2248005
par l'anne​au de l'ia
word master
Posté le 10-01-2015 à 18:05:17  profilanswer
 

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.
n°2248053
par l'anne​au de l'ia
word master
Posté le 11-01-2015 à 15:35:18  profilanswer
 

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.
n°2248055
par l'anne​au de l'ia
word master
Posté le 11-01-2015 à 17:19:08  profilanswer
 


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.
n°2248059
par l'anne​au de l'ia
word master
Posté le 11-01-2015 à 18:12:08  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Ada

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

 

Sujets relatifs
Erreur bizarre dans VS2013 Express (resolu)Mon lien ne s'ouvre que quand je clique ouvrir dans un nouvel onglet
positionner une image avec un lienVBA - CDO Message => Gérer une erreur
[algo] Glissando de lien (num.) de pages[Ada] pas d'access et erreur d'access.
Connexion ADODB erreur 80004005erreur incomprise
Problème lien Access-MySQLDébutant erreur ptit batch
Plus de sujets relatifs à : gnatmake with make : erreur lors de l'édition de lien.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR