261 lines · 9.7 KB · Text
RawDownload
# ===========================================================================# kbuild: Generic definitions# =========================================================================== # Standard vars comma   := ,empty   :=space   := $(empty) $(empty) # Backward compatibility - to be removed...extra-y	+= $(EXTRA_TARGETS)# Figure out what we need to build from the various variables# =========================================================================== # When an object is listed to be built compiled-in and modular,# only build the compiled-in version obj-m := $(filter-out $(obj-y),$(obj-m)) # Libraries are always collected in one lib file.# Filter out objects already built-in lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))  # Handle objects in subdirs# ---------------------------------------------------------------------------# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o#   and add the directory to the list of dirs to descend into: $(subdir-y)# o if we encounter foo/ in $(obj-m), remove it from $(obj-m) #   and add the directory to the list of dirs to descend into: $(subdir-m) __subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))subdir-y	+= $(__subdir-y)__subdir-m	:= $(patsubst %/,%,$(filter %/, $(obj-m)))subdir-m	+= $(__subdir-m)obj-y		:= $(patsubst %/, %/built-in.o, $(obj-y))obj-m		:= $(filter-out %/, $(obj-m)) # Subdirectories we need to descend into subdir-ym	:= $(sort $(subdir-y) $(subdir-m)) # if $(foo-objs) exists, foo.o is a composite object multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))multi-used-m := $(sort $(foreach m,$(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))multi-used   := $(multi-used-y) $(multi-used-m)single-used-m := $(sort $(filter-out $(multi-used-m),$(obj-m))) # Build list of the parts of our composite objects, our composite# objects depend on those (obviously)multi-objs-y := $(foreach m, $(multi-used-y), $($(m:.o=-objs)) $($(m:.o=-y)))multi-objs-m := $(foreach m, $(multi-used-m), $($(m:.o=-objs)) $($(m:.o=-y)))multi-objs   := $(multi-objs-y) $(multi-objs-m) # $(subdir-obj-y) is the list of objects in $(obj-y) which do not live# in the local directorysubdir-obj-y := $(foreach o,$(obj-y),$(if $(filter-out $(o),$(notdir $(o))),$(o))) # $(obj-dirs) is a list of directories that contain object filesobj-dirs := $(dir $(multi-objs) $(subdir-obj-y)) # Replace multi-part objects by their individual parts, look at local dir onlyreal-objs-y := $(foreach m, $(filter-out $(subdir-obj-y), $(obj-y)), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m))) $(extra-y)real-objs-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m))) # Add subdir path extra-y		:= $(addprefix $(obj)/,$(extra-y))always		:= $(addprefix $(obj)/,$(always))targets		:= $(addprefix $(obj)/,$(targets))obj-y		:= $(addprefix $(obj)/,$(obj-y))obj-m		:= $(addprefix $(obj)/,$(obj-m))lib-y		:= $(addprefix $(obj)/,$(lib-y))subdir-obj-y	:= $(addprefix $(obj)/,$(subdir-obj-y))real-objs-y	:= $(addprefix $(obj)/,$(real-objs-y))real-objs-m	:= $(addprefix $(obj)/,$(real-objs-m))single-used-m	:= $(addprefix $(obj)/,$(single-used-m))multi-used-y	:= $(addprefix $(obj)/,$(multi-used-y))multi-used-m	:= $(addprefix $(obj)/,$(multi-used-m))multi-objs-y	:= $(addprefix $(obj)/,$(multi-objs-y))multi-objs-m	:= $(addprefix $(obj)/,$(multi-objs-m))subdir-ym	:= $(addprefix $(obj)/,$(subdir-ym))obj-dirs	:= $(addprefix $(obj)/,$(obj-dirs)) # The temporary file to save gcc -MD generated dependencies must not# contain a commadepfile = $(subst $(comma),_,$(@D)/.$(@F).d) # These flags are needed for modversions and compiling, so we define them here# already# $(modname_flags) #defines KBUILD_MODNAME as the name of the module it will # end up in (or would, if it gets compiled in)# Note: It's possible that one object gets potentially linked into more#       than one module. In that case KBUILD_MODNAME will be set to foo_bar,#       where foo and bar are the name of the modules.basename_flags = -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F)))modname_flags  = $(if $(filter 1,$(words $(modname))),-DKBUILD_MODNAME=$(subst $(comma),_,$(subst -,_,$(modname)))) _c_flags       = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o)_a_flags       = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o)_cpp_flags     = $(CPPFLAGS) $(EXTRA_CPPFLAGS) $(CPPFLAGS_$(@F)) # If building the kernel in a separate objtree expand all occurrences# of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/'). ifeq ($(KBUILD_SRC),)__c_flags	= $(_c_flags)__a_flags	= $(_a_flags)__cpp_flags     = $(_cpp_flags)else # Prefix -I with $(srctree) if it is not an absolute pathaddtree = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1)# Find all -I options and call addtreeflags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) # -I$(obj) locates generated .h files# $(call addtree,-I$(obj)) locates .h files in srctree, from generated .c files#   and locates generated .h files# FIXME: Replace both with specific CFLAGS* statements in the makefiles__c_flags	= $(call addtree,-I$(obj)) $(call flags,_c_flags)__a_flags	=                          $(call flags,_a_flags)__cpp_flags     =                          $(call flags,_cpp_flags)endif c_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(CPPFLAGS) \		 $(__c_flags) $(modkern_cflags) \		 $(basename_flags) $(modname_flags) a_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(CPPFLAGS) \		 $(__a_flags) $(modkern_aflags) cpp_flags      = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(__cpp_flags) ld_flags       = $(LDFLAGS) $(EXTRA_LDFLAGS) # Finds the multi-part object the current object will be linked intomodname-multi = $(sort $(foreach m,$(multi-used),\		$(if $(filter $(subst $(obj)/,,$*.o), $($(m:.o=-objs)) $($(m:.o=-y))),$(m:.o=)))) # Shipped files# =========================================================================== quiet_cmd_shipped = SHIPPED $@cmd_shipped = cat $< > $@ $(obj)/%:: $(src)/%_shipped	$(call cmd,shipped) # Commands useful for building a boot image# ===========================================================================# #	Use as following:##	target: source(s) FORCE#		$(if_changed,ld/objcopy/gzip)##	and add target to EXTRA_TARGETS so that we know we have to#	read in the saved command line # Linking# --------------------------------------------------------------------------- quiet_cmd_ld = LD      $@cmd_ld = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LDFLAGS_$(@F)) \	       $(filter-out FORCE,$^) -o $@  # Objcopy# --------------------------------------------------------------------------- quiet_cmd_objcopy = OBJCOPY $@cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@ # Gzip# --------------------------------------------------------------------------- quiet_cmd_gzip = GZIP    $@cmd_gzip = gzip -f -9 < $< > $@ # ===========================================================================# Generic stuff# =========================================================================== # function to only execute the passed command if necessary# >'< substitution is for echo to work, >$< substitution to preserve $ when reloading .cmd file# note: when using inline perl scripts [perl -e '...$$t=1;...'] in $(cmd_xxx) double $$ your perl vars if_changed = $(if $(strip $? \		          $(filter-out $(cmd_$(1)),$(cmd_$@))\			  $(filter-out $(cmd_$@),$(cmd_$(1)))),\	@set -e; \	$(if $($(quiet)cmd_$(1)),echo '  $(subst ','\'',$($(quiet)cmd_$(1)))';) \	$(cmd_$(1)); \	echo 'cmd_$@ := $(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).cmd)  # execute the command and also postprocess generated .d dependencies# file if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\		          $(filter-out $(cmd_$(1)),$(cmd_$@))\			  $(filter-out $(cmd_$@),$(cmd_$(1)))),\	@set -e; \	$(if $($(quiet)cmd_$(1)),echo '  $(subst ','\'',$($(quiet)cmd_$(1)))';) \	$(cmd_$(1)); \	scripts/basic/fixdep $(depfile) $@ '$(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \	rm -f $(depfile); \	mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd) # Usage: $(call if_changed_rule,foo)# will check if $(cmd_foo) changed, or any of the prequisites changed,# and if so will execute $(rule_foo) if_changed_rule = $(if $(strip $? \		               $(filter-out $(cmd_$(1)),$(cmd_$@))\			       $(filter-out $(cmd_$@),$(cmd_$(1)))),\			@set -e; \			$(rule_$(1))) # If quiet is set, only print short version of command cmd = @$(if $($(quiet)cmd_$(1)),echo '  $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1)) #	$(call descend,<dir>,<target>)#	Recursively call a sub-make in <dir> with target <target> # Usage is deprecated, because make do not see this as an invocation of make.descend =$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=$(1) $(2) # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=# Usage:# $(Q)$(MAKE) $(build)=dirbuild := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj # filechk is used to check if the content of a generated file is updated.# Sample usage:# define filechk_sample#	echo $KERNELRELEASE# endef# version.h : Makefile#	$(call filechk,sample)# The rule defined shall write to stdout the content of the new file.# The existing file will be compared with the new one.# - If no file exist it is created# - If the content differ the new file is used# - If they are equal no change, and no timestamp update define filechk	$(Q)set -e;				\	echo '  CHK     $@';			\	mkdir -p $(dir $@);			\	$(filechk_$(1)) $(2) > $@.tmp;		\	if [ -r $@ ] && cmp -s $@ $@.tmp; then	\		rm -f $@.tmp;			\	else					\		echo '  UPD     $@';		\		mv -f $@.tmp $@;		\	fiendef