summaryrefslogtreecommitdiffstats
path: root/lib/lint-c.mk
blob: 59d4c1b2afc7d57417f433d4dbe5c3351ea38527 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# 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)
DEFAULT_CPPCHECKFLAGS += -Uc_unlikely
DEFAULT_CPPCHECKFLAGS += -Uc_unreachable
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) $(_LIB_pc_u) | %.d $$(@D)/
	$(info	LINT (checkpatch)	$@)
	$(CHECKPATCH) $(CHECKPATCHFLAGS) -f $<
	$(TOUCH) $@

$(_TU_ct): %.lint-c.clang-tidy.touch: % $(CLANG-TIDY_CONF) $(mk) $(_LIB_pc_u) | %.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) $(_LIB_pc_u) | %.d $$(@D)/
	$(info	LINT (cppcheck)		$@)
	$(CPPCHECK) $(CPPCHECKFLAGS) -I $(INCLUDEDIR) $<
	$(TOUCH) $@

$(_LIB_cck): %.lint-c.cppcheck.touch: $(_TU_c) $(_TU_h) $(CPPCHECK_CONF) $(mk) $(_LIB_pc_u) | $$(@D)/
	$(info	LINT (cppcheck)		$@)
	$(CPPCHECK) $(CPPCHECKFLAGS) -I $(INCLUDEDIR) $(_TU_c) $(_TU_h)
	$(TOUCH) $@

$(_TU_cpl): %.lint-c.cpplint.touch: % $(CPPLINT_CONF) $(mk) $(_LIB_pc_u) | %.d $$(@D)/
	$(info	LINT (cpplint)		$@)
	$(CPPLINT) $(CPPLINTFLAGS) $< >/dev/null
	$(TOUCH) $@

$(_TU_iwyu): %.lint-c.iwyu.touch: % $(mk) $(_LIB_pc_u) | %.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