Estou tentando instruir o GNU Make 3.81 a não parar se um comando falhar (então prefixo o comando -
), mas também quero verificar o status de saída no próximo comando e imprimir uma mensagem mais informativa. No entanto, meu Makefile abaixo falha:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
Por que o Makefile acima ecoa "sucesso!" em vez de "fracasso!" ?
atualizar:
Seguindo e expandindo a resposta aceita, abaixo está como ela deve ser escrita:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.ONESHELL:
diretiva..SHELLFLAGS = -ec
deva ser usado. Mas, neste caso, você não pode usar-
mais o prefixo (para comando pessoal do recibo) porque o make escreverá que o erro é ignorado, mas ainda falhará em todo o bloco. Então, essa|| :
é a solução para ignorar o comando. Mas não é multiplataforma (o Windows não tem|| :
ou|| true
)Respostas:
Cada comando de atualização em uma regra Makefile é executado em um shell separado. Então $? não contém o status de saída do comando com falha anterior, contém o valor padrão para $? em uma nova concha. É por isso que seu [$? -eq 0] sempre é bem-sucedido.
fonte
Você não precisa do teste de,
$?
pois&&
funciona se$?
for zero e||
prosseguir no caso de um valor de retorno diferente de zero.E você não precisa do menos, pois o valor de retorno a ser obtido é obtido na última chamada do programa de prosseguimento da linha. Então, isso funciona bem
falha:
sucesso:
O oposto acontece: se você quiser fazer sua própria mensagem e quiser interromper o processo de criação de qualquer maneira com um valor diferente de zero, precisará escrever algo como isto:
falha:
fonte
A partir da documentação make GNU :
Para utilizar
make
o status de saída de um caso como este, execute amake
partir de um script:E faça com que seu Makefile contenha:
fonte