Makefile: сохранить количество предупреждений в переменной без использования временного файла - PullRequest
0 голосов
/ 21 апреля 2020

Я хотел бы улучшить существующий Make-файл, чтобы он выводил количество предупреждений и / или ошибок, которые возникли в процессе сборки.

Моя основная идея c заключается в том, что должен быть способ передать вывод в grep и получить количество вхождений определенной строки в потоке stderr или stdout (т. е. «Warning:»), сохраненных в переменную, которая затем может быть просто выведена на экран в конце команды make .

Требования / Задачи:

  1. Текущие коды выхода и выхода консоли должны оставаться одинаковыми
    Это означает, что даже без изменения управляющих символов. Dev, использующий MakeFile, не должен распознавать разницу с тем, что было до моего изменения (кроме приятного дополнительного вывода счетчика предупреждений в конце процесса make). Любые подходы с tee, которые я пробовал до сих пор, не увенчались успехом, так как цветовая кодировка сообщений stderr в консоли теряется, изменяя их на все черно-белые. 1016 *
    В настоящее время проект создается Win / OSX / Linux devs, и поэтому ему необходимо работать со стандартными инструментами, доступными в большинстве оболочек * nix / CygWin. Введение другой зависимости, такой как unbuffer, не вариант.
  2. Он должен быть стабильным и не иметь побочных эффектов (см. Также 5).
    Если процесс создания прерывается (т. Е. Пользователь нажимает CTRL+C или для любого другого причина), не должно быть никаких побочных эффектов (например, наличие потерянного файла журнала для вывода на диске)
  3. (Бонус) Это должно быть эффективным Количество вывода может получить> 1 МБ и более, поэтому просто передача в файл и grep это будет небольшим ударом по производительности, а также будет добавлен дисковый ввод-вывод (что излишне замедлит сборку). Мне просто интересно, нельзя ли это сделать без временного файла, так как я понимаю каналы как своего рода «потоки», которые просто нужно проанализировать как поток через.
  4. (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 выглядит безобразно.

Так что я открыт для альтернативных подходов и улучшений любого. Заранее спасибо.

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