【问题标题】:Adding linting to autotools-based build system将 linting 添加到基于 autotools 的构建系统中
【发布时间】:2015-06-30 23:04:15
【问题描述】:

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

【问题讨论】:

  • 翻转答案是dist_noinst_SCRIPTS = cpplint.py,但也许您的意思是如何将 linter 作为make check 的一部分运行?不清楚你在问什么。
  • 理想情况下作为 make 自身的默认目标的一部分。我希望它类似于编译器/预处理器在特定源文件上的运行方式。

标签: c++ autotools lint


【解决方案1】:

假设您要在所有 .cpp 源文件上运行 linter,作为 make 的一部分。我们还假设 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

【讨论】:

  • 感谢您提供非常详细的答案。我会想办法把它集成到我自己的构建系统中。
  • 非常好的答案。注意:$^ 不是POSIX make 的一部分。如果想完全在 Autotools 范式中工作,那么,可以选择使用 $? 来代替。
【解决方案2】:

受@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 次 lint 工作并永远持续下去。这种方式有点古怪,但每个文件会产生 1 个 lint 作业。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2023-03-20
    • 2011-11-28
    • 2011-06-07
    • 2015-05-16
    • 2023-03-19
    • 2014-10-18
    相关资源
    最近更新 更多