Есть ли какие-нибудь контролеры ворса для make файлов?

Я знаю, что есть много линтеров для языков программирования, таких как pep8 для python, но я никогда не сталкивался с одним из них для makefile. Есть ли такие линтеры для makefile?

Поскольку я перерос в использование makefile, он становится все более сложным и длинным, и для меня было бы разумно иметь линтер, чтобы сделать makefile более читабельным.

Ответы

Ответ 1

Единственное, что напоминает поведение lint - это опция командной строки --warn-undefined-variables

Ответ 2

Вещи, видимо, изменились. Я нашел следующее:

Из этих двух Checkmake имеет (по состоянию на 2018/11) более позднюю разработку, но я тоже не пробовал.

Ответ 3

Я также не знаю, где найти make file lint (поиск в Интернете "make file lint" получил меня здесь), но вот неполный список мелких фрагментов идеи для реализации утилиты lint make file...

  • Белые пространства - один из аспектов читаемости, поскольку вкладки и пробелы имеют четкую семантику в файле make. Emacs makefile-mode по умолчанию предупреждает вас о "подозрительных" строках при попытке сохранить файл make с сильно разнесенными вкладками. Возможно, было бы возможно запустить emacs в пакетном режиме и вызвать функции синтаксического анализа и проверки из этого режима. Если кто-то должен был приступить к реализации такой утилиты lint make файла, то режим emacs lisp может быть интересен для проверки.

  • О проверке правильности, @Mark Galeck в его ответе уже упоминался --warn-undefined-variables. Проблема в том, что из undefined имеется много выходных данных, но стандартизованных переменных. Чтобы улучшить эту идею, можно было бы добавить простую оболочку, чтобы отфильтровать сообщения об этих переменных, чтобы можно было определить реальные опечатки. В этом случае make можно запустить с опцией --just-print (aka -n или --dry-run), чтобы не запускать фактические команды для построения целей.

  • Не рекомендуется выполнять какие-либо изменения, когда make запускается с опцией --just-print. Было бы полезно grep для вызовов функций $(shell ...) и попытаться сделать, чтобы из них ничего не изменилось. Первая итерация того, что мы могли проверить: $(shell pwd) и некоторые другие общие неразрушающие применения, в порядке, что-нибудь еще должно вызывать предупреждение для ручной проверки.

  • Мы могли бы grep для $ не следовать ( (может быть, что-то вроде [$][^$(][[:space:]], выраженное в регулярных выражениях POSIX), чтобы улавливать такие случаи, как $VARIABLE, который анализирует как $(V)ARIABLE и, возможно, автор намеревался, а также не имеет хорошего стиля.

Проблема с файлами make заключается в том, что они настолько сложны со всеми вложенными конструкциями, как $(shell), $(call), $(eval) и оценками правил; результаты могут меняться от ввода из среды или командной строки или вызова make invocations; также существует много неявных правил или других определений, которые делают любой более глубокий семантический анализ проблематичным. Я думаю, что все-compassing делают утилиту lint недоступной (за исключением, возможно, встроенной в самой утилите make), но некоторые кодифицированные рекомендации и эвристические проверки уже оказались бы полезными.