^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) ####
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) # kbuild: Generic definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # Convenient variables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) comma := ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) quote := "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) squote := '
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) empty :=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) space := $(empty) $(empty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) space_escape := _-_SPACE_-_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) pound := \#
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) dot-target = $(dir $@).$(notdir $@)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) # The temporary file to save gcc -MMD generated dependencies must not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) # contain a comma
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) depfile = $(subst $(comma),_,$(dot-target).d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) # filename of target with directory and extension stripped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) basetarget = $(basename $(notdir $@))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) # real prerequisites without phony targets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) real-prereqs = $(filter-out $(PHONY), $^)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) # Escape single quote for use in echo statements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) escsq = $(subst $(squote),'\$(squote)',$1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) # Quote a string to pass it to C files. foo => '"foo"'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) stringify = $(squote)$(quote)$1$(quote)$(squote)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) # Easy method for doing a status message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) kecho := :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) quiet_kecho := echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) silent_kecho := :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) kecho := $($(quiet)kecho)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) # filechk is used to check if the content of a generated file is updated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) # Sample usage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) # filechk_sample = echo $(KERNELRELEASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) # version.h: FORCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) # $(call filechk,sample)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) # The rule defined shall write to stdout the content of the new file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) # The existing file will be compared with the new one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) # - If no file exist it is created
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) # - If the content differ the new file is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) # - If they are equal no change, and no timestamp update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) define filechk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) $(Q)set -e; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) mkdir -p $(dir $@); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) trap "rm -f $(dot-target).tmp" EXIT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { $(filechk_$(1)); } > $(dot-target).tmp; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) $(kecho) ' UPD $@'; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) mv -f $(dot-target).tmp $@; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ######
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) # gcc support functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) # See documentation in Documentation/kbuild/makefiles.rst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) # cc-cross-prefix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) # Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) # Return first <prefix> where a <prefix>gcc is found in PATH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) # If no gcc found in PATH with listed prefixes return nothing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) # Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) # would try to directly execute the shell builtin 'command'. This workaround
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) # should be kept for a long time since this issue was fixed only after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) # GNU Make 4.2.1 release.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) cc-cross-prefix = $(firstword $(foreach c, $(1), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) # output directory for tests below
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) # try-run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) # Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) # Exit code chooses option. "$$TMP" serves as a temporary file and is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) # automatically cleaned up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) try-run = $(shell set -e; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) TMP=$(TMPOUT)/tmp; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) TMPO=$(TMPOUT)/tmp.o; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) mkdir -p $(TMPOUT); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) trap "rm -rf $(TMPOUT)" EXIT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if ($(1)) >/dev/null 2>&1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) then echo "$(2)"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) else echo "$(3)"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) fi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) # as-option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) as-option = $(call try-run,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) # as-instr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) # Usage: cflags-y += $(call as-instr,instr,option1,option2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) as-instr = $(call try-run,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) # __cc-option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) # Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) __cc-option = $(call try-run,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) # cc-option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) cc-option = $(call __cc-option, $(CC),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) # cc-option-yn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) cc-option-yn = $(call try-run,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) # cc-disable-warning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) cc-disable-warning = $(call try-run,\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) # cc-ifversion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) # ld-option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) # ld-version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) # Note this is mainly for HJ Lu's 3 number binutil versions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) ld-version = $(shell $(LD) --version | $(srctree)/scripts/ld-version.sh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) # ld-ifversion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) # Usage: $(call ld-ifversion, -ge, 22252, y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ld-ifversion = $(shell [ $(ld-version) $(1) $(2) ] && echo $(3) || echo $(4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ######
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) # Usage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) # $(Q)$(MAKE) $(build)=dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) build := -f $(srctree)/scripts/Makefile.build obj
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) # Usage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) # $(Q)$(MAKE) $(dtbinst)=dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) # Usage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) # $(Q)$(MAKE) $(clean)=dir
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) clean := -f $(srctree)/scripts/Makefile.clean obj
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) # echo command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) # Short version is used, if $(quiet) equals `quiet_', otherwise full one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) echo-cmd = $(if $($(quiet)cmd_$(1)),\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) # sink stdout for 'make -s'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) redirect :=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) quiet_redirect :=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) silent_redirect := exec >/dev/null;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) # printing commands
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(cmd_$(1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) # if_changed - execute command if any prerequisite is newer than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) # target, or command line has changed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) # if_changed_dep - as if_changed, but uses fixdep to reveal dependencies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) # including used config symbols
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) # if_changed_rule - as if_changed but execute rule instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) # See Documentation/kbuild/makefiles.rst for more info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) ifneq ($(KBUILD_NOCMDDEP),1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) # Check if both commands are the same including their order. Result is empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) # string if equal. User may override this check using make KBUILD_NOCMDDEP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) cmd-check = $(if $(strip $(cmd_$@)),,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) # Replace >$< with >$$< to preserve $ when reloading the .cmd file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) # (needed for make)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) # Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) # (needed for make)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) # Replace >'< with >'\''< to be able to enclose the whole string in '...'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) # (needed for the shell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) # Find any prerequisites that are newer than target or that do not exist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) # (This is not true for now; $? should contain any non-existent prerequisites,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) # but it does not work as expected when .SECONDARY is present. This seems a bug
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) # of GNU Make.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) # PHONY targets skipped in both cases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) newer-prereqs = $(filter-out $(PHONY),$?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) # Execute command if command has changed or prerequisite(s) are updated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if_changed = $(if $(newer-prereqs)$(cmd-check), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) $(cmd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) # Execute the command and also postprocess generated .d dependencies file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) if_changed_dep = $(if $(newer-prereqs)$(cmd-check),$(cmd_and_fixdep),@:)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) cmd_and_fixdep = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) $(cmd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) rm -f $(depfile)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) # Usage: $(call if_changed_rule,foo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) # Will check if $(cmd_foo) or any of the prerequisites changed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) # and if so will execute $(rule_foo).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) if_changed_rule = $(if $(newer-prereqs)$(cmd-check),$(rule_$(1)),@:)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ###
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) # why - tell why a target got built
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) # enabled by make V=2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) # Output (listed in the order they are checked):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) # (1) - due to target is PHONY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) # (2) - due to target missing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) # (3) - due to: file1.h file2.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) # (4) - due to command line change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) # (5) - due to missing .cmd file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) # (6) - due to target not in $(targets)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) # (1) PHONY targets are always build
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) # (2) No target, so we better build it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) # (3) Prerequisite is newer than target
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) # (4) The command line stored in the file named dir/.target.cmd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) # differed from actual command line. This happens when compiler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) # options changes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) # (5) No dir/.target.cmd file (used to store command line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) # (6) No dir/.target.cmd file and target not listed in $(targets)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) # This is a good hint that there is a bug in the kbuild file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) ifeq ($(KBUILD_VERBOSE),2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) why = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) $(if $(wildcard $@), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) $(if $(newer-prereqs),- due to: $(newer-prereqs), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) $(if $(cmd-check), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) $(if $(cmd_$@),- due to command line change, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) $(if $(filter $@, $(targets)), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) - due to missing .cmd file, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) - due to $(notdir $@) not in $$(targets) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) ), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) - due to target missing \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) echo-why = $(call escsq, $(strip $(why)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) ###############################################################################
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) # When a Kconfig string contains a filename, it is suitable for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) # passing to shell commands. It is surrounded by double-quotes, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) # any double-quotes or backslashes within it are escaped by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) # backslashes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) # This is no use for dependencies or $(wildcard). We need to strip the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) # surrounding quotes and the escaping from quotes and backslashes, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) # we *do* need to escape any spaces in the string. So, for example:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) # Usage: $(eval $(call config_filename,FOO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) # Defines FOO_FILENAME based on the contents of the CONFIG_FOO option,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) # transformed as described above to be suitable for use within the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) # makefile.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) # Also, if the filename is a relative filename and exists in the source
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) # tree but not the build tree, define FOO_SRCPREFIX as $(srctree)/ to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) # be prefixed to *both* command invocation and dependencies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) # Note: We also print the filenames in the quiet_cmd_foo text, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) # perhaps ought to have a version specially escaped for that purpose.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) # But it's only cosmetic, and $(patsubst "%",%,$(CONFIG_FOO)) is good
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) # enough. It'll strip the quotes in the common case where there's no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) # space and it's a simple filename, and it'll retain the quotes when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) # there's a space. There are some esoteric cases in which it'll print
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) # the wrong thing, but we don't really care. The actual dependencies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) # and commands *do* get it right, with various combinations of single
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) # and double quotes, backslashes and spaces in the filenames.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) ###############################################################################
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) define config_filename
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) ifneq ($$(CONFIG_$(1)),"")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) $(1)_FILENAME := $$(subst \\,\,$$(subst \$$(quote),$$(quote),$$(subst $$(space_escape),\$$(space),$$(patsubst "%",%,$$(subst $$(space),$$(space_escape),$$(CONFIG_$(1)))))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) ifneq ($$(patsubst /%,%,$$(firstword $$($(1)_FILENAME))),$$(firstword $$($(1)_FILENAME)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) ifeq ($$(wildcard $$($(1)_FILENAME)),)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) ifneq ($$(wildcard $$(srctree)/$$($(1)_FILENAME)),)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) $(1)_SRCPREFIX := $(srctree)/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) ###############################################################################
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) # delete partially updated (i.e. corrupted) files on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) .DELETE_ON_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) # do not delete intermediate files automatically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) .SECONDARY: