Pergunta

Eu tenho uma criação de muitos arquivos C com linhas de comando longas e longas e limpamos a saída com regras como:

.c${MT}.doj:

        @echo "Compiling $<";\
         $(COMPILER) $(COPTS) -c -o $@ $<

Agora isso é ótimo, pois o @ suprime a linha de compilação emitida. Mas quando recebemos um erro, tudo o que recebemos é a mensagem de erro, nenhuma linha de comando. Alguém pode pensar em uma maneira "legal" de emitir a linha de comando? Tudo o que consigo pensar em fazê -lo é ecoando -o para um arquivo e ter um nível mais alto, faça com que o erro e gata o arquivo. Hacky eu sei.

Foi útil?

Solução

Testado e funcionou (GNU faz no Linux):

.c${MT}.doj:
     @echo "Compiling $<";\
          $(COMPILER) $(COPTS) -c -o $@ $<  \
          || echo "Error in command: $(COMPILER) $(COPTS) -c -o $@ $<" \
          && false

Outras dicas

Esta pergunta é bem antiga, mas para aqueles que pesquisam no Google, acho que o que farei nessa situação é alias make para make -s (modo silencioso) na minha concha e só coloca o @ prefixo antes das linhas onde echo ou outros comandos de diagnóstico estão sendo invocados. Quando eu quero a saída completa de make, Vou substituir meu pseudônimo chamando -o como \make.

Observe também que, nesta situação, você precisará fazer a coisa típica e colocar o @echo por sua própria linha, com os comandos reais reais em linhas separadas e sem @'s.

Uma solução simples seria usar um script simples abc Como o seguinte:

#!/bin/bash

$@
code=$?
if (( code )); then
  echo error running $@
fi
exit $code

Então você pode escrever abc $(COMPILER) $(COPTS) -c -o $@ $< na tua Makefile. Observe que isso não funciona quando você tem tubos ou redirecionamentos (como eles serão aplicados a abc em vez do comando que você deseja executar).

Você também pode apenas colocar código semelhante diretamente no Makefile Se isso for preferível.

Eu usei recentemente um utilitário chamado logText Para nomes de rastrear qual a saída ocorreu durante o curso de um arquivo de bat que a execução. Confira, você pode achar isso bastante útil se quiser saber qual erro ocorreu onde.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top