Gdzie mogę znaleźć listę kodów błędów „make”?

26

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 makekody błędów nie są niezależne od systemu ? Możesz mi pomóc? Dziękuję Ci.

Andrzej
źródło

Odpowiedzi:

27

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 ./dppnie 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 ci Error 126. Ta instancja make sama w sobie jest poleceniem wykonywanym przez nadrzędną instancję make, a makenarzędzie zwraca błąd 2, więc rodzic tworzy raporty Error 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/shco nie jest bash. Spróbuj uruchomić make SHELL=/bin/bash targetlub make SHELL=/bin/ksh target; jeśli to nie zadziała, musisz naprawić swój plik makefile.

Gilles „SO- przestań być zły”
źródło
14

Aby to wyjaśnić, Make zawsze zwraca jeden z trzech kodów błędów, jak podano na gnu.org :

  • 0: Status wyjścia to „Pomyślne”
  • 2: Dokonuj napotkanych błędów
  • 1: Zwraca odpowiedź na flagę -q (pytanie), wskazując, że cele wymagają aktualizacji

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.

Timothy Clifford
źródło