From af64530d3f93dd1c379ad3ba93608ca5ad700598 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Tue, 29 Aug 2017 08:35:26 -0300 Subject: [PATCH] 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. --- Makefile.local | 18 ++++++++++++++++++ configure | 11 +++++++++++ 2 files changed, 29 insertions(+) diff --git a/Makefile.local b/Makefile.local index 9e2111f5..9d9c52c2 100644 --- a/Makefile.local +++ b/Makefile.local @@ -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) diff --git a/configure b/configure index c5e2ffed..364854f3 100755 --- a/configure +++ b/configure @@ -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}