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

StackOverflow https://stackoverflow.com/questions/218208

  •  03-07-2019
  •  | 
  •  

Вопрос

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

.c${MT}.doj:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Также обратите внимание, что в этой ситуации вам & # 8217; вам нужно будет выполнить обычную задачу и поместить <=> в отдельную строку, с действующими командами правила в отдельных строках и без <=> # 8217;. з

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

#!/bin/bash

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top