Onde posso encontrar uma lista de códigos de erro 'make'?

26

Estou tentando compilar um programa escrito em Fortran usando make(eu tenho um Makefile e, enquanto no diretório que contém o Makefile , digito o comando $ make target, onde "target" é uma especificação de destino específica do sistema está presente no meu Makefile . Ao experimentar várias revisões da minha especificação de destino, muitas vezes recebo uma variedade de mensagens de erro ao tentar ligar make. Para dar alguns exemplos:

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

e

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

e

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

Você sabe como posso encontrar uma lista do que significam os códigos de erro, como "Erro 126" e "Erro 2"? Encontrei este tópico em outro site, mas não sei o que significa a resposta. Isso significa que não há significado independente do sistema dos makecódigos de erro? Você pode por favor me ajudar? Obrigado.

Andrew
fonte

Respostas:

27

Os códigos de erro não são do make: make está relatando o status de retorno do comando que falhou. Você precisa examinar a documentação de cada comando para saber o que significa cada valor de status. A maioria dos comandos não se incomoda com distinções diferentes de 0 = sucesso, qualquer outra coisa = falha.

Em cada um dos seus exemplos, ./dppnão pode ser executado. Quando isso acontece, o shell que tentou invocá-lo sai com o código de status 126 (esse é o comportamento padrão ). A instância do make que estava em execução que o shell detecta um comando com falha (o shell) e sai, mostrando a você Error 126. Essa instância do make é em si um comando executado por uma instância pai do make, e o makeutilitário retorna 2 com erro, para que o pai faça relatórios Error 2.

É provável que a falha de sua compilação ocorra test: too many arguments. Isso pode ser um erro de sintaxe no makefile ou pode ser devido a depender de recursos específicos do bash quando você tiver um /bin/shque não seja do bash. Tente correr make SHELL=/bin/bash targetou make SHELL=/bin/ksh target; se isso não funcionar, você precisará corrigir seu makefile.

Gilles 'SO- parar de ser mau'
fonte
14

Para esclarecer, o Make sempre retorna um dos três códigos de erro, conforme declarado no gnu.org :

  • 0: o status de saída é 'Bem-sucedido'
  • 2: Cometer erros encontrados
  • 1: Retorne a resposta ao sinalizador -q (question), indicando que os destinos exigem atualização

Você pode testar isso executando seus exemplos acima (supondo que você ainda os tenha a partir de 2011) e depois executando echo $?no terminal para imprimir o código de retorno anterior.

O Make imprimirá outros códigos de erro que encontrar (como os 126 que você encontrou), mas se ocorrer um erro, sempre retornará um código de erro 2.

Timothy Clifford
fonte