summaryrefslogtreecommitdiffstats
path: root/lib/lint-c.mk
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lint-c.mk')
-rw-r--r--lib/lint-c.mk154
1 files changed, 154 insertions, 0 deletions
diff --git a/lib/lint-c.mk b/lib/lint-c.mk
new file mode 100644
index 0000000..0725696
--- /dev/null
+++ b/lib/lint-c.mk
@@ -0,0 +1,154 @@
+# Copyright 2022 Alejandro Colomar <alx@kernel.org>
+# SPDX-License-Identifier: LGPL-3.0-or-later WITH LGPL-3.0-linking-exception
+
+
+ifndef LIB_LINT_C_MK_
+LIB_LINT_C_MK_ := 1
+
+
+include $(srcdir)/lib/build.mk
+include $(srcdir)/lib/build-lib.mk
+include $(srcdir)/lib/src.mk
+include $(srcdir)/lib/version.mk
+
+
+DEFAULT_CLANGFLAGS := -Weverything
+DEFAULT_CLANGFLAGS += -Wno-empty-translation-unit
+DEFAULT_CLANGFLAGS += -Wno-format-nonliteral
+DEFAULT_CLANGFLAGS += -Wno-nullability-extension
+DEFAULT_CLANGFLAGS += -Wno-pointer-arith
+DEFAULT_CLANGFLAGS += -Wno-sign-conversion
+DEFAULT_CLANGFLAGS += -Wno-unused-command-line-argument
+DEFAULT_CLANGFLAGS += -Wno-unused-macros
+DEFAULT_CLANGFLAGS += -Wno-zero-length-array
+EXTRA_CLANGFLAGS :=
+CLANGFLAGS := $(DEFAULT_CLANGFLAGS) $(EXTRA_CLANGFLAGS)
+
+CHECKPATCH_CONF := $(srcdir)/etc/checkpatch/checkpatch.conf
+DEFAULT_CHECKPATCHFLAGS :=
+EXTRA_CHECKPATCHFLAGS :=
+CHECKPATCHFLAGS := $(DEFAULT_CHECKPATCHFLAGS) $(EXTRA_CHECKPATCHFLAGS)
+CHECKPATCH := checkpatch
+
+CLANG-TIDY_CONF := $(srcdir)/etc/clang-tidy/config.yaml
+DEFAULT_CLANG-TIDYFLAGS := --config-file=$(CLANG-TIDY_CONF)
+DEFAULT_CLANG-TIDYFLAGS += --quiet
+DEFAULT_CLANG-TIDYFLAGS += --use-color
+EXTRA_CLANG-TIDYFLAGS :=
+CLANG-TIDYFLAGS := $(DEFAULT_CLANG-TIDYFLAGS) $(EXTRA_CLANG-TIDYFLAGS)
+CLANG-TIDY := clang-tidy
+
+CPPLINT_CONF := $(srcdir)/etc/cpplint/cpplint.cfg
+DEFAULT_CPPLINTFLAGS :=
+EXTRA_CPPLINTFLAGS :=
+CPPLINTFLAGS := $(DEFAULT_CPPLINTFLAGS) $(EXTRA_CPPLINTFLAGS)
+CPPLINT := cpplint
+
+CPPCHECK_CONF := $(srcdir)/etc/cppcheck/cppcheck.suppress
+DEFAULT_CPPCHECKFLAGS := --enable=all
+DEFAULT_CPPCHECKFLAGS += --error-exitcode=2
+DEFAULT_CPPCHECKFLAGS += --inconclusive
+DEFAULT_CPPCHECKFLAGS += --quiet
+DEFAULT_CPPCHECKFLAGS += --suppressions-list=$(CPPCHECK_CONF)
+EXTRA_CPPCHECKFLAGS :=
+CPPCHECKFLAGS := $(DEFAULT_CPPCHECKFLAGS) $(EXTRA_CPPCHECKFLAGS)
+CPPCHECK := cppcheck
+
+DEFAULT_IWYUFLAGS := -Xiwyu --no_fwd_decls
+DEFAULT_IWYUFLAGS += -Xiwyu --error
+EXTRA_IWYUFLAGS :=
+IWYUFLAGS := $(DEFAULT_IWYUFLAGS) $(EXTRA_IWYUFLAGS)
+IWYU := iwyu
+
+
+_TU_h_ckp := $(addsuffix .lint-c.checkpatch.touch,$(_TU_h))
+_TU_c_ckp := $(addsuffix .lint-c.checkpatch.touch,$(_TU_c))
+_TU_ckp := $(_TU_h_ckp) $(_TU_c_ckp)
+
+_TU_h_ct := $(addsuffix .lint-c.clang-tidy.touch,$(_TU_h))
+_TU_c_ct := $(addsuffix .lint-c.clang-tidy.touch,$(_TU_c))
+_TU_ct := $(_TU_h_ct) $(_TU_c_ct)
+
+_TU_h_cck := $(addsuffix .lint-c.cppcheck.touch,$(_TU_h))
+_TU_c_cck := $(addsuffix .lint-c.cppcheck.touch,$(_TU_c))
+_TU_cck := $(_TU_h_cck) $(_TU_c_cck)
+
+_TU_h_cpl := $(addsuffix .lint-c.cpplint.touch,$(_TU_h))
+_TU_c_cpl := $(addsuffix .lint-c.cpplint.touch,$(_TU_c))
+_TU_cpl := $(_TU_h_cpl) $(_TU_c_cpl)
+
+_TU_h_iwyu := $(addsuffix .lint-c.iwyu.touch,$(_TU_h))
+_TU_c_iwyu := $(addsuffix .lint-c.iwyu.touch,$(_TU_c))
+_TU_iwyu := $(_TU_h_iwyu) $(_TU_c_iwyu)
+
+
+_LIB_cck := $(builddir)/$(libname).lint-c.cppcheck.touch
+
+
+$(_TU_ckp): %.lint-c.checkpatch.touch: % $(CHECKPATCH_CONF) $(mk) | %.d $$(@D)/
+ $(info LINT (checkpatch) $@)
+ $(CHECKPATCH) $(CHECKPATCHFLAGS) -f $<
+ $(TOUCH) $@
+
+$(_TU_ct): %.lint-c.clang-tidy.touch: % $(CLANG-TIDY_CONF) $(mk) | %.d $$(@D)/
+ $(info LINT (clang-tidy) $@)
+ $(CLANG-TIDY) $(CLANG-TIDYFLAGS) $< -- \
+ $(CPPFLAGS) $(CFLAGS) $(CLANGFLAGS) 2>&1 \
+ | $(SED) '/generated\.$$/d'
+ $(TOUCH) $@
+
+$(_TU_cck): %.lint-c.cppcheck.touch: % $(CPPCHECK_CONF) $(mk) | %.d $$(@D)/
+ $(info LINT (cppcheck) $@)
+ $(CPPCHECK) $(CPPCHECKFLAGS) -I $(INCLUDEDIR) $<
+ $(TOUCH) $@
+
+$(_LIB_cck): %.lint-c.cppcheck.touch: $(_TU_c) $(_TU_h) $(CPPCHECK_CONF) $(mk) | $$(@D)/
+ $(info LINT (cppcheck) $@)
+ $(CPPCHECK) $(CPPCHECKFLAGS) -I $(INCLUDEDIR) $(_TU_c) $(_TU_h)
+ $(TOUCH) $@
+
+$(_TU_cpl): %.lint-c.cpplint.touch: % $(CPPLINT_CONF) $(mk) | %.d $$(@D)/
+ $(info LINT (cpplint) $@)
+ $(CPPLINT) $(CPPLINTFLAGS) $< >/dev/null
+ $(TOUCH) $@
+
+$(_TU_iwyu): %.lint-c.iwyu.touch: % $(mk) | %.d $$(@D)/
+ $(info LINT (iwyu) $@)
+ $(IWYU) $(IWYUFLAGS) $(CPPFLAGS) $(CFLAGS) $(CLANGFLAGS) $< 2>&1 \
+ | $(TAC) \
+ | $(SED) '/correct/{N;d}' \
+ | $(TAC)
+ $(TOUCH) $@
+
+
+linters_c := checkpatch clang-tidy cppcheck cpplint iwyu
+lint_c := $(foreach x,$(linters_c),lint-c-$(x))
+
+
+.PHONY: lint-c-checkpatch
+lint-c-checkpatch: $(_TU_ckp)
+ @:
+
+.PHONY: lint-c-clang-tidy
+lint-c-clang-tidy: $(_TU_ct)
+ @:
+
+.PHONY: lint-c-cppcheck
+lint-c-cppcheck: $(_TU_cck) $(_LIB_cck)
+ @:
+
+.PHONY: lint-c-cpplint
+lint-c-cpplint: $(_TU_cpl)
+ @:
+
+.PHONY: lint-c-iwyu
+lint-c-iwyu: $(_TU_iwyu)
+ @:
+
+
+.PHONY: lint-c
+lint-c: $(lint_c)
+ @:
+
+
+endif # include guard