.DELETE_ON_ERROR comportamento com marcas e pipelines

3

O .DELETE_ON_ERROR alvo informará ao make para excluir um destino se uma regra falhar. Mas isso não funciona para pipelines, porque o valor do status de saída $? contém o valor do último programa no pipeline. Por exemplo, o makefile a seguir não excluirá o arquivo recém-criado foo .

.DELETE_ON_ERROR:
foo:
    false | true > foo

Existe uma maneira de fazer a regra considerar que a regra falhou se algum dos programas no pipeline falhar (ou seja, se houver um valor diferente de zero em qualquer um dos elementos da matriz $PIPESTATUS )?

    
por Lorin Hochstein 15.07.2011 / 05:12

2 respostas

4

Se você estiver usando bash, você também pode definir a opção pipefail globalmente. Eu tenho isso uma vez no início dos meus makefiles e ele pega erros, mesmo no meio de um tubo:

# Make sure any errors in the middle of a pipe cause the build to fail
SHELL=/bin/bash -e -o pipefail

(Alterado de / bin / sh para / bin / bash baseado no comentário do MadScientist)

    
por 17.07.2012 / 22:49
2

Se você tem certeza que seu makefile terá bash como seu shell, você pode tentar configurar a opção pipefail:

SHELL=bash
.DELETE_ON_ERROR:
foo:
    set -o pipefail; false | true > foo

Como cada linha de uma regra é executada em uma instância de shell separada, você precisará adicionar set -o pipefail a cada linha à qual deseja aplicar isso.

Se você quiser que ele funcione em qualquer POSIX sh (e não apenas bash ), a resposta está muito mais envolvida.

    
por 15.07.2011 / 08:02