build: add target to run cppcheck

The advantage of having a target as opposed to running cppcheck by
hand

  - reuse list of source files
  - output errors in a format parsable, e.g. by emacs
  - returns exit code 1 on any error, for possibly use in other
    targets.

For the moment, leave this as an optional target. If desired, it can
be added to e.g. the release targets in the same way as the test
target.

Using two levels of directory for the stamps is arguably
overengineering, but it doesn't really cost anything, and leaves open
the possibility of putting other kinds of stamp files there.

This only checks "new" source files (w.r.t. their last check). A future target
(cppcheck-all ?) could blow away the stamp files first.
This commit is contained in:
David Bremner 2017-08-29 08:35:26 -03:00
parent 8c7d979f5d
commit af64530d3f
2 changed files with 29 additions and 0 deletions

View file

@ -199,6 +199,14 @@ quiet ?= $($(word 1, $(1)))
@mkdir -p $(patsubst %/.,%,.deps/$(@D))
$(call quiet,CC $(CPPFLAGS) $(CFLAGS)) -c $(FINAL_CFLAGS) $< -o $@ -MD -MP -MF .deps/$*.d
CPPCHECK=cppcheck
.stamps/cppcheck/%: %
@mkdir -p $(@D)
$(call quiet,CPPCHECK,$<) --template=gcc --error-exitcode=1 --quiet $<
@touch $@
CLEAN := $(CLEAN) .stamps
.PHONY : clean
clean:
rm -rf $(CLEAN)
@ -284,6 +292,16 @@ CLEAN := $(CLEAN) .deps
DISTCLEAN := $(DISTCLEAN) .first-build-message Makefile.config sh.config
CPPCHECK_STAMPS := $(SRCS:%=.stamps/cppcheck/%)
.PHONY: cppcheck
ifeq ($(HAVE_CPPCHECK),1)
cppcheck: ${CPPCHECK_STAMPS}
else
cppcheck:
@echo "No cppcheck found during configure; skipping static checking"
endif
DEPS := $(SRCS:%.c=.deps/%.d)
DEPS := $(DEPS:%.cc=.deps/%.d)
-include $(DEPS)

11
configure vendored
View file

@ -646,6 +646,14 @@ if [ $WITH_DESKTOP = "1" ]; then
fi
fi
printf "Checking for cppcheck... "
if command -v cppcheck > /dev/null; then
have_cppcheck=1
printf "Yes.\n"
else
printf "No.\n"
fi
libdir_in_ldconfig=0
printf "Checking which platform we are on... "
@ -1065,6 +1073,9 @@ zsh_completion_dir = ${ZSHCOMLETIONDIR:=\$(prefix)/share/zsh/functions/Completio
# build its own version)
HAVE_CANONICALIZE_FILE_NAME = ${have_canonicalize_file_name}
# Whether the cppcheck static checker is available
HAVE_CPPCHECK = ${have_cppcheck}
# Whether the getline function is available (if not, then notmuch will
# build its own version)
HAVE_GETLINE = ${have_getline}