Estou implementando um sistema de compilação simples que na verdade é apenas um wrapper em torno 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
na falha.
Já estou usando o -s
sinalizador para suprimir a maior parte da saída do Make. E não quero que o Make ignore erros; Eu ainda quero que ele pare e saia com um status. Não posso simplesmente matar todas as saídas de erro make 2> /dev/null
porque ainda quero ver as mensagens impressas stderr
pelas tarefas que o Make está em execução.
Existe uma maneira de fazer isso sem analisar e sanitizar manualmente a saída do Make? Estou usando o GNU Make 4.2.1 e não me importo com soluções específicas do GNU Make.
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 com que seu programa redirecione o descritor de arquivo 3 para erro padrão (descritor de arquivo 2) e o descritor de arquivo 2 para/dev/null
. Dessa forma, o próprio programa make imprimirá 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 escrito à mão, você pode transformá-lo para adicionar esses redirecionamentos, assumindo que o makefile não seja muito selvagem com a sintaxe (por exemplo, nenhuma macro make GNU sofisticada que gere comandos). Para cada linha que começa com uma tabulação e opcionalmente
@
ou-
, e onde a linha anterior não termina com uma barra invertida, adicioneexec 2>&3;
após a tabulação e opcional@-
.Em vez de alterar o makefile, você pode invocá-lo com o argumento
SHELL=/path/to/shell_wrapper
whereshell_wrapper
is executa seu argumento com erro padrão redirecionado para um descritor diferente, algo assim: