Próbuję skompilować program napisany w Fortranie przy użyciu make
(mam plik Makefile i, podczas gdy w katalogu zawierającym plik Makefile , wpisuję polecenie $ make target
, gdzie „cel” jest specyficzną dla systemu specyfikacją celu, która jest obecna w moim Makefile . eksperymentując z różnymi wersjami specyfikacji docelowej, często próbuję wywołać różne komunikaty o błędach make
. Podam kilka przykładów:
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
i
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
i
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
Czy wiesz, jak mogę znaleźć listę kodów błędów, takich jak „Błąd 126” i „Błąd 2”? Znalazłem ten wątek na innej stronie internetowej, ale nie jestem pewien, co oznacza odpowiedź. Czy to oznacza, że make
kody błędów nie są niezależne od systemu ? Możesz mi pomóc? Dziękuję Ci.
make
error-handling
gnu-make
Andrzej
źródło
źródło
Odpowiedzi:
Kody błędów nie pochodzą od make: make zgłasza status powrotu polecenia, które się nie powiodło. Musisz przejrzeć dokumentację każdego polecenia, aby dowiedzieć się, co oznacza każda wartość statusu. Większość poleceń nie zawraca sobie głowy rozróżnieniami innymi niż 0 = sukces, cokolwiek innego = niepowodzenie.
W każdym z twoich przykładów
./dpp
nie można wykonać. Kiedy tak się dzieje, powłoka, która próbowała ją wywołać, kończy działanie z kodem statusu 126 (jest to standardowe zachowanie ). Wystąpienie make działającego w tej powłoce wykrywa nieudane polecenie (powłoka) i kończy działanie, pokazując ciError 126
. Ta instancja make sama w sobie jest poleceniem wykonywanym przez nadrzędną instancję make, amake
narzędzie zwraca błąd 2, więc rodzic tworzy raportyError 2
.Prawdopodobnie wynika to z niepowodzenia twojej kompilacji
test: too many arguments
. Może to być błąd składniowy w pliku makefile lub może wynikać z polegania na funkcjach specyficznych dla bash, gdy masz coś,/bin/sh
co nie jest bash. Spróbuj uruchomićmake SHELL=/bin/bash target
lubmake SHELL=/bin/ksh target
; jeśli to nie zadziała, musisz naprawić swój plik makefile.źródło
Aby to wyjaśnić, Make zawsze zwraca jeden z trzech kodów błędów, jak podano na gnu.org :
Możesz to przetestować, uruchamiając powyższe przykłady (zakładając, że nadal masz je od 2011 r.), A następnie uruchamiając
echo $?
terminal, aby wydrukować poprzedni kod powrotu.Make wydrukuje inne napotkane kody błędów (np. 126 znalezionych), ale jeśli wystąpi błąd, zawsze zwróci kod błędu 2.
źródło