为基于autotools的构建系统添加linting

时间:2015-04-23 01:26:17

标签: c++ autotools lint

我想将cpplint.py(https://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py)添加到基于autotools的项目中。有没有人知道这样做的正确方法?

2 个答案:

答案 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-tidycppcheck

这还可以确保-j正常运行。 $^可以是数十个文件,这些文件可以完成1项皮棉工作,并且永久使用。这种方法有些古怪,但是每个文件只能完成1个皮棉作业。