Make - Como suprimir mensagens de erro sem suprimir outra saída

0

Estou implementando um sistema de compilação simples que, na verdade, é apenas um invólucro do Make. Como esse sistema de compilação já emite suas próprias mensagens de erro, não quero que o Make produza mensagens de erro como

make: *** [/cool/makefile:116: /fun/target.o] Error 1

em falha.

Eu já estou usando o sinalizador -s para suprimir a maior parte da saída do Make. E eu não quero que o Make ignore os erros; Eu ainda quero que pare e saia com um status. Eu não posso simplesmente matar todas as saídas de erro com make 2> /dev/null porque eu ainda quero ver as mensagens impressas em stderr pelas tarefas que o Make está rodando.

Existe uma maneira de fazer isso sem analisar manualmente e limpar a saída do Make? Estou usando o GNU Make 4.2.1, e não me importo com as soluções específicas do GNU Make.

    
por Sam Marinelli 05.08.2018 / 09:39

1 resposta

1

Como seu sistema é um wrapper em torno do make, presumo que ele gere o makefile. Ajuste seu gerador para adicionar 2>&3 a todos os comandos shell no makefile, e faça seu programa redirecionar o descritor de arquivo 3 para o erro padrão (descritor de arquivo 2) e o descritor de arquivo 2 para /dev/null . Dessa forma, o próprio programa make imprime em seu erro padrão, que vai para /dev/null , e os comandos de compilação serão impressos em seu erro padrão, que vai para o erro padrão do wrapper.

Se você estiver usando um makefile manuscrito, poderá transformá-lo para adicionar esses redirecionamentos, supondo que o makefile não fique muito louco com a sintaxe (por exemplo, nenhum GNU sofisticado cria macros que geram comandos). Para cada linha que começa com uma guia e, opcionalmente, @ ou - e onde a linha anterior não termina com uma barra invertida, adicione exec 2>&3; após a guia e opcional @- .

Em vez de alterar o makefile, você pode invocá-lo com o argumento SHELL=/path/to/shell_wrapper , em que shell_wrapper executa seu argumento com o erro padrão redirecionado para um descritor diferente, algo assim:

#!/bin/sh
eval "$2" 2>&3
    
por 05.08.2018 / 11:28

Tags