Получение Quiet Make для эха командных строк при ошибке

У меня есть Makefile, создающий много файлов C с длинными командными строками, и мы очистили вывод, используя такие правила, как:

.c${MT}.doj:

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

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


person Community    schedule 20.10.2008    source источник


Ответы (4)


Протестировано, и это сработало (GNU make в Linux):

.c${MT}.doj:
     @echo "Compiling $<";\
          $(COMPILER) $(COPTS) -c -o $@ $<  \
          || echo "Error in command: $(COMPILER) $(COPTS) -c -o $@ $<" \
          && false
person Rajish    schedule 20.10.2008
comment
Обратите внимание, что таким образом make больше не замечает, что команда завершилась неудачно, и продолжит работу, как если бы она была выполнена успешно. Может быть, вы можете добавить && false в конец, чтобы компенсировать это. - person mweerden; 20.10.2008
comment
Мне нужно было добавить скобки, например: @echo ... ; скомпилировать... || ( эхо ... && ложь ) - person Claude Heiland-Allen; 07.09.2013

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

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

person Seth Kingsley    schedule 22.04.2012

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

#!/bin/bash

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

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

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

person mweerden    schedule 20.10.2008

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

person Community    schedule 20.10.2008