kbuild: remove the target in signal traps when interrupted
[linux-2.6-block.git] / scripts / Kbuild.include
CommitLineData
96ac6d43 1# SPDX-License-Identifier: GPL-2.0
8ec4b4ff
SR
2####
3# kbuild: Generic definitions
4
beda9f3a 5# Convenient variables
8ec4b4ff 6comma := ,
13338935 7quote := "
d51bfb78 8squote := '
8ec4b4ff
SR
9empty :=
10space := $(empty) $(empty)
9c8fa9bc 11space_escape := _-_SPACE_-_
9564a8cf 12pound := \#
8ec4b4ff 13
48f1f058
SR
14###
15# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
16dot-target = $(dir $@).$(notdir $@)
17
c25e1c55
MY
18###
19# Name of target with a '.tmp_' as filename prefix. foo/bar.o => foo/.tmp_bar.o
20tmp-target = $(dir $@).tmp_$(notdir $@)
21
8ec4b4ff 22###
30a77297 23# The temporary file to save gcc -MMD generated dependencies must not
8ec4b4ff 24# contain a comma
48f1f058 25depfile = $(subst $(comma),_,$(dot-target).d)
8ec4b4ff 26
5e8d780d
SR
27###
28# filename of target with directory and extension stripped
29basetarget = $(basename $(notdir $@))
30
afa974b7
MY
31###
32# real prerequisites without phony targets
33real-prereqs = $(filter-out $(PHONY), $^)
34
d51bfb78
SR
35###
36# Escape single quote for use in echo statements
37escsq = $(subst $(squote),'\$(squote)',$1)
38
7e826c44
MY
39###
40# Quote a string to pass it to C files. foo => '"foo"'
41stringify = $(squote)$(quote)$1$(quote)$(squote)
42
5410ecc0
MF
43###
44# Easy method for doing a status message
45 kecho := :
46 quiet_kecho := echo
47silent_kecho := :
48kecho := $($(quiet)kecho)
49
8ec4b4ff
SR
50###
51# filechk is used to check if the content of a generated file is updated.
52# Sample usage:
ba97df45
MY
53#
54# filechk_sample = echo $(KERNELRELEASE)
55# version.h: FORCE
8ec4b4ff 56# $(call filechk,sample)
ba97df45 57#
8ec4b4ff
SR
58# The rule defined shall write to stdout the content of the new file.
59# The existing file will be compared with the new one.
60# - If no file exist it is created
61# - If the content differ the new file is used
62# - If they are equal no change, and no timestamp update
8ec4b4ff 63define filechk
e1f86d7b 64 $(check-FORCE)
88fe89a4
MY
65 $(Q)set -e; \
66 mkdir -p $(dir $@); \
67 trap "rm -f $(dot-target).tmp" EXIT; \
68 { $(filechk_$(1)); } > $(dot-target).tmp; \
69 if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \
70 $(kecho) ' UPD $@'; \
71 mv -f $(dot-target).tmp $@; \
8ec4b4ff
SR
72 fi
73endef
74
beda9f3a 75###
8ec4b4ff
SR
76# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
77# Usage:
78# $(Q)$(MAKE) $(build)=dir
5b2389b4 79build := -f $(srctree)/scripts/Makefile.build obj
8ec4b4ff 80
9fb5e537
RR
81###
82# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
83# Usage:
84# $(Q)$(MAKE) $(dtbinst)=dir
487c7c77 85dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
9fb5e537 86
371fdc77
MY
87###
88# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
89# Usage:
90# $(Q)$(MAKE) $(clean)=dir
91clean := -f $(srctree)/scripts/Makefile.clean obj
92
5de043f4
OV
93# echo command.
94# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
bff288c1 95echo-cmd = $(if $($(quiet)cmd_$(1)),\
5de043f4
OV
96 echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
97
174a1dcc
MY
98# sink stdout for 'make -s'
99 redirect :=
100 quiet_redirect :=
101silent_redirect := exec >/dev/null;
102
a7f3257d
MY
103# Delete the target on interruption
104#
105# GNU Make automatically deletes the target if it has already been changed by
106# the interrupted recipe. So, you can safely stop the build by Ctrl-C (Make
107# will delete incomplete targets), and resume it later.
108#
109# However, this does not work when the stderr is piped to another program, like
110# $ make >&2 | tee log
111# Make dies with SIGPIPE before cleaning the targets.
112#
113# To address it, we clean the target in signal traps.
114#
115# Make deletes the target when it catches SIGHUP, SIGINT, SIGQUIT, SIGTERM.
116# So, we cover them, and also SIGPIPE just in case.
117#
118# Of course, this is unneeded for phony targets.
119delete-on-interrupt = \
120 $(if $(filter-out $(PHONY), $@), \
121 $(foreach sig, HUP INT QUIT TERM PIPE, \
122 trap 'rm -f $@; trap - $(sig); kill -s $(sig) $$$$' $(sig);))
123
5de043f4 124# printing commands
a7f3257d 125cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(delete-on-interrupt) $(cmd_$(1))
8ec4b4ff
SR
126
127###
5de043f4 128# if_changed - execute command if any prerequisite is newer than
8ec4b4ff
SR
129# target, or command line has changed
130# if_changed_dep - as if_changed, but uses fixdep to reveal dependencies
131# including used config symbols
132# if_changed_rule - as if_changed but execute rule instead
cd238eff 133# See Documentation/kbuild/makefiles.rst for more info
8ec4b4ff
SR
134
135ifneq ($(KBUILD_NOCMDDEP),1)
50bcca6a 136# Check if both commands are the same including their order. Result is empty
9c8fa9bc 137# string if equal. User may override this check using make KBUILD_NOCMDDEP=1
50bcca6a 138cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
9c8fa9bc 139 $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
c4d5ee13 140else
50bcca6a 141cmd-check = $(if $(strip $(cmd_$@)),,1)
8ec4b4ff
SR
142endif
143
164f0d2e
MM
144# Replace >$< with >$$< to preserve $ when reloading the .cmd file
145# (needed for make)
9564a8cf 146# Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file
164f0d2e
MM
147# (needed for make)
148# Replace >'< with >'\''< to be able to enclose the whole string in '...'
149# (needed for the shell)
9564a8cf 150make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
6176aa9a 151
2d3b1b8f
MY
152# Find any prerequisites that are newer than target or that do not exist.
153# (This is not true for now; $? should contain any non-existent prerequisites,
154# but it does not work as expected when .SECONDARY is present. This seems a bug
155# of GNU Make.)
48f1f058 156# PHONY targets skipped in both cases.
eba19032 157newer-prereqs = $(filter-out $(PHONY),$?)
48f1f058 158
e1f86d7b
MY
159# It is a typical mistake to forget the FORCE prerequisite. Check it here so
160# no more breakage will slip in.
161check-FORCE = $(if $(filter FORCE, $^),,$(warning FORCE prerequisite is missing))
162
163if-changed-cond = $(newer-prereqs)$(cmd-check)$(check-FORCE)
6796e804 164
5de043f4 165# Execute command if command has changed or prerequisite(s) are updated.
ebd191b3
MY
166if_changed = $(if $(if-changed-cond),$(cmd_and_savecmd),@:)
167
168cmd_and_savecmd = \
67126965 169 $(cmd); \
ebd191b3 170 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd
8ec4b4ff 171
5de043f4 172# Execute the command and also postprocess generated .d dependencies file.
6796e804 173if_changed_dep = $(if $(if-changed-cond),$(cmd_and_fixdep),@:)
c1a95fda 174
e4aca459 175cmd_and_fixdep = \
3a2429e1 176 $(cmd); \
392885ee 177 scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\
e5d28910 178 rm -f $(depfile)
c1a95fda 179
8ec4b4ff 180# Usage: $(call if_changed_rule,foo)
beda9f3a
RZ
181# Will check if $(cmd_foo) or any of the prerequisites changed,
182# and if so will execute $(rule_foo).
6796e804 183if_changed_rule = $(if $(if-changed-cond),$(rule_$(1)),@:)
48f1f058 184
45d506bd 185###
312a3d09 186# why - tell why a target got built
45d506bd
SR
187# enabled by make V=2
188# Output (listed in the order they are checked):
189# (1) - due to target is PHONY
190# (2) - due to target missing
191# (3) - due to: file1.h file2.h
192# (4) - due to command line change
193# (5) - due to missing .cmd file
194# (6) - due to target not in $(targets)
195# (1) PHONY targets are always build
196# (2) No target, so we better build it
197# (3) Prerequisite is newer than target
198# (4) The command line stored in the file named dir/.target.cmd
199# differed from actual command line. This happens when compiler
200# options changes
201# (5) No dir/.target.cmd file (used to store command line)
202# (6) No dir/.target.cmd file and target not listed in $(targets)
203# This is a good hint that there is a bug in the kbuild file
204ifeq ($(KBUILD_VERBOSE),2)
205why = \
206 $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
207 $(if $(wildcard $@), \
eba19032 208 $(if $(newer-prereqs),- due to: $(newer-prereqs), \
50bcca6a 209 $(if $(cmd-check), \
45d506bd
SR
210 $(if $(cmd_$@),- due to command line change, \
211 $(if $(filter $@, $(targets)), \
212 - due to missing .cmd file, \
213 - due to $(notdir $@) not in $$(targets) \
214 ) \
215 ) \
216 ) \
217 ), \
218 - due to target missing \
219 ) \
220 )
221
222echo-why = $(call escsq, $(strip $(why)))
223endif
3ee550f1 224
3ee550f1 225###############################################################################
9c2af1c7
MY
226
227# delete partially updated (i.e. corrupted) files on error
228.DELETE_ON_ERROR:
8e9b61b2
MY
229
230# do not delete intermediate files automatically
231.SECONDARY: