Я хотел бы улучшить существующий Make-файл, чтобы он выводил количество предупреждений и / или ошибок, которые возникли в процессе сборки.
Моя основная идея c заключается в том, что должен быть способ передать вывод в grep
и получить количество вхождений определенной строки в потоке stderr или stdout (т. е. «Warning:»), сохраненных в переменную, которая затем может быть просто выведена на экран в конце команды make .
Требования / Задачи:
- Текущие коды выхода и выхода консоли должны оставаться одинаковыми
Это означает, что даже без изменения управляющих символов. Dev, использующий MakeFile, не должен распознавать разницу с тем, что было до моего изменения (кроме приятного дополнительного вывода счетчика предупреждений в конце процесса make). Любые подходы с tee
, которые я пробовал до сих пор, не увенчались успехом, так как цветовая кодировка сообщений stderr в консоли теряется, изменяя их на все черно-белые. 1016 *
В настоящее время проект создается Win / OSX / Linux devs, и поэтому ему необходимо работать со стандартными инструментами, доступными в большинстве оболочек * nix / CygWin. Введение другой зависимости, такой как unbuffer
, не вариант. - Он должен быть стабильным и не иметь побочных эффектов (см. Также 5).
Если процесс создания прерывается (т. Е. Пользователь нажимает CTRL+C
или для любого другого причина), не должно быть никаких побочных эффектов (например, наличие потерянного файла журнала для вывода на диске) - (Бонус) Это должно быть эффективным Количество вывода может получить> 1 МБ и более, поэтому просто передача в файл и
grep
это будет небольшим ударом по производительности, а также будет добавлен дисковый ввод-вывод (что излишне замедлит сборку). Мне просто интересно, нельзя ли это сделать без временного файла, так как я понимаю каналы как своего рода «потоки», которые просто нужно проанализировать как поток через. - (Bonus) Сделать это независимый от локали без изменения токового выхода
В зависимости от текущей локали, строка для grep и count локализуется по-разному, т.е. «Warning:» (en_US.utf8
) или «Warnung:» (de_DE.utf8
). Конечно, я мог бы переключить локаль на en_US
в Makefile, но это изменило бы вывод консоли для пользователей (следовательно, нарушая требование 1.), поэтому я хотел бы знать, есть ли какой-нибудь (эффективный) подход, который вы могли бы придумать для этого ,
В конце дня я смогу сделать с solid решением, которое просто удовлетворяет требованию 1. + 2.
Если от 3 до 5. это невозможно сделать, тогда я должен был бы убедить сопровождающих проекта внести некоторые изменения в .gitignore
, чтобы процесс сборки немного занимал больше времени и ресурсов, и / или исправить вывод make только на engli sh но я предполагаю, что они согласятся, что это того стоит.
Текущее решение
Лучшее, что у меня есть, это:
script -eqc "make" make.log && WARNING_COUNT=$(grep -i --count "Warning:" make.log)" && rm make.log || rm make.log
Это соответствует моим требованиям 1, 2 и почти нет. 3: по-прежнему, если во время выполнения команды аппарат отключился, make.log
останется нежелательным артефактом. Также повторение rm make.log
выглядит безобразно.
Так что я открыт для альтернативных подходов и улучшений любого. Заранее спасибо.