Подавить сообщения в make clean (Makefile без вывода сообщений) - PullRequest
40 голосов
/ 30 июня 2010

Мне интересно, как я могу избежать некоторого эха в Makefile:

clean:
    rm -fr *.o

это правило напечатает:

$>make clean   
rm -fr *.o

$>

Как мне этого избежать?

Ответы [ 5 ]

69 голосов
/ 30 июня 2010

Для начала: фактическая команда должна быть на следующей строке (или, по крайней мере, в случае с GNU Make, она может отличаться от других команд Make - я в этом не уверен)

clean:
    rm -rf *.o

(обратите внимание, вам нужно TAB перед rm -rf *.o, как в каждом правиле)

Сделать молчание можно, добавив префикс @:

поэтому ваш make-файл становится

clean:
    @rm -rf *.o

Если нет файлов *.o для удаления, вы все равно можете получить сообщение об ошибке. Чтобы подавить их, добавьте следующее

clean:
    -@rm -rf *.o 2>/dev/null || true
  • 2>/dev/null передает любое сообщение об ошибке в / dev / null, поэтому вы не увидите ошибок
  • - перед командой гарантирует, что make игнорирует ненулевой код возврата
24 голосов
/ 30 июня 2010

На самом деле я искал что-то еще, добавив эту строку в Makefile:

.SILENT:clean

while выполняет каждый шаг "чистой" цели в молчании.

Пока кто-то не укажет на это, я использую это как свое любимое решение!

14 голосов
/ 05 июня 2016

Я отвечаю на эту древнюю тему, потому что она поднимается высоко в поиске, а ответы сбивают с толку. Чтобы сделать то, что хочет пользователь, все, что нужно, это:

clean:
    @rm -f *.o

@ означает, что make не будет отображать эту команду. Аргумент -f для rm указывает rm игнорировать любые ошибки, например, отсутствие файлов * 1007, и всегда возвращать успех.

Я удалил -r из примера OP, потому что он означает рекурсивный, и здесь мы просто rm ing .o файлов, и ничего не рекурсивно.

Нет необходимости в 2>&1 >/dev/null, потому что с -f не будет печататься ошибок.

.SILENT: clean

работает вместо @, но он не находится в том же месте в Makefile, что и команда, на которую он влияет, поэтому кто-то, обслуживающий проект позже, может быть сбит с толку. Вот почему @ предпочтительнее. Это лучше месторасположение ссылки.

8 голосов
/ 30 июня 2010

Если вы ставите @ перед командой, она не отражается на оболочке.Попробуйте изменить rm на @rm.( Ссылка )

4 голосов
/ 29 августа 2013

Из руководства: .SILENT по сути устарел, поскольку @ более гибок.

Гораздо хуже то, что make печатает слишком много информации.Предупреждение / ошибка / личные сообщения скрыты в выводе.С другой стороны, -s (.SILENT) подавляет все, что угодно.Особенно сообщения «ничего не поделать» и «обновленные» могут быть проблемой.Нет возможности их подавить.Вы должны активно отфильтровывать их или использовать что-то вроде colormake .Вот решение для grep :

make | egrep -hiv 'nothing to be done|up to date'

Но на выходе будут номера строк.Поэтому решение Perl лучше, потому что оно подавляет номера строк и сразу очищает стандартный вывод:

make | perl -ne '$|=1; print unless /nothing to be done|up to date/i'

Создает некорректный инструмент. «Что не так с GNU make?» объясняет это лучше, чем я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...