Подтвердить что ты не робот

Подавлять сообщения в make clean (Makefile silent remove)

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

clean:
    rm -fr *.o

это правило будет печатать:

$>make clean   
rm -fr *.o

$>

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

4b9b3361

Ответ 1

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

.SILENT:clean

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

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

Ответ 2

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

clean:
    rm -rf *.o

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

Замораживание может быть выполнено с помощью префикса @:

поэтому ваш make файл станет

clean:
    @rm -rf *.o

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

clean:
    [email protected] -rf *.o 2>/dev/null || true
  • 2>/dev/null выводит любое сообщение об ошибке в /dev/null - поэтому вы не увидите никаких ошибок.
  • - перед командой гарантирует, что make игнорирует ненулевой код возврата

Ответ 3

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

clean:
    @rm -f *.o

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

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

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

.SILENT: clean

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Сделайте неправильный инструмент. "Что не так с GNU make?" объясняет это лучше, чем я могу.