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 make
codes d'erreur? Pouvez-vous m'aider s'il vous plaît? Merci.
la source
Réponses:
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,
./dpp
ne 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 montrantError 126
. Cette instance de make est elle-même une commande exécutée par une instance parent de make, et l'make
utilitaire renvoie 2 en cas d'erreur, donc le parent fait des rapportsError 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/sh
qui n'est pas bash. Essayez de courirmake SHELL=/bin/bash target
oumake SHELL=/bin/ksh target
; si cela ne fonctionne pas, vous devez corriger votre makefile.la source
Pour clarifier, Make renvoie toujours l'un des trois codes d'erreur, comme indiqué sur gnu.org :
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.
la source