Comete erro ao executar receita com operador condicional

Comete erro ao executar receita com operador condicional

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 MyFilenão existir, enquanto

if [ -f MyFile ]; then echo "MyFile exists"; fi

sai com um código de status de sucesso (zero), a menos que MyFileexistae echofalha 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 -iou especificando o .IGNOREdestino especial. Por isso

-[ -f MyFile ] && echo "MyFile exists"

ambos permitiriam que o Make continuasse, mas ainda faria com que ele imprimisse uma mensagem se MyFilenão existir:

make: [Makefile:14: test] Erro 1 (ignorado)

O || truepadrãotambém funcionaria neste caso específico, mas ignoraria erros em echo. if condition; then command; finão fará com que Make pare se conditionfor falso, mas levará commandem consideração os erros de ', enquanto condition && command || trueignorará todos os erros.

informação relacionada