Сценарий оболочки для эмуляции предупреждений как ошибок? - PullRequest
0 голосов
/ 20 апреля 2009

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

К сожалению, некоторые компиляторы не имеют флаг для предупреждений как ошибок.

Мне нужно написать скрипт оболочки или оболочку, обеспечивающую эту функцию.

Предположительно, он анализирует выходные данные консоли компиляции и возвращает ошибку, если были какие-либо предупреждения компилятора ( или ошибки ), и в противном случае успешное выполнение. «Отказ» также означает (я думаю), что объектный код не должен создаваться.

Какой самый короткий и простой сценарий оболочки UNIX / Linux, который вы можете написать, который отвечает явным требованиям, указанным выше, а также следующим неявным требованиям, которые ведут себя как компилятор: - принимает все флаги, опции, аргументы - поддерживает перенаправление stdout и stderr - создает объектный код и ссылки в соответствии с указаниями

Ключевые слова: элегантный, соответствует всем требованиям.

Дополнительный кредит: легко включить в файл GNU make.

Спасибо за вашу помощь.

=== Подсказки === Это решение другой проблемы, использующее функции оболочки (?), Добавление текста к перенаправлениям stderr в bash , может найти значение. Интересно, как пригласить друга litb , который знает bash неплохо "ответить на мой вопрос?

=== Статус ответа ===

Спасибо Чарли Мартину за короткий ответ, но с этого я, к сожалению, и начал. Некоторое время назад я использовал это, выпустил его для использования в офисе, и через несколько часов мне был отмечен его самый серьезный недостаток: он ПРОЙДЕТ компиляцию без предупреждений, а только с ошибками. Это действительно плохо, потому что тогда мы предоставляем объектный код, который компилятор уверен, не будет работать. Простое решение также не соответствует другим перечисленным требованиям.

Спасибо Адаму Розенфилду за стенографию и Крису Додду за введение несанкционированного доступа к решению. Chris ' ответ выглядит ближе всего, потому что я думаю, что pipefail должен гарантировать, что если компиляция действительно завершится с ошибкой, мы получим ошибку, как и должны были. Крис, работает ли pipefail во всех оболочках? И есть какие-нибудь идеи по поводу остальных неявных требований, перечисленных выше?

Ответы [ 5 ]

1 голос
/ 29 июля 2010

Как насчет замены команды make функцией "make", которая меняет потоки stdout и stderr:

# cf. http://codesnippets.joyent.com/posts/show/8769
unset -f make
function make() { 
   command make "${@}" 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr | \
        grep -E -i --line-buffered 'error|warning' | \
        head -n 1 > stderr_make.log && { echo; return 1; }
   return 0 
}
0 голосов
/ 30 июля 2010

Вот еще одна версия функции make (для Bash), которая также может регистрировать стандартный вывод:

# cf. http://wiki.bash-hackers.org/howto/redirection_tutorial
unset -f make
function make() {    # logs stdout & stderr
  { 
     { 
        command make "${@}" 3>&- | 
           tee stdout_make.log 2>&3 3>&- 
     } 2>&1 >&4 4>&- | 
        grep -E -i --line-buffered 'error|warning' 2>&3 3>&- | 
           head -n 1 > stderr_make.log && 
              { echo; cat stderr_make.log; echo; return 1; }
  } 3>&2 4>&1 

  return 0 
}
0 голосов
/ 21 апреля 2009

Это должно сработать:

$ if compile-command |& tee /dev/tty | grep -q 'Warning'; then false; else true; fi

Конструкция |& является сокращением для 2>&1 | (то есть перенаправляет как stdout, так и stderr в конвейер). Помещение tee /dev/tty в конвейер гарантирует, что вы все равно увидите выходные данные компилятора на консоли, а передача его в grep -q 'Warning' сделает состояние выхода равным 1, если предупреждения не были найдены, или 0, если какие-либо предупреждения были найдены. Наконец, перенос в if ...; then false; else true; fi инвертирует статус выхода, поэтому статус выхода равен 0, если предупреждения не были найдены (успех), или 1, если какие-либо предупреждения были найдены (сбой).

0 голосов
/ 21 апреля 2009

Пока вы используете bash, что-то вроде:

set -o pipefail; compile-command 2>&1 | if grep -q -i warning; then exit 1; fi

должен сделать трюк

0 голосов
/ 20 апреля 2009

Хммм.

$ (команда компиляции 2> & 1 | grep 'Warning') && exit 1

Это не очень полезно, но вы указали "самый короткий". Конечно, строка «Warning» должна быть изменена, чтобы соответствовать компилятору.

Лучшей версией будет передача данных через grep, поиск предупреждений и установка флага, а затем, если флаг установлен, вывести сообщение о найденных предупреждениях и выйти с кодом возврата, отличным от 0.

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