2008-10-20 5 views
5

У меня есть Makefile строить много файлов C с длинными длинными командными строками, и мы вымыли вывод, имея такие правила, как:Получение Quiet Make эхо командной строки на ошибках

.c${MT}.doj: 

     @echo "Compiling $<";\ 
     $(COMPILER) $(COPTS) -c -o [email protected] $< 

Теперь это здорово поскольку @ подавляет испускаемую линию компиляции. Но когда мы получаем ошибку, все, что мы получаем, это сообщение об ошибке, без командной строки. Может ли кто-нибудь подумать об «опрятном» способе испускать командную строку? Все, что я могу придумать, это повторять его в файле и иметь более высокий уровень, чтобы уловить ошибку и cat-файл. Хакки, я знаю.

ответ

7

Испытано и она работала (GNU сделать в Linux):

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

Обратите внимание, что этот способ больше не уведомляет о том, что команда не удалась и будет продолжаться, как если бы она преуспела. Возможно, вы можете добавить «&& false» до конца, чтобы компенсировать это. – mweerden 2008-10-20 13:35:22

0

простое решение было бы использовать простой сценарий abc как следующее:

#!/bin/bash 

[email protected] 
code=$? 
if ((code)); then 
    echo error running [email protected] 
fi 
exit $code 

Тогда вы можете написать abc $(COMPILER) $(COPTS) -c -o [email protected] $< в ваш Makefile. Обратите внимание, что это не работает, когда у вас есть трубы или перенаправления (поскольку они будут применяться к abc вместо команды, которую вы хотите запустить).

Вы также можете просто разместить аналогичный код непосредственно в Makefile, если это предпочтительнее.

0

Недавно я использовал утилиту под названием logtext для отслеживания того, какой результат произошел в ходе исполняемого файла bat. Проверьте это, вы можете обнаружить, что это очень полезно, если вы хотите узнать, какая ошибка произошла там.

7

Этот вопрос довольно старый, но для тех из вас погуглить, я думаю, что я буду делать в этой ситуации является псевдонимом make для make -s (бесшумного режима) в моей оболочке, и только положить @ префикс перед линиями, где echo или другие диагностические команды. Когда я хочу получить полный вывод от make, я переопределю свой псевдоним, назвав его \make.

Также обратите внимание, что в этой ситуации вам нужно будет сделать типичную вещь и поместить @echo в свою собственную линию, с действительными командами правил на отдельных строках и без @.