218 lines
8 KiB
Makefile
218 lines
8 KiB
Makefile
|
cur_makefile := $(lastword $(MAKEFILE_LIST))
|
||
|
|
||
|
$(cur_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
|
||
|
# ===========================================================================
|
||
|
|
||
|
# Handle archives
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
# Extract archives from $(obj-y)
|
||
|
archive-y := $(filter %.a, $(obj-y))
|
||
|
archive-custom-valid := $(filter $(archive-custom), $(archive-y))
|
||
|
|
||
|
ifeq ($(archive-y),)
|
||
|
archive-src-y :=
|
||
|
archive-bin-y :=
|
||
|
else # archive-y
|
||
|
ifeq ($(FORCE_TO_USE_LIB),1)
|
||
|
archive-bin-y := $(archive-y)
|
||
|
else
|
||
|
# Filter out archive-custom-valid
|
||
|
archive-y := $(filter-out $(archive-custom-valid), $(archive-y))
|
||
|
|
||
|
# Extract archives that have source files available
|
||
|
archive-src-y := $(foreach m, $(archive-y), $(if $(wildcard $(addprefix $(srctree)/$(src)/,$($(m:.a=-y):.o=.*))), $(m)))
|
||
|
|
||
|
# Extract archives that do NOT have source files
|
||
|
archive-bin-y := $(filter-out $(archive-src-y), $(archive-y))
|
||
|
endif
|
||
|
|
||
|
# If the source files of the archive (including archive-custom-valid) exist, build the source files directly
|
||
|
obj-y := $(filter-out $(archive-src-y) $(archive-custom-valid), $(obj-y)) $(foreach m, $(archive-src-y) $(archive-custom-valid), $($(m:.a=-y)))
|
||
|
endif # archive-y
|
||
|
|
||
|
# Handle composite objects
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
# 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))))
|
||
|
|
||
|
# 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-subdir := $(patsubst %/,%,$(filter %/, $(multi-objs-y)))
|
||
|
multi-objs-archive := $(filter %.a, $(multi-objs-y))
|
||
|
multi-objs-y := $(patsubst %/, %/built-in$(built_in_suffix), $(multi-objs-y))
|
||
|
multi-objs := $(multi-objs-y)
|
||
|
|
||
|
define multi_subdir_built_in
|
||
|
$(foreach m, $(1), $(if $($(m:.o=$(strip $2))), $(eval $(m:.o=$(strip $2)) := $(patsubst %/, %/built-in$(built_in_suffix), $($(m:.o=$(strip $2)))))))
|
||
|
endef
|
||
|
|
||
|
ifneq ($(multi-objs-subdir),)
|
||
|
$(call multi_subdir_built_in,$(multi-used-y),-objs)
|
||
|
$(call multi_subdir_built_in,$(multi-used-y),-y)
|
||
|
endif
|
||
|
|
||
|
ifneq ($(multi-objs-archive),)
|
||
|
ifneq ($(filter $(archive-custom), $(multi-objs-archive)),)
|
||
|
$(error Composite objects cannot be built from customized archives)
|
||
|
endif
|
||
|
mobjs-archive-src-y :=
|
||
|
mobjs-archive-bin-y :=
|
||
|
mobjs-archive-y := $(multi-objs-archive)
|
||
|
|
||
|
ifeq ($(FORCE_TO_USE_LIB),1)
|
||
|
mobjs-archive-bin-y += $(mobjs-archive-y)
|
||
|
else
|
||
|
# Extract archives that have source files available
|
||
|
mobjs-archive-src-y += $(foreach m, $(mobjs-archive-y), $(if $(wildcard $(addprefix $(srctree)/$(src)/,$($(m:.a=-y):.o=.*))), $(m)))
|
||
|
|
||
|
# Extract archives that do NOT have source files
|
||
|
mobjs-archive-bin-y := $(filter-out $(mobjs-archive-src-y), $(mobjs-archive-y))
|
||
|
endif
|
||
|
|
||
|
# If the source files of the archive (including archive-custom-valid) exist, build the source files directly
|
||
|
mobjs-obj-y := $(foreach m, $(mobjs-archive-src-y), $($(m:.a=-y)))
|
||
|
|
||
|
archive-y += $(mobjs-archive-y)
|
||
|
archive-bin-y += $(mobjs-archive-bin-y)
|
||
|
archive-src-y += $(mobjs-archive-src-y)
|
||
|
obj-y += $(mobjs-obj-y)
|
||
|
endif
|
||
|
|
||
|
# Handle objects in subdirs
|
||
|
# ---------------------------------------------------------------------------
|
||
|
# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o or .a
|
||
|
# and add the directory to the list of dirs to descend into: $(subdir-y)
|
||
|
|
||
|
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
|
||
|
subdir-y += $(__subdir-y)
|
||
|
obj-y := $(patsubst %/, %/built-in$(built_in_suffix), $(obj-y))
|
||
|
|
||
|
# Subdirectories we need to descend into
|
||
|
subdir-y := $(sort $(subdir-y) $(multi-objs-subdir))
|
||
|
|
||
|
# $(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$(built_in_suffix), $(obj-y) $(multi-objs-y))
|
||
|
|
||
|
# $(obj-dirs) is a list of directories that contain object files
|
||
|
obj-dirs := $(dir $(multi-objs) $(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)
|
||
|
|
||
|
# Add subdir path
|
||
|
|
||
|
extra-y := $(addprefix $(obj)/,$(extra-y))
|
||
|
always := $(addprefix $(obj)/,$(always))
|
||
|
targets := $(addprefix $(obj)/,$(targets))
|
||
|
obj-y := $(addprefix $(obj)/,$(obj-y))
|
||
|
lib-y := $(addprefix $(obj)/,$(lib-y))
|
||
|
subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))
|
||
|
real-objs-y := $(addprefix $(obj)/,$(real-objs-y))
|
||
|
multi-used-y := $(addprefix $(obj)/,$(multi-used-y))
|
||
|
multi-objs-y := $(addprefix $(obj)/,$(multi-objs-y))
|
||
|
subdir-y := $(addprefix $(obj)/,$(subdir-y))
|
||
|
obj-dirs := $(addprefix $(obj)/,$(obj-dirs))
|
||
|
archive-y := $(addprefix $(obj)/,$(archive-y))
|
||
|
archive-src-y := $(addprefix $(obj)/,$(archive-src-y))
|
||
|
archive-bin-y := $(addprefix $(obj)/,$(archive-bin-y))
|
||
|
archive-custom-valid := $(addprefix $(obj)/,$(archive-custom-valid))
|
||
|
|
||
|
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) $(C_ONLY_FLAGS))
|
||
|
_c++_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags) $(C++_ONLY_FLAGS))
|
||
|
_a_flags = $(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) $(KBUILD_SUBDIR_ASFLAGS) \
|
||
|
$(asflags-y) $(AFLAGS_$(basetarget).o)
|
||
|
_cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(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)
|
||
|
__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)
|
||
|
__c++_flags = $(call addtree,-I$(obj)) $(call flags,_c++_flags)
|
||
|
__a_flags = $(call flags,_a_flags)
|
||
|
__cpp_flags = $(call flags,_cpp_flags)
|
||
|
endif
|
||
|
|
||
|
ifeq ($(WIN_PLAT),y)
|
||
|
# Not to include system header files in dependency files,
|
||
|
# for there are space characters in system path by default.
|
||
|
depfile_flags = -MMD -MP -MF $(depfile)
|
||
|
else
|
||
|
depfile_flags = -MD -MP -MF $(depfile)
|
||
|
endif
|
||
|
|
||
|
c_flags = $(depfile_flags) $(NOSTDINC_FLAGS) $(__c_flags)
|
||
|
|
||
|
c++_flags = $(depfile_flags) $(NOSTDINC_FLAGS) $(__c++_flags)
|
||
|
|
||
|
a_flags = $(depfile_flags) $(NOSTDINC_FLAGS) $(__a_flags)
|
||
|
|
||
|
a_cpp_flags = $(a_flags)
|
||
|
|
||
|
cpp_flags = $(depfile_flags) $(NOSTDINC_FLAGS) $(__cpp_flags)
|
||
|
|
||
|
ld_flags = $(LDFLAGS) $(ldflags-y)
|
||
|
|
||
|
# Useful for describing the dependency of composite objects
|
||
|
# Usage:
|
||
|
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
|
||
|
define multi_depend
|
||
|
$(foreach m, $(notdir $1), \
|
||
|
$(eval $(obj)/$m: \
|
||
|
$(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
|
||
|
endef
|
||
|
|
||
|
# 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)) $< $@
|
||
|
|