Shave: чистим вывод make при использовании Autotools
Не люблю, когда make выплевывает километры всякого мусора. Зачем мне для каждого файла полный вызов gcc со всеми флагами? Спасибо, я эти флаги сам задавал, знаю что к чему. Зато среди всей этой ерунды пропустить что-то важное — проще простого. Значит, надо как-то выделить важное, а неважное вовсе не показывать. Вот какой я мудрый!
В обычных Makefile’ах все просто:
chset.c: chset.lex
@echo " FLEX $(@:.c=)"
@$(LEX) --outfile=$@ $<Символ ‘@’, указанный перед командой, подавляет вывод на stdout, оставляя возможность увидеть ошибки, выводимые в stderr. Строчка-подсказка выводится как раз для того, чтобы увидеть, на каком этапе сборки произошла ошибка, если таковая будет.
При использовании Autotools все становится сложнее, тут уже одними собачками не обойдешься. Интересное решение предлагает Shave: он подменяет вызовы компилятора и libtool на вызовы своих сценариев, которые молча выполняют все что нужно, а выводят только краткую диагностику, как в предыдущем примере. Вот так, например:
[nkalex@stables build]$ make Making all in src CC main.o CC msg.o CC ctype.o CC collate.o CC charset.o CC ldefpars.o CC locopts.o CC chset.o CC ldeflex.o LINK localedef
Как настраивать Shave, написано в его кратком руководстве, но там есть пара граблей, на которые я не преминул наступить. Поэтому лучше уж я свою инструкцию напишу, чтоб люди не мучались.
- Делаем нормально собирающийся проект, использующий Automake и Autoconf.
- Скачиваем Shave по адресу http://download.lespiau.name/shave.
- Сценарии shave.in и shave-libtool.in кладем в корневой каталог проекта.
- Файл shave.m4 копируем в файл acinclude.m4 в корневом каталоге проекта.
- Вносим изменения в configure.ac:
- даже если не используем libtool, добавляем строку
LT_INIT
- добавляем сценарии Shave в AC_CONFIG_FILES, чтобы получилось как-то так:
AC_CONFIG_FILES([ shave shave-libtool Makefile src/Makefile ])
- сразу перед AC_CONFIG_FILES добавляем строчку
SHAVE_INIT(.,enable)
- даже если не используем libtool, добавляем строку
- Если не пользовались до этого libtool, в корневом каталоге нужно вызвать
$ libtoolize $ automake --add-missing
- Profit!
Теперь по умолчанию Shave включен, и вывод при сборке будет кратким. Чтобы все-таки посмотреть подробный вывод, нужно добавить ключ в вызов configure:
$ configure --disable-shave
Грабли, на которые я наступил, заключались в необходимости включить поддержку libtool. Без этого вызов SHAVE_INIT выдает крайне невнятную диагностику в духе syntax error, и пришлось читать shave.m4, чтобы разобраться, в чем, собственно, дело.



