0001 # SPDX-License-Identifier: GPL-2.0
0002 ####
0003 # kbuild: Generic definitions
0004
0005 # Convenient variables
0006 comma := ,
0007 quote := "
0008 squote := '
0009 empty :=
0010 space := $(empty) $(empty)
0011 space_escape := _-_SPACE_-_
0012 pound := \#
0013
0014 ###
0015 # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
0016 dot-target = $(dir $@).$(notdir $@)
0017
0018 ###
0019 # Name of target with a '.tmp_' as filename prefix. foo/bar.o => foo/.tmp_bar.o
0020 tmp-target = $(dir $@).tmp_$(notdir $@)
0021
0022 ###
0023 # The temporary file to save gcc -MMD generated dependencies must not
0024 # contain a comma
0025 depfile = $(subst $(comma),_,$(dot-target).d)
0026
0027 ###
0028 # filename of target with directory and extension stripped
0029 basetarget = $(basename $(notdir $@))
0030
0031 ###
0032 # real prerequisites without phony targets
0033 real-prereqs = $(filter-out $(PHONY), $^)
0034
0035 ###
0036 # Escape single quote for use in echo statements
0037 escsq = $(subst $(squote),'\$(squote)',$1)
0038
0039 ###
0040 # Quote a string to pass it to C files. foo => '"foo"'
0041 stringify = $(squote)$(quote)$1$(quote)$(squote)
0042
0043 ###
0044 # Easy method for doing a status message
0045 kecho := :
0046 quiet_kecho := echo
0047 silent_kecho := :
0048 kecho := $($(quiet)kecho)
0049
0050 ###
0051 # filechk is used to check if the content of a generated file is updated.
0052 # Sample usage:
0053 #
0054 # filechk_sample = echo $(KERNELRELEASE)
0055 # version.h: FORCE
0056 # $(call filechk,sample)
0057 #
0058 # The rule defined shall write to stdout the content of the new file.
0059 # The existing file will be compared with the new one.
0060 # - If no file exist it is created
0061 # - If the content differ the new file is used
0062 # - If they are equal no change, and no timestamp update
0063 define filechk
0064 $(check-FORCE)
0065 $(Q)set -e; \
0066 mkdir -p $(dir $@); \
0067 trap "rm -f $(dot-target).tmp" EXIT; \
0068 { $(filechk_$(1)); } > $(dot-target).tmp; \
0069 if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \
0070 $(kecho) ' UPD $@'; \
0071 mv -f $(dot-target).tmp $@; \
0072 fi
0073 endef
0074
0075 ###
0076 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
0077 # Usage:
0078 # $(Q)$(MAKE) $(build)=dir
0079 build := -f $(srctree)/scripts/Makefile.build obj
0080
0081 ###
0082 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
0083 # Usage:
0084 # $(Q)$(MAKE) $(dtbinst)=dir
0085 dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
0086
0087 ###
0088 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
0089 # Usage:
0090 # $(Q)$(MAKE) $(clean)=dir
0091 clean := -f $(srctree)/scripts/Makefile.clean obj
0092
0093 # echo command.
0094 # Short version is used, if $(quiet) equals `quiet_', otherwise full one.
0095 echo-cmd = $(if $($(quiet)cmd_$(1)),\
0096 echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
0097
0098 # sink stdout for 'make -s'
0099 redirect :=
0100 quiet_redirect :=
0101 silent_redirect := exec >/dev/null;
0102
0103 # printing commands
0104 cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(cmd_$(1))
0105
0106 ###
0107 # if_changed - execute command if any prerequisite is newer than
0108 # target, or command line has changed
0109 # if_changed_dep - as if_changed, but uses fixdep to reveal dependencies
0110 # including used config symbols
0111 # if_changed_rule - as if_changed but execute rule instead
0112 # See Documentation/kbuild/makefiles.rst for more info
0113
0114 ifneq ($(KBUILD_NOCMDDEP),1)
0115 # Check if both commands are the same including their order. Result is empty
0116 # string if equal. User may override this check using make KBUILD_NOCMDDEP=1
0117 cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
0118 $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
0119 else
0120 cmd-check = $(if $(strip $(cmd_$@)),,1)
0121 endif
0122
0123 # Replace >$< with >$$< to preserve $ when reloading the .cmd file
0124 # (needed for make)
0125 # Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file
0126 # (needed for make)
0127 # Replace >'< with >'\''< to be able to enclose the whole string in '...'
0128 # (needed for the shell)
0129 make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
0130
0131 # Find any prerequisites that are newer than target or that do not exist.
0132 # (This is not true for now; $? should contain any non-existent prerequisites,
0133 # but it does not work as expected when .SECONDARY is present. This seems a bug
0134 # of GNU Make.)
0135 # PHONY targets skipped in both cases.
0136 newer-prereqs = $(filter-out $(PHONY),$?)
0137
0138 # It is a typical mistake to forget the FORCE prerequisite. Check it here so
0139 # no more breakage will slip in.
0140 check-FORCE = $(if $(filter FORCE, $^),,$(warning FORCE prerequisite is missing))
0141
0142 if-changed-cond = $(newer-prereqs)$(cmd-check)$(check-FORCE)
0143
0144 # Execute command if command has changed or prerequisite(s) are updated.
0145 if_changed = $(if $(if-changed-cond),$(cmd_and_savecmd),@:)
0146
0147 cmd_and_savecmd = \
0148 $(cmd); \
0149 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd
0150
0151 # Execute the command and also postprocess generated .d dependencies file.
0152 if_changed_dep = $(if $(if-changed-cond),$(cmd_and_fixdep),@:)
0153
0154 cmd_and_fixdep = \
0155 $(cmd); \
0156 scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\
0157 rm -f $(depfile)
0158
0159 # Usage: $(call if_changed_rule,foo)
0160 # Will check if $(cmd_foo) or any of the prerequisites changed,
0161 # and if so will execute $(rule_foo).
0162 if_changed_rule = $(if $(if-changed-cond),$(rule_$(1)),@:)
0163
0164 ###
0165 # why - tell why a target got built
0166 # enabled by make V=2
0167 # Output (listed in the order they are checked):
0168 # (1) - due to target is PHONY
0169 # (2) - due to target missing
0170 # (3) - due to: file1.h file2.h
0171 # (4) - due to command line change
0172 # (5) - due to missing .cmd file
0173 # (6) - due to target not in $(targets)
0174 # (1) PHONY targets are always build
0175 # (2) No target, so we better build it
0176 # (3) Prerequisite is newer than target
0177 # (4) The command line stored in the file named dir/.target.cmd
0178 # differed from actual command line. This happens when compiler
0179 # options changes
0180 # (5) No dir/.target.cmd file (used to store command line)
0181 # (6) No dir/.target.cmd file and target not listed in $(targets)
0182 # This is a good hint that there is a bug in the kbuild file
0183 ifeq ($(KBUILD_VERBOSE),2)
0184 why = \
0185 $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
0186 $(if $(wildcard $@), \
0187 $(if $(newer-prereqs),- due to: $(newer-prereqs), \
0188 $(if $(cmd-check), \
0189 $(if $(cmd_$@),- due to command line change, \
0190 $(if $(filter $@, $(targets)), \
0191 - due to missing .cmd file, \
0192 - due to $(notdir $@) not in $$(targets) \
0193 ) \
0194 ) \
0195 ) \
0196 ), \
0197 - due to target missing \
0198 ) \
0199 )
0200
0201 echo-why = $(call escsq, $(strip $(why)))
0202 endif
0203
0204 ###############################################################################
0205
0206 # delete partially updated (i.e. corrupted) files on error
0207 .DELETE_ON_ERROR:
0208
0209 # do not delete intermediate files automatically
0210 .SECONDARY: