Back to home page

OSCL-LXR

 
 

    


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: