.. | .. |
---|
| 1 | +# SPDX-License-Identifier: GPL-2.0 |
---|
1 | 2 | #### |
---|
2 | 3 | # kbuild: Generic definitions |
---|
3 | 4 | |
---|
.. | .. |
---|
15 | 16 | dot-target = $(dir $@).$(notdir $@) |
---|
16 | 17 | |
---|
17 | 18 | ### |
---|
18 | | -# The temporary file to save gcc -MD generated dependencies must not |
---|
| 19 | +# The temporary file to save gcc -MMD generated dependencies must not |
---|
19 | 20 | # contain a comma |
---|
20 | 21 | depfile = $(subst $(comma),_,$(dot-target).d) |
---|
21 | 22 | |
---|
.. | .. |
---|
24 | 25 | basetarget = $(basename $(notdir $@)) |
---|
25 | 26 | |
---|
26 | 27 | ### |
---|
27 | | -# filename of first prerequisite with directory and extension stripped |
---|
28 | | -baseprereq = $(basename $(notdir $<)) |
---|
| 28 | +# real prerequisites without phony targets |
---|
| 29 | +real-prereqs = $(filter-out $(PHONY), $^) |
---|
29 | 30 | |
---|
30 | 31 | ### |
---|
31 | 32 | # Escape single quote for use in echo statements |
---|
32 | 33 | escsq = $(subst $(squote),'\$(squote)',$1) |
---|
| 34 | + |
---|
| 35 | +### |
---|
| 36 | +# Quote a string to pass it to C files. foo => '"foo"' |
---|
| 37 | +stringify = $(squote)$(quote)$1$(quote)$(squote) |
---|
33 | 38 | |
---|
34 | 39 | ### |
---|
35 | 40 | # Easy method for doing a status message |
---|
.. | .. |
---|
41 | 46 | ### |
---|
42 | 47 | # filechk is used to check if the content of a generated file is updated. |
---|
43 | 48 | # Sample usage: |
---|
44 | | -# define filechk_sample |
---|
45 | | -# echo $KERNELRELEASE |
---|
46 | | -# endef |
---|
47 | | -# version.h : Makefile |
---|
| 49 | +# |
---|
| 50 | +# filechk_sample = echo $(KERNELRELEASE) |
---|
| 51 | +# version.h: FORCE |
---|
48 | 52 | # $(call filechk,sample) |
---|
| 53 | +# |
---|
49 | 54 | # The rule defined shall write to stdout the content of the new file. |
---|
50 | 55 | # The existing file will be compared with the new one. |
---|
51 | 56 | # - If no file exist it is created |
---|
52 | 57 | # - If the content differ the new file is used |
---|
53 | 58 | # - If they are equal no change, and no timestamp update |
---|
54 | | -# - stdin is piped in from the first prerequisite ($<) so one has |
---|
55 | | -# to specify a valid file as first prerequisite (often the kbuild file) |
---|
56 | 59 | define filechk |
---|
57 | | - $(Q)set -e; \ |
---|
58 | | - mkdir -p $(dir $@); \ |
---|
59 | | - $(filechk_$(1)) > $@.tmp; \ |
---|
60 | | - if [ -r $@ ] && cmp -s $@ $@.tmp; then \ |
---|
61 | | - rm -f $@.tmp; \ |
---|
62 | | - else \ |
---|
63 | | - $(kecho) ' UPD $@'; \ |
---|
64 | | - mv -f $@.tmp $@; \ |
---|
| 60 | + $(Q)set -e; \ |
---|
| 61 | + mkdir -p $(dir $@); \ |
---|
| 62 | + trap "rm -f $(dot-target).tmp" EXIT; \ |
---|
| 63 | + { $(filechk_$(1)); } > $(dot-target).tmp; \ |
---|
| 64 | + if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \ |
---|
| 65 | + $(kecho) ' UPD $@'; \ |
---|
| 66 | + mv -f $(dot-target).tmp $@; \ |
---|
65 | 67 | fi |
---|
66 | 68 | endef |
---|
67 | 69 | |
---|
68 | 70 | ###### |
---|
69 | 71 | # gcc support functions |
---|
70 | | -# See documentation in Documentation/kbuild/makefiles.txt |
---|
| 72 | +# See documentation in Documentation/kbuild/makefiles.rst |
---|
71 | 73 | |
---|
72 | 74 | # cc-cross-prefix |
---|
73 | 75 | # Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-) |
---|
74 | | -# Return first prefix where a prefix$(CC) is found in PATH. |
---|
75 | | -# If no $(CC) found in PATH with listed prefixes return nothing |
---|
76 | | -cc-cross-prefix = \ |
---|
77 | | - $(word 1, $(foreach c,$(1), \ |
---|
78 | | - $(shell set -e; \ |
---|
79 | | - if (which $(strip $(c))$(CC)) > /dev/null 2>&1 ; then \ |
---|
80 | | - echo $(c); \ |
---|
81 | | - fi))) |
---|
| 76 | +# Return first <prefix> where a <prefix>gcc is found in PATH. |
---|
| 77 | +# If no gcc found in PATH with listed prefixes return nothing |
---|
| 78 | +# |
---|
| 79 | +# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it |
---|
| 80 | +# would try to directly execute the shell builtin 'command'. This workaround |
---|
| 81 | +# should be kept for a long time since this issue was fixed only after the |
---|
| 82 | +# GNU Make 4.2.1 release. |
---|
| 83 | +cc-cross-prefix = $(firstword $(foreach c, $(1), \ |
---|
| 84 | + $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c)))) |
---|
82 | 85 | |
---|
83 | 86 | # output directory for tests below |
---|
84 | 87 | TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$ |
---|
.. | .. |
---|
114 | 117 | __cc-option = $(call try-run,\ |
---|
115 | 118 | $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4)) |
---|
116 | 119 | |
---|
117 | | -# Do not attempt to build with gcc plugins during cc-option tests. |
---|
118 | | -# (And this uses delayed resolution so the flags will be up to date.) |
---|
119 | | -CC_OPTION_CFLAGS = $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS)) |
---|
120 | | - |
---|
121 | 120 | # cc-option |
---|
122 | 121 | # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) |
---|
123 | 122 | |
---|
124 | 123 | cc-option = $(call __cc-option, $(CC),\ |
---|
125 | | - $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS),$(1),$(2)) |
---|
126 | | - |
---|
127 | | -# hostcc-option |
---|
128 | | -# Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586) |
---|
129 | | -hostcc-option = $(call __cc-option, $(HOSTCC),\ |
---|
130 | | - $(KBUILD_HOSTCFLAGS) $(HOST_EXTRACFLAGS),$(1),$(2)) |
---|
| 124 | + $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2)) |
---|
131 | 125 | |
---|
132 | 126 | # cc-option-yn |
---|
133 | 127 | # Usage: flag := $(call cc-option-yn,-march=winchip-c6) |
---|
134 | 128 | cc-option-yn = $(call try-run,\ |
---|
135 | | - $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) |
---|
| 129 | + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) |
---|
136 | 130 | |
---|
137 | 131 | # cc-disable-warning |
---|
138 | 132 | # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) |
---|
139 | 133 | cc-disable-warning = $(call try-run,\ |
---|
140 | | - $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) |
---|
141 | | - |
---|
142 | | -# cc-name |
---|
143 | | -# Expands to either gcc or clang |
---|
144 | | -cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc) |
---|
145 | | - |
---|
146 | | -# cc-version |
---|
147 | | -cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) |
---|
148 | | - |
---|
149 | | -# cc-fullversion |
---|
150 | | -cc-fullversion = $(shell $(CONFIG_SHELL) \ |
---|
151 | | - $(srctree)/scripts/gcc-version.sh -p $(CC)) |
---|
| 134 | + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) |
---|
152 | 135 | |
---|
153 | 136 | # cc-ifversion |
---|
154 | 137 | # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) |
---|
155 | | -cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && echo $(3) || echo $(4)) |
---|
156 | | - |
---|
157 | | -# cc-ldoption |
---|
158 | | -# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) |
---|
159 | | -cc-ldoption = $(call try-run,\ |
---|
160 | | - $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) |
---|
| 138 | +cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4)) |
---|
161 | 139 | |
---|
162 | 140 | # ld-option |
---|
163 | 141 | # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y) |
---|
164 | 142 | ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3)) |
---|
165 | | - |
---|
166 | | -# ar-option |
---|
167 | | -# Usage: KBUILD_ARFLAGS := $(call ar-option,D) |
---|
168 | | -# Important: no spaces around options |
---|
169 | | -ar-option = $(call try-run, $(AR) rc$(1) "$$TMP",$(1),$(2)) |
---|
170 | 143 | |
---|
171 | 144 | # ld-version |
---|
172 | 145 | # Note this is mainly for HJ Lu's 3 number binutil versions |
---|
.. | .. |
---|
185 | 158 | build := -f $(srctree)/scripts/Makefile.build obj |
---|
186 | 159 | |
---|
187 | 160 | ### |
---|
188 | | -# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= |
---|
189 | | -# Usage: |
---|
190 | | -# $(Q)$(MAKE) $(modbuiltin)=dir |
---|
191 | | -modbuiltin := -f $(srctree)/scripts/Makefile.modbuiltin obj |
---|
192 | | - |
---|
193 | | -### |
---|
194 | 161 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj= |
---|
195 | 162 | # Usage: |
---|
196 | 163 | # $(Q)$(MAKE) $(dtbinst)=dir |
---|
197 | | -dtbinst := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.dtbinst obj |
---|
| 164 | +dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj |
---|
198 | 165 | |
---|
199 | 166 | ### |
---|
200 | 167 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj= |
---|
.. | .. |
---|
202 | 169 | # $(Q)$(MAKE) $(clean)=dir |
---|
203 | 170 | clean := -f $(srctree)/scripts/Makefile.clean obj |
---|
204 | 171 | |
---|
205 | | -### |
---|
206 | | -# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.headersinst obj= |
---|
207 | | -# Usage: |
---|
208 | | -# $(Q)$(MAKE) $(hdr-inst)=dir |
---|
209 | | -hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj |
---|
210 | | - |
---|
211 | | -# Prefix -I with $(srctree) if it is not an absolute path. |
---|
212 | | -# skip if -I has no parameter |
---|
213 | | -addtree = $(if $(patsubst -I%,%,$(1)), \ |
---|
214 | | -$(if $(filter-out -I/% -I./% -I../%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)),$(1)) |
---|
215 | | - |
---|
216 | | -# Find all -I options and call addtree |
---|
217 | | -flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) |
---|
218 | | - |
---|
219 | 172 | # echo command. |
---|
220 | 173 | # Short version is used, if $(quiet) equals `quiet_', otherwise full one. |
---|
221 | 174 | echo-cmd = $(if $($(quiet)cmd_$(1)),\ |
---|
222 | 175 | echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) |
---|
223 | 176 | |
---|
224 | | -# printing commands |
---|
225 | | -cmd = @$(echo-cmd) $(cmd_$(1)) |
---|
| 177 | +# sink stdout for 'make -s' |
---|
| 178 | + redirect := |
---|
| 179 | + quiet_redirect := |
---|
| 180 | +silent_redirect := exec >/dev/null; |
---|
226 | 181 | |
---|
227 | | -# Add $(obj)/ for paths that are not absolute |
---|
228 | | -objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) |
---|
| 182 | +# Delete the target on interruption |
---|
| 183 | +# |
---|
| 184 | +# GNU Make automatically deletes the target if it has already been changed by |
---|
| 185 | +# the interrupted recipe. So, you can safely stop the build by Ctrl-C (Make |
---|
| 186 | +# will delete incomplete targets), and resume it later. |
---|
| 187 | +# |
---|
| 188 | +# However, this does not work when the stderr is piped to another program, like |
---|
| 189 | +# $ make >&2 | tee log |
---|
| 190 | +# Make dies with SIGPIPE before cleaning the targets. |
---|
| 191 | +# |
---|
| 192 | +# To address it, we clean the target in signal traps. |
---|
| 193 | +# |
---|
| 194 | +# Make deletes the target when it catches SIGHUP, SIGINT, SIGQUIT, SIGTERM. |
---|
| 195 | +# So, we cover them, and also SIGPIPE just in case. |
---|
| 196 | +# |
---|
| 197 | +# Of course, this is unneeded for phony targets. |
---|
| 198 | +delete-on-interrupt = \ |
---|
| 199 | + $(if $(filter-out $(PHONY), $@), \ |
---|
| 200 | + $(foreach sig, HUP INT QUIT TERM PIPE, \ |
---|
| 201 | + trap 'rm -f $@; trap - $(sig); kill -s $(sig) $$$$' $(sig);)) |
---|
| 202 | + |
---|
| 203 | +# printing commands |
---|
| 204 | +cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(delete-on-interrupt) $(cmd_$(1)) |
---|
229 | 205 | |
---|
230 | 206 | ### |
---|
231 | 207 | # if_changed - execute command if any prerequisite is newer than |
---|
.. | .. |
---|
233 | 209 | # if_changed_dep - as if_changed, but uses fixdep to reveal dependencies |
---|
234 | 210 | # including used config symbols |
---|
235 | 211 | # if_changed_rule - as if_changed but execute rule instead |
---|
236 | | -# See Documentation/kbuild/makefiles.txt for more info |
---|
| 212 | +# See Documentation/kbuild/makefiles.rst for more info |
---|
237 | 213 | |
---|
238 | 214 | ifneq ($(KBUILD_NOCMDDEP),1) |
---|
239 | | -# Check if both arguments are the same including their order. Result is empty |
---|
| 215 | +# Check if both commands are the same including their order. Result is empty |
---|
240 | 216 | # string if equal. User may override this check using make KBUILD_NOCMDDEP=1 |
---|
241 | | -arg-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ |
---|
| 217 | +cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ |
---|
242 | 218 | $(subst $(space),$(space_escape),$(strip $(cmd_$1)))) |
---|
243 | 219 | else |
---|
244 | | -arg-check = $(if $(strip $(cmd_$@)),,1) |
---|
| 220 | +cmd-check = $(if $(strip $(cmd_$@)),,1) |
---|
245 | 221 | endif |
---|
246 | 222 | |
---|
247 | 223 | # Replace >$< with >$$< to preserve $ when reloading the .cmd file |
---|
.. | .. |
---|
252 | 228 | # (needed for the shell) |
---|
253 | 229 | make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))) |
---|
254 | 230 | |
---|
255 | | -# Find any prerequisites that is newer than target or that does not exist. |
---|
| 231 | +# Find any prerequisites that are newer than target or that do not exist. |
---|
| 232 | +# (This is not true for now; $? should contain any non-existent prerequisites, |
---|
| 233 | +# but it does not work as expected when .SECONDARY is present. This seems a bug |
---|
| 234 | +# of GNU Make.) |
---|
256 | 235 | # PHONY targets skipped in both cases. |
---|
257 | | -any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) |
---|
| 236 | +newer-prereqs = $(filter-out $(PHONY),$?) |
---|
258 | 237 | |
---|
259 | 238 | # Execute command if command has changed or prerequisite(s) are updated. |
---|
260 | | -if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ |
---|
261 | | - @set -e; \ |
---|
262 | | - $(echo-cmd) $(cmd_$(1)); \ |
---|
| 239 | +if_changed = $(if $(newer-prereqs)$(cmd-check), \ |
---|
| 240 | + $(cmd); \ |
---|
263 | 241 | printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) |
---|
264 | 242 | |
---|
265 | 243 | # Execute the command and also postprocess generated .d dependencies file. |
---|
266 | | -if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ), \ |
---|
267 | | - @set -e; \ |
---|
268 | | - $(cmd_and_fixdep), @:) |
---|
269 | | - |
---|
270 | | -ifndef CONFIG_TRIM_UNUSED_KSYMS |
---|
| 244 | +if_changed_dep = $(if $(newer-prereqs)$(cmd-check),$(cmd_and_fixdep),@:) |
---|
271 | 245 | |
---|
272 | 246 | cmd_and_fixdep = \ |
---|
273 | | - $(echo-cmd) $(cmd_$(1)); \ |
---|
274 | | - scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\ |
---|
275 | | - rm -f $(depfile); \ |
---|
276 | | - mv -f $(dot-target).tmp $(dot-target).cmd; |
---|
277 | | - |
---|
278 | | -else |
---|
279 | | - |
---|
280 | | -# Filter out exported kernel symbol names from the preprocessor output. |
---|
281 | | -# See also __KSYM_DEPS__ in include/linux/export.h. |
---|
282 | | -# We disable the depfile generation here, so as not to overwrite the existing |
---|
283 | | -# depfile while fixdep is parsing it. |
---|
284 | | -flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1))) |
---|
285 | | -ksym_dep_filter = \ |
---|
286 | | - case "$(1)" in \ |
---|
287 | | - cc_*_c|cpp_i_c) \ |
---|
288 | | - $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;; \ |
---|
289 | | - as_*_S|cpp_s_S) \ |
---|
290 | | - $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;; \ |
---|
291 | | - boot*|build*|cpp_its_S|*cpp_lds_S|dtc|host*|vdso*) : ;; \ |
---|
292 | | - *) echo "Don't know how to preprocess $(1)" >&2; false ;; \ |
---|
293 | | - esac | grep -F '=== __KSYM_' | tr ";" "\n" | sed -n 's/^.*=== __KSYM_\(.*\) ===.*$$/_\1/p' |
---|
294 | | - |
---|
295 | | -cmd_and_fixdep = \ |
---|
296 | | - $(echo-cmd) $(cmd_$(1)); \ |
---|
297 | | - $(ksym_dep_filter) | \ |
---|
298 | | - scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)' \ |
---|
299 | | - > $(dot-target).tmp; \ |
---|
300 | | - rm -f $(depfile); \ |
---|
301 | | - mv -f $(dot-target).tmp $(dot-target).cmd; |
---|
302 | | - |
---|
303 | | -endif |
---|
| 247 | + $(cmd); \ |
---|
| 248 | + scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\ |
---|
| 249 | + rm -f $(depfile) |
---|
304 | 250 | |
---|
305 | 251 | # Usage: $(call if_changed_rule,foo) |
---|
306 | 252 | # Will check if $(cmd_foo) or any of the prerequisites changed, |
---|
307 | 253 | # and if so will execute $(rule_foo). |
---|
308 | | -if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \ |
---|
309 | | - @set -e; \ |
---|
310 | | - $(rule_$(1)), @:) |
---|
| 254 | +if_changed_rule = $(if $(newer-prereqs)$(cmd-check),$(rule_$(1)),@:) |
---|
311 | 255 | |
---|
312 | 256 | ### |
---|
313 | 257 | # why - tell why a target got built |
---|
.. | .. |
---|
332 | 276 | why = \ |
---|
333 | 277 | $(if $(filter $@, $(PHONY)),- due to target is PHONY, \ |
---|
334 | 278 | $(if $(wildcard $@), \ |
---|
335 | | - $(if $(strip $(any-prereq)),- due to: $(any-prereq), \ |
---|
336 | | - $(if $(arg-check), \ |
---|
| 279 | + $(if $(newer-prereqs),- due to: $(newer-prereqs), \ |
---|
| 280 | + $(if $(cmd-check), \ |
---|
337 | 281 | $(if $(cmd_$@),- due to command line change, \ |
---|
338 | 282 | $(if $(filter $@, $(targets)), \ |
---|
339 | 283 | - due to missing .cmd file, \ |
---|
.. | .. |
---|
400 | 344 | |
---|
401 | 345 | # delete partially updated (i.e. corrupted) files on error |
---|
402 | 346 | .DELETE_ON_ERROR: |
---|
| 347 | + |
---|
| 348 | +# do not delete intermediate files automatically |
---|
| 349 | +.SECONDARY: |
---|