forked from Minki/linux
4a2ff67c88
As has been discussed previously (and Sam has been CC'ed), the fix is still incorrect. It replaces "echo -ne" with "/bin/echo -ne", but neither of the two are guaranteed to support the necessary arguments and necessary (hexadecimal) escape sequences. What should be used here is printf(1). The trivial patch below (on top of these kbuild changes) fixes this issue. Signed-Off-By: Michael Tokarev <mjt@tls.msk.ru> Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Michal Marek <mmarek@suse.cz>
233 lines
8.7 KiB
Makefile
233 lines
8.7 KiB
Makefile
# Backward compatibility
|
|
asflags-y += $(EXTRA_AFLAGS)
|
|
ccflags-y += $(EXTRA_CFLAGS)
|
|
cppflags-y += $(EXTRA_CPPFLAGS)
|
|
ldflags-y += $(EXTRA_LDFLAGS)
|
|
|
|
#
|
|
# flags that take effect in sub directories
|
|
export KBUILD_SUBDIR_ASFLAGS := $(KBUILD_SUBDIR_ASFLAGS) $(subdir-asflags-y)
|
|
export KBUILD_SUBDIR_CCFLAGS := $(KBUILD_SUBDIR_CCFLAGS) $(subdir-ccflags-y)
|
|
|
|
# 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)
|
|
|
|
# Determine modorder.
|
|
# Unfortunately, we don't have information about ordering between -y
|
|
# and -m subdirs. Just put -y's first.
|
|
modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko))
|
|
|
|
__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 uses dir/ to
|
|
# tell kbuild to descend
|
|
subdir-obj-y := $(filter %/built-in.o, $(obj-y))
|
|
|
|
# $(obj-dirs) is a list of directories that contain object files
|
|
obj-dirs := $(dir $(multi-objs) $(subdir-obj-y))
|
|
|
|
# Replace multi-part objects by their individual parts, look at local dir only
|
|
real-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))
|
|
modorder := $(addprefix $(obj)/,$(modorder))
|
|
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))
|
|
|
|
# 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.
|
|
name-fix = $(subst $(comma),_,$(subst -,_,$1))
|
|
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
|
|
modname_flags = $(if $(filter 1,$(words $(modname))),\
|
|
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
|
|
|
|
#hash values
|
|
ifdef CONFIG_DYNAMIC_DEBUG
|
|
debug_flags = -D"DEBUG_HASH=$(shell ./scripts/basic/hash djb2 $(@D)$(modname))"\
|
|
-D"DEBUG_HASH2=$(shell ./scripts/basic/hash r5 $(@D)$(modname))"
|
|
else
|
|
debug_flags =
|
|
endif
|
|
|
|
orig_c_flags = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \
|
|
$(ccflags-y) $(CFLAGS_$(basetarget).o)
|
|
_c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags))
|
|
_a_flags = $(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) $(KBUILD_SUBDIR_ASFLAGS) \
|
|
$(asflags-y) $(AFLAGS_$(basetarget).o)
|
|
_cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(@F))
|
|
|
|
#
|
|
# Enable gcov profiling flags for a file, directory or for all files depending
|
|
# on variables GCOV_PROFILE_obj.o, GCOV_PROFILE and CONFIG_GCOV_PROFILE_ALL
|
|
# (in this order)
|
|
#
|
|
ifeq ($(CONFIG_GCOV_KERNEL),y)
|
|
_c_flags += $(if $(patsubst n%,, \
|
|
$(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
|
|
$(CFLAGS_GCOV))
|
|
endif
|
|
|
|
# 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
|
|
|
|
# -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) $(LINUXINCLUDE) \
|
|
$(__c_flags) $(modkern_cflags) \
|
|
-D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) \
|
|
$(debug_flags)
|
|
|
|
a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
|
$(__a_flags) $(modkern_aflags)
|
|
|
|
cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
|
$(__cpp_flags)
|
|
|
|
ld_flags = $(LDFLAGS) $(ldflags-y)
|
|
|
|
# Finds the multi-part object the current object will be linked into
|
|
modname-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-y so that we know we have to
|
|
# read in the saved command line
|
|
|
|
# Linking
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_ld = LD $@
|
|
cmd_ld = $(LD) $(LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) \
|
|
$(filter-out FORCE,$^) -o $@
|
|
|
|
# Objcopy
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_objcopy = OBJCOPY $@
|
|
cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
|
|
|
|
# Gzip
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_gzip = GZIP $@
|
|
cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \
|
|
(rm -f $@ ; false)
|
|
|
|
|
|
# Bzip2
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Bzip2 and LZMA do not include size in file... so we have to fake that;
|
|
# append the size as a 32-bit littleendian number as gzip does.
|
|
size_append = printf $(shell \
|
|
dec_size=0; \
|
|
for F in $1; do \
|
|
fsize=$$(stat -c "%s" $$F); \
|
|
dec_size=$$(expr $$dec_size + $$fsize); \
|
|
done; \
|
|
printf "%08x" $$dec_size | \
|
|
sed 's/\(..\)\(..\)\(..\)\(..\)/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/g' \
|
|
)
|
|
|
|
quiet_cmd_bzip2 = BZIP2 $@
|
|
cmd_bzip2 = (cat $(filter-out FORCE,$^) | \
|
|
bzip2 -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
|
(rm -f $@ ; false)
|
|
|
|
# Lzma
|
|
# ---------------------------------------------------------------------------
|
|
|
|
quiet_cmd_lzma = LZMA $@
|
|
cmd_lzma = (cat $(filter-out FORCE,$^) | \
|
|
lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
|
|
(rm -f $@ ; false)
|