Meu Makefile é muito simples:
all:
[ -f MyFile ] && echo "MyFile exists"
É claro que a linha de receitas começa com tab. Se o arquivo MyFile realmente existir, está tudo bem. Mas se este arquivo não estiver no diretório atual, recebo:
Makefile:2: receita para o alvo 'all' falhou make: *** [all] Erro 1
Posso me livrar desse erro usando a instrução if:
all:
if [ -f MyFile ]; then echo "MyFile exists"; fi
Ambas as instruções funcionam bem em sh e bash fora do make. Não está claro para mim qual é o motivo do erro make quando o operador condicional é usado. Uma ideia do que está acontecendo?
Responder1
[ -f MyFile ] && echo "MyFile exists"
sai com um código de status diferente de zero se MyFile
não existir, enquanto
if [ -f MyFile ]; then echo "MyFile exists"; fi
sai com um código de status de sucesso (zero), a menos que MyFile
existae echo
falha com um erro de gravação.
Make depende de códigos de status para determinar se os comandos falharam e interrompe a execução por padrão quando qualquer comando falha. Você pode desativar isso para linhas de comando individuais prefixando-as com -
, ou em geral executando make -i
ou especificando o .IGNORE
destino especial. Por isso
-[ -f MyFile ] && echo "MyFile exists"
ambos permitiriam que o Make continuasse, mas ainda faria com que ele imprimisse uma mensagem se MyFile
não existir:
make: [Makefile:14: test] Erro 1 (ignorado)
O || true
padrãotambém funcionaria neste caso específico, mas ignoraria erros em echo
. if condition; then command; fi
não fará com que Make pare se condition
for falso, mas levará command
em consideração os erros de ', enquanto condition && command || true
ignorará todos os erros.