hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/scripts/Kbuild.include
....@@ -1,3 +1,4 @@
1
+# SPDX-License-Identifier: GPL-2.0
12 ####
23 # kbuild: Generic definitions
34
....@@ -15,7 +16,7 @@
1516 dot-target = $(dir $@).$(notdir $@)
1617
1718 ###
18
-# The temporary file to save gcc -MD generated dependencies must not
19
+# The temporary file to save gcc -MMD generated dependencies must not
1920 # contain a comma
2021 depfile = $(subst $(comma),_,$(dot-target).d)
2122
....@@ -24,12 +25,16 @@
2425 basetarget = $(basename $(notdir $@))
2526
2627 ###
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), $^)
2930
3031 ###
3132 # Escape single quote for use in echo statements
3233 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)
3338
3439 ###
3540 # Easy method for doing a status message
....@@ -41,44 +46,42 @@
4146 ###
4247 # filechk is used to check if the content of a generated file is updated.
4348 # 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
4852 # $(call filechk,sample)
53
+#
4954 # The rule defined shall write to stdout the content of the new file.
5055 # The existing file will be compared with the new one.
5156 # - If no file exist it is created
5257 # - If the content differ the new file is used
5358 # - 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)
5659 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 $@; \
6567 fi
6668 endef
6769
6870 ######
6971 # gcc support functions
70
-# See documentation in Documentation/kbuild/makefiles.txt
72
+# See documentation in Documentation/kbuild/makefiles.rst
7173
7274 # cc-cross-prefix
7375 # 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))))
8285
8386 # output directory for tests below
8487 TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$
....@@ -114,59 +117,29 @@
114117 __cc-option = $(call try-run,\
115118 $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4))
116119
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
-
121120 # cc-option
122121 # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
123122
124123 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))
131125
132126 # cc-option-yn
133127 # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
134128 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)
136130
137131 # cc-disable-warning
138132 # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
139133 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)))
152135
153136 # cc-ifversion
154137 # 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))
161139
162140 # ld-option
163141 # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
164142 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))
170143
171144 # ld-version
172145 # Note this is mainly for HJ Lu's 3 number binutil versions
....@@ -185,16 +158,10 @@
185158 build := -f $(srctree)/scripts/Makefile.build obj
186159
187160 ###
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
-###
194161 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
195162 # Usage:
196163 # $(Q)$(MAKE) $(dtbinst)=dir
197
-dtbinst := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.dtbinst obj
164
+dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
198165
199166 ###
200167 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
....@@ -202,30 +169,39 @@
202169 # $(Q)$(MAKE) $(clean)=dir
203170 clean := -f $(srctree)/scripts/Makefile.clean obj
204171
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
-
219172 # echo command.
220173 # Short version is used, if $(quiet) equals `quiet_', otherwise full one.
221174 echo-cmd = $(if $($(quiet)cmd_$(1)),\
222175 echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
223176
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;
226181
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))
229205
230206 ###
231207 # if_changed - execute command if any prerequisite is newer than
....@@ -233,15 +209,15 @@
233209 # if_changed_dep - as if_changed, but uses fixdep to reveal dependencies
234210 # including used config symbols
235211 # 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
237213
238214 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
240216 # 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_$@))), \
242218 $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
243219 else
244
-arg-check = $(if $(strip $(cmd_$@)),,1)
220
+cmd-check = $(if $(strip $(cmd_$@)),,1)
245221 endif
246222
247223 # Replace >$< with >$$< to preserve $ when reloading the .cmd file
....@@ -252,62 +228,30 @@
252228 # (needed for the shell)
253229 make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
254230
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.)
256235 # PHONY targets skipped in both cases.
257
-any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
236
+newer-prereqs = $(filter-out $(PHONY),$?)
258237
259238 # 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); \
263241 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
264242
265243 # 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),@:)
271245
272246 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)
304250
305251 # Usage: $(call if_changed_rule,foo)
306252 # Will check if $(cmd_foo) or any of the prerequisites changed,
307253 # 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)),@:)
311255
312256 ###
313257 # why - tell why a target got built
....@@ -332,8 +276,8 @@
332276 why = \
333277 $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
334278 $(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), \
337281 $(if $(cmd_$@),- due to command line change, \
338282 $(if $(filter $@, $(targets)), \
339283 - due to missing .cmd file, \
....@@ -400,3 +344,6 @@
400344
401345 # delete partially updated (i.e. corrupted) files on error
402346 .DELETE_ON_ERROR:
347
+
348
+# do not delete intermediate files automatically
349
+.SECONDARY: