Я хочу добавить cpplint.py (https://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py) в проект на основе autotools. Кто-нибудь знает правильный способ сделать это?Добавление перемычки к системе построения на основе autotools
ответ
Предположим, вы хотите запустить linter на всех исходных файлах .cpp
как часть make
. Давайте также предположим, что linter находится на вашем пути, и вы не распространяете его копию как часть вашего пакета.
Прежде всего, проверьте, чтобы убедиться, что у вас есть линт доступен в configure.ac
:
AC_PATH_PROG([CPPLINT], [cpplint.py], [true])
AS_IF([test "x$CPPLINT" = xtrue],
[AC_MSG_WARN([We recommend cpplint.py for developing this package.
Get it from https://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py
and put it in your path, or point the CPPLINT environment variable at it.])])
Смотрите ниже для объяснения true
, которые в данном случае не означают истинное значение Boolean. Если вы хотите сделать linter абсолютным требованием, вместо этого используйте AC_MSG_ERROR
.
Лучший способ сделать это - написать код Makefile и вставить его в цель Automake all-local
. Если linter недоступен, тогда это красиво вызовет команду true
, которая ничего не сделает.
lint: $(myprogram_SOURCES)
-$(CPPLINT) $^
all-local: lint
.PHONY: lint
Это предполагает, что ваши исходные файлы будут linted все хранятся в переменной myprogram_SOURCES
. В зависимости от вашей установки вы, вероятно, будете иметь их в другой переменной или более одной.
Если вы использовали файл штампа вместо фальшивой цели, возможно, вы даже можете заставить его использовать только измененные файлы, используя $?
вместо $^
.
-
в начале рецепта сообщает Make игнорировать ошибки из этого правила. Это важно, потому что в противном случае, если у вас есть хотя бы одна ошибка линтирования, сборка завершится неудачно! Это было бы очень неприятно, потому что некоторым людям нравится сначала писать и тестировать грубый код, а потом очищать. С другой стороны, это решение также позволяет людям полностью игнорировать ошибки перевязки.
По этой причине я бы рекомендовал перемещать листинг до make check
. Таким образом, люди могут развиваться независимо от того, что они хотят, компилируя с помощью make
, но вы можете потребовать передачи нового кода make check
. Для этого снимите -
перед $(CPPLINT)
и измените all-local
на check-local
.
Спасибо за этот очень подробный ответ. Я пойму способ интегрировать это в свою собственную систему сборки. – Anirudh
Ответ на flip будет 'dist_noinst_SCRIPTS = cpplint.py', но, возможно, вы имеете в виду, как запустить linter как часть' make check'? Непонятно, о чем вы спрашиваете. – ptomato
Идеально как часть цели по умолчанию для себя. Я хотел бы, чтобы он был похож на то, как компилятор/препроцессор работает в определенном исходном файле. – Anirudh