Home | History | Annotate | Download | only in scripts
      1 ####
      2 # kbuild: Generic definitions
      3 
      4 # Convenient variables
      5 comma   := ,
      6 quote   := "
      7 squote  := '
      8 empty   :=
      9 space   := $(empty) $(empty)
     10 
     11 ###
     12 # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
     13 dot-target = $(dir $@).$(notdir $@)
     14 
     15 ###
     16 # The temporary file to save gcc -MD generated dependencies must not
     17 # contain a comma
     18 depfile = $(subst $(comma),_,$(dot-target).d)
     19 
     20 ###
     21 # filename of target with directory and extension stripped
     22 basetarget = $(basename $(notdir $@))
     23 
     24 ###
     25 # filename of first prerequisite with directory and extension stripped
     26 baseprereq = $(basename $(notdir $<))
     27 
     28 ###
     29 # Escape single quote for use in echo statements
     30 escsq = $(subst $(squote),'\$(squote)',$1)
     31 
     32 ###
     33 # Easy method for doing a status message
     34        kecho := :
     35  quiet_kecho := echo
     36 silent_kecho := :
     37 kecho := $($(quiet)kecho)
     38 
     39 ###
     40 # filechk is used to check if the content of a generated file is updated.
     41 # Sample usage:
     42 # define filechk_sample
     43 #	echo $KERNELRELEASE
     44 # endef
     45 # version.h : Makefile
     46 #	$(call filechk,sample)
     47 # The rule defined shall write to stdout the content of the new file.
     48 # The existing file will be compared with the new one.
     49 # - If no file exist it is created
     50 # - If the content differ the new file is used
     51 # - If they are equal no change, and no timestamp update
     52 # - stdin is piped in from the first prerequisite ($<) so one has
     53 #   to specify a valid file as first prerequisite (often the kbuild file)
     54 define filechk
     55 	$(Q)set -e;				\
     56 	$(kecho) '  CHK     $@';		\
     57 	mkdir -p $(dir $@);			\
     58 	$(filechk_$(1)) < $< > $@.tmp;		\
     59 	if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
     60 		rm -f $@.tmp;			\
     61 	else					\
     62 		$(kecho) '  UPD     $@';	\
     63 		mv -f $@.tmp $@;		\
     64 	fi
     65 endef
     66 
     67 ######
     68 # gcc support functions
     69 # See documentation in Documentation/kbuild/makefiles.txt
     70 
     71 # cc-cross-prefix
     72 # Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
     73 # Return first prefix where a prefix$(CC) is found in PATH.
     74 # If no $(CC) found in PATH with listed prefixes return nothing
     75 cc-cross-prefix =  \
     76 	$(word 1, $(foreach c,$(1),                                   \
     77 		$(shell set -e;                                       \
     78 		if (which $(strip $(c))$(CC)) > /dev/null 2>&1 ; then \
     79 			echo $(c);                                    \
     80 		fi)))
     81 
     82 # output directory for tests below
     83 TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
     84 
     85 # try-run
     86 # Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
     87 # Exit code chooses option. "$$TMP" is can be used as temporary file and
     88 # is automatically cleaned up.
     89 # modifed for U-Boot: prevent cc-option from leaving .*.su files
     90 try-run = $(shell set -e;		\
     91 	TMP="$(TMPOUT).$$$$.tmp";	\
     92 	TMPO="$(TMPOUT).$$$$.o";	\
     93 	TMPSU="$(TMPOUT).$$$$.su";	\
     94 	if ($(1)) >/dev/null 2>&1;	\
     95 	then echo "$(2)";		\
     96 	else echo "$(3)";		\
     97 	fi;				\
     98 	rm -f "$$TMP" "$$TMPO" "$$TMPSU")
     99 
    100 # as-option
    101 # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
    102 
    103 as-option = $(call try-run,\
    104 	$(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2))
    105 
    106 # as-instr
    107 # Usage: cflags-y += $(call as-instr,instr,option1,option2)
    108 
    109 as-instr = $(call try-run,\
    110 	printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
    111 
    112 # cc-option
    113 # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
    114 
    115 cc-option = $(call try-run,\
    116 	$(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
    117 
    118 # cc-option-yn
    119 # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
    120 cc-option-yn = $(call try-run,\
    121 	$(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
    122 
    123 # cc-option-align
    124 # Prefix align with either -falign or -malign
    125 cc-option-align = $(subst -functions=0,,\
    126 	$(call cc-option,-falign-functions=0,-malign-functions=0))
    127 
    128 # cc-disable-warning
    129 # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
    130 cc-disable-warning = $(call try-run,\
    131 	$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
    132 
    133 # cc-name
    134 # Expands to either gcc or clang
    135 cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
    136 
    137 # cc-version
    138 cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
    139 
    140 # cc-fullversion
    141 cc-fullversion = $(shell $(CONFIG_SHELL) \
    142 	$(srctree)/scripts/gcc-version.sh -p $(CC))
    143 
    144 # cc-ifversion
    145 # Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
    146 cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && echo $(3) || echo $(4))
    147 
    148 # added for U-Boot
    149 binutils-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/binutils-version.sh $(AS))
    150 dtc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/dtc-version.sh $(DTC))
    151 
    152 # cc-ldoption
    153 # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
    154 cc-ldoption = $(call try-run,\
    155 	$(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
    156 
    157 # ld-option
    158 # Usage: LDFLAGS += $(call ld-option, -X)
    159 ld-option = $(call try-run,\
    160 	$(CC) -x c /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o "$$TMP",$(1),$(2))
    161 
    162 # ar-option
    163 # Usage: KBUILD_ARFLAGS := $(call ar-option,D)
    164 # Important: no spaces around options
    165 ar-option = $(call try-run, $(AR) rc$(1) "$$TMP",$(1),$(2))
    166 
    167 # ld-version
    168 # Note this is mainly for HJ Lu's 3 number binutil versions
    169 ld-version = $(shell $(LD) --version | $(srctree)/scripts/ld-version.sh)
    170 
    171 # ld-ifversion
    172 # Usage:  $(call ld-ifversion, -ge, 22252, y)
    173 ld-ifversion = $(shell [ $(ld-version) $(1) $(2) ] && echo $(3) || echo $(4))
    174 
    175 ######
    176 
    177 ###
    178 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
    179 # Usage:
    180 # $(Q)$(MAKE) $(build)=dir
    181 build := -f $(srctree)/scripts/Makefile.build obj
    182 
    183 ###
    184 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj=
    185 # Usage:
    186 # $(Q)$(MAKE) $(modbuiltin)=dir
    187 modbuiltin := -f $(srctree)/scripts/Makefile.modbuiltin obj
    188 
    189 ###
    190 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
    191 # Usage:
    192 # $(Q)$(MAKE) $(dtbinst)=dir
    193 dtbinst := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.dtbinst obj
    194 
    195 ###
    196 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
    197 # Usage:
    198 # $(Q)$(MAKE) $(clean)=dir
    199 clean := -f $(srctree)/scripts/Makefile.clean obj
    200 
    201 ###
    202 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.headersinst obj=
    203 # Usage:
    204 # $(Q)$(MAKE) $(hdr-inst)=dir
    205 hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj
    206 
    207 # Prefix -I with $(srctree) if it is not an absolute path.
    208 # skip if -I has no parameter
    209 addtree = $(if $(patsubst -I%,%,$(1)), \
    210 $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1))
    211 
    212 # Find all -I options and call addtree
    213 flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))
    214 
    215 # echo command.
    216 # Short version is used, if $(quiet) equals `quiet_', otherwise full one.
    217 echo-cmd = $(if $($(quiet)cmd_$(1)),\
    218 	echo '  $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
    219 
    220 # printing commands
    221 cmd = @$(echo-cmd) $(cmd_$(1))
    222 
    223 # Add $(obj)/ for paths that are not absolute
    224 objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
    225 
    226 ###
    227 # if_changed      - execute command if any prerequisite is newer than
    228 #                   target, or command line has changed
    229 # if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
    230 #                   including used config symbols
    231 # if_changed_rule - as if_changed but execute rule instead
    232 # See Documentation/kbuild/makefiles.txt for more info
    233 
    234 ifneq ($(KBUILD_NOCMDDEP),1)
    235 # Check if both arguments has same arguments. Result is empty string if equal.
    236 # User may override this check using make KBUILD_NOCMDDEP=1
    237 arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
    238                     $(filter-out $(cmd_$@),   $(cmd_$(1))) )
    239 else
    240 arg-check = $(if $(strip $(cmd_$@)),,1)
    241 endif
    242 
    243 # Replace >$< with >$$< to preserve $ when reloading the .cmd file
    244 # (needed for make)
    245 # Replace >#< with >\#< to avoid starting a comment in the .cmd file
    246 # (needed for make)
    247 # Replace >'< with >'\''< to be able to enclose the whole string in '...'
    248 # (needed for the shell)
    249 make-cmd = $(call escsq,$(subst \#,\\\#,$(subst $$,$$$$,$(cmd_$(1)))))
    250 
    251 # Find any prerequisites that is newer than target or that does not exist.
    252 # PHONY targets skipped in both cases.
    253 any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
    254 
    255 # Execute command if command has changed or prerequisite(s) are updated.
    256 #
    257 if_changed = $(if $(strip $(any-prereq) $(arg-check)),                       \
    258 	@set -e;                                                             \
    259 	$(echo-cmd) $(cmd_$(1));                                             \
    260 	printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
    261 
    262 # Execute the command and also postprocess generated .d dependencies file.
    263 if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ),                  \
    264 	@set -e;                                                             \
    265 	$(echo-cmd) $(cmd_$(1));                                             \
    266 	scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\
    267 	rm -f $(depfile);                                                    \
    268 	mv -f $(dot-target).tmp $(dot-target).cmd)
    269 
    270 # Usage: $(call if_changed_rule,foo)
    271 # Will check if $(cmd_foo) or any of the prerequisites changed,
    272 # and if so will execute $(rule_foo).
    273 if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ),                 \
    274 	@set -e;                                                             \
    275 	$(rule_$(1)))
    276 
    277 ###
    278 # why - tell why a a target got build
    279 #       enabled by make V=2
    280 #       Output (listed in the order they are checked):
    281 #          (1) - due to target is PHONY
    282 #          (2) - due to target missing
    283 #          (3) - due to: file1.h file2.h
    284 #          (4) - due to command line change
    285 #          (5) - due to missing .cmd file
    286 #          (6) - due to target not in $(targets)
    287 # (1) PHONY targets are always build
    288 # (2) No target, so we better build it
    289 # (3) Prerequisite is newer than target
    290 # (4) The command line stored in the file named dir/.target.cmd
    291 #     differed from actual command line. This happens when compiler
    292 #     options changes
    293 # (5) No dir/.target.cmd file (used to store command line)
    294 # (6) No dir/.target.cmd file and target not listed in $(targets)
    295 #     This is a good hint that there is a bug in the kbuild file
    296 ifeq ($(KBUILD_VERBOSE),2)
    297 why =                                                                        \
    298     $(if $(filter $@, $(PHONY)),- due to target is PHONY,                    \
    299         $(if $(wildcard $@),                                                 \
    300             $(if $(strip $(any-prereq)),- due to: $(any-prereq),             \
    301                 $(if $(arg-check),                                           \
    302                     $(if $(cmd_$@),- due to command line change,             \
    303                         $(if $(filter $@, $(targets)),                       \
    304                             - due to missing .cmd file,                      \
    305                             - due to $(notdir $@) not in $$(targets)         \
    306                          )                                                   \
    307                      )                                                       \
    308                  )                                                           \
    309              ),                                                              \
    310              - due to target missing                                         \
    311          )                                                                   \
    312      )
    313 
    314 echo-why = $(call escsq, $(strip $(why)))
    315 endif
    316 
    317 ifdef CONFIG_SPL_BUILD
    318 SPL_ := SPL_
    319 ifeq ($(CONFIG_TPL_BUILD),y)
    320 SPL_TPL_ := TPL_
    321 else
    322 SPL_TPL_ := SPL_
    323 endif
    324 else
    325 SPL_ :=
    326 SPL_TPL_ :=
    327 endif
    328