我想将cpplint.py(https://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py)添加到基于autotools的项目中。有没有人知道这样做的正确方法?
答案 0 :(得分:4)
假设您希望在.cpp
的一部分中对所有make
源文件运行linter。我们还假设linter在你的路径中,并且你没有将它的副本作为你的包的一部分分发。
首先检查以确保configure.ac
中有可用的linter:
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
的解释,在这种情况下并不代表布尔值。如果您想使linter成为绝对要求,请改用AC_MSG_ERROR
。
使其运行的最佳方法是编写Makefile代码并将其挂钩到Automake的all-local
目标中。如果linter不可用,那么这将很好地调用true
命令,该命令将不执行任何操作。
lint: $(myprogram_SOURCES)
-$(CPPLINT) $^
all-local: lint
.PHONY: lint
这假定您要删除的源文件都存储在变量myprogram_SOURCES
中。根据您的设置,您可能会将它们放在不同的变量中,或者不止一个。
如果您使用了戳记文件而不是虚假目标,那么您甚至可以使用$?
而不是$^
来仅使用lint来修改已更改的文件。
配方开头的-
告诉Make忽略该规则的错误。这很重要,因为否则如果你有一个linting错误,那么构建将失败!这将是非常烦人的,因为有些人喜欢先编写和测试粗略的代码,然后再进行清理。另一方面,这个解决方案也让人们完全忽略掉毛错误。
出于这个原因,我建议将linting移动到make check
。这样,人们就可以开发他们想要的任何方式,使用make
进行编译,但是您可以要求任何新代码传递make check
。为此,请移除-
前面的$(CPPLINT)
并将all-local
更改为check-local
。
答案 1 :(得分:0)
受@ptomato的回答启发,我已开始在项目中进行此操作。
# Make this OK to fail, tee our lint to the file as well.
LINTER_FLAGS ?= -- -I. $(AM_CPPFLAGS) $(DEFS)
%.c.lint: %.c
- $(LINTER) $? $(LINTER_FLAGS) | tee $@
# Select only C files
# We have to abuse the auto rule above so that -j works
lint: $(subst .c,.c.lint, $(filter %.c,$(lint_files)))
.PHONY: lint
check-local: lint
clean-local:
rm -f *.lint
这使我们可以轻松使用clang-tidy
或cppcheck
。
这还可以确保-j
正常运行。 $^
可以是数十个文件,这些文件可以完成1项皮棉工作,并且永久使用。这种方法有些古怪,但是每个文件只能完成1个皮棉作业。