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