Por que o diff falha quando invocado de um Makefile?

5

Limite de um problema de patch que estou tentando resolver: Apenas dois arquivos, cada um com um tamanho de 1 byte:

  • arquivo a (contendo 'a' )
  • arquivo b (contendo 'b' ) e

O objetivo é criar e aplicar um patch que altere o valor de 'b' para 'a' . Conteúdo do Makefile são:

patch:
        diff -u b a > b2a.patch
        patch -o b.corrected b < b2a.patch
        diff a b.corrected

clean:
        rm -f b2a.patch b.corrected

Dado o acima, make falha com a seguinte saída:

$ make
diff -u b a > b2a.patch
make: *** [patch] Error 1

Se, no entanto, eu executar os comandos no Makefile um após o outro no shell bash, não há nenhum problema.

    
por Marcus Junius Brutus 11.11.2013 / 17:57

1 resposta

10

Assumir que um código de saída de 0 significa sucesso, qualquer outra coisa significa falha. Esta é a convenção padrão usada por quase todas as ferramentas de linha de comando.

Infelizmente, diff não é um deles. Verificando a página de informações do diff do GNU, e também a entrada única "diff" da Especificação Unix , 0 significa nenhuma diferença encontrada, 1 significa diferenças encontradas e ≥2 significa erro.

Você pode dizer ao Make para ignorar completamente o status de saída prefixando o comando com um hífen, como fez em seu comentário, mas isso ignorará os erros reais - provavelmente não o que você deseja. Em vez disso, você pode:

patch:
        diff -u b a > b2a.patch; [ $$? -eq 1 ]
        patch -o b.corrected b < b2a.patch
        diff a b.corrected; [ $$? -eq 1 ]

Observe o ; [ $$? -eq 1 ] bit que adicionei ao final das duas linhas de diff. Você pode usar ; test $$? -eq 1 também, é claro. A variável $? da shell é $$? devido às convenções normais de escape do Makefile. Observe que isso também rejeita o status de saída 0 (sem diferenças), que é provavelmente o que você deseja.

BTW: parece que isso realmente deveria ser:

patch: b.corrected
        diff …
b.corrected: b2a.patch
        patch …
b2a.patch: a b
        diff …

para que as modificações de aeb sejam coletadas e os arquivos sejam regenerados corretamente.

    
por 11.11.2013 / 19:14

Tags