Où puis-je trouver une liste de codes d'erreur «make»?

26

J'essaie de compiler un programme écrit en Fortran en utilisant make(j'ai un Makefile et, tandis que dans le répertoire contenant le Makefile , je tape la commande $ make target, où "cible" est une spécification cible spécifique au système est présente dans mon Makefile . Comme je expérimenter avec diverses révisions de ma spécification cible, je reçois souvent une variété de messages d'erreur lorsque j'essaie d'appeler make. Pour donner quelques exemples:

make[1]: Entering directory
/bin/sh: line 0: test: too many arguments
./dpp   angfrc.f > angfrc.tmp.f
/bin/sh: ./dpp: Permission denied
make[1]: *** [angfrc.o] Error 126
make[1]: Leaving directory
make: *** [cmu60] Error 2

et

make[1]: Entering directory
/bin/sh: line 0: test: too many arguments
./dpp -DSTRESS -DMPI -P -D'pointer=integer'-I/opt/mpich_intel/include  angfrc.f > angfrc.tmp.f
/bin/sh: ./dpp: Permission denied
make[1]: *** [angfrc.o] Error 126
make[1]: Leaving directory 
make: *** [mpich-c2] Error 2

et

make[1]: Entering directory 
/bin/sh: line 0: test: too many arguments
./dpp -DSTRESS -DMPI -P -D'pointer=integer' -I/opt/mpich_intel/include  angfrc.f > angfrc.tmp.f
/bin/sh: ./dpp: Permission denied
make[1]: *** [angfrc.o] Error 126
make[1]: Leaving directory 
make: *** [mpi-intel] Error 2

Savez-vous comment trouver une liste de la signification des codes d'erreur, tels que «Erreur 126» et «Erreur 2»? J'ai trouvé ce fil sur un autre site Web, mais je ne sais pas ce que signifie la réponse. Cela signifie-t-il qu'il n'y a pas de signification indépendante du système des makecodes d'erreur? Pouvez-vous m'aider s'il vous plaît? Merci.

Andrew
la source

Réponses:

27

Les codes d'erreur ne proviennent pas de make: make signale l'état de retour de la commande qui a échoué. Vous devez consulter la documentation de chaque commande pour savoir ce que signifie chaque valeur d'état. La plupart des commandes ne se soucient pas des distinctions autres que 0 = succès, quoi que ce soit d'autre = échec.

Dans chacun de vos exemples, ./dppne peut pas être exécuté. Lorsque cela se produit, le shell qui a tenté de l'invoquer se ferme avec le code d'état 126 (il s'agit d' un comportement standard ). L'instance de make qui s'exécutait que le shell détecte une commande ayant échoué (le shell) et se ferme, vous montrant Error 126. Cette instance de make est elle-même une commande exécutée par une instance parent de make, et l' makeutilitaire renvoie 2 en cas d'erreur, donc le parent fait des rapports Error 2.

L'échec de votre build est susceptible de provenir de test: too many arguments. Cela pourrait être une erreur de syntaxe dans le makefile, ou cela pourrait être dû au fait de s'appuyer sur des fonctionnalités spécifiques à bash lorsque vous en avez un /bin/shqui n'est pas bash. Essayez de courir make SHELL=/bin/bash targetou make SHELL=/bin/ksh target; si cela ne fonctionne pas, vous devez corriger votre makefile.

Gilles 'SO- arrête d'être méchant'
la source
14

Pour clarifier, Make renvoie toujours l'un des trois codes d'erreur, comme indiqué sur gnu.org :

  • 0: l'état de sortie est «réussi»
  • 2: Faire des erreurs rencontrées
  • 1: Retourne la réponse à l'indicateur -q (question), indiquant que les cibles nécessitent une mise à jour

Vous pouvez le tester en exécutant vos exemples ci-dessus (en supposant que vous les avez toujours depuis 2011), puis en exécutant echo $?dans le terminal pour imprimer le code retour précédent.

Make imprimera les autres codes d'erreur qu'il rencontre (comme le 126 que vous avez trouvé), mais s'il rencontre une erreur, il retournera toujours un code d'erreur de 2.

Timothy Clifford
la source