obj-y := obj-m := always := targets := .DEFAULT_GOAL := all src := $(patsubst %/,%,$(obj)) -include $(srctree)/.config -include $(obj)Kbuild ifdef lib-y export cflags-y else ifdef lib-m export cflags-y endif ifdef bin-y export cflags-y export ldflags-y endif ifneq ($(strip $(lib-y) $(lib-m) $(lib-n)),) lib = $(lib-y)$(lib-m)$(lib-n) endif ifneq ($(strip $(bin-y) $(bin-n)),) bin = $(bin-y)$(bin-n) endif objects := $(filter %.o,$(obj-y)) subdirs := $(filter %/,$(obj-y)) $(filter %/,$(obj-m)) cflags := $(cflags-y) $(KBUILD_CFLAGS) -MMD -MP asflags := $(asflags-y) $(KBUILD_ASFLAGS) ldflags := $(ldflags-y) $(KBUILD_LDFLAGS) collect-obj-y = $(foreach e,$(shell echo 'all:; @echo $$(obj-y)' | \ $(MAKE) -f $(obj)$(1)Kbuild -f - --no-print-directory 2>/dev/null),\ $(if $(filter %/,$(e)),$(addprefix $(e),$(call collect-obj-y,$(1)$(e))),$(e))) ifneq ($(strip $(lib-y) $(lib-m)),) subdir-objects := $(foreach d,$(subdirs),$(addprefix $(d),$(call collect-obj-y,$(d)))) all-objects := $(objects) $(subdir-objects) else ifdef bin-y subdir-objects := $(foreach d,$(subdirs),$(addprefix $(d),$(call collect-obj-y,$(d)))) all-objects := $(objects) $(subdir-objects) else all-objects := $(objects) endif deps := $(all-objects:.o=.d) -include $(deps) c-sources := $(wildcard $(addprefix $(obj),$(objects:.o=.c))) s-sources := $(wildcard $(addprefix $(obj),$(objects:.o=.s))) subdir-c-sources := $(wildcard $(addprefix $(obj),$(subdir-objects:.o=.c))) subdir-s-sources := $(wildcard $(addprefix $(obj),$(subdir-objects:.o=.s))) PHONY := all install ifdef lib-y all: $(obj)$(lib-y) $(addprefix $(obj),$(always)) $(obj)$(lib): $(addprefix $(obj),$(all-objects)) $(MSG) AR "$@" $(Q)$(AR) rcs $@ $^ $(O)/$(parent)/$(lib-y): $(obj)$(lib-y) $(Q)mkdir -p $(O)/$(dir $@) $(Q)install -m 0644 $< $@ install: $(O)/$(parent)/$(lib-y) else ifdef lib-m all: $(obj)$(lib-m) $(addprefix $(obj),$(always)) $(obj)$(lib): $(addprefix $(obj),$(all-objects)) $(MSG) AR "$@" $(Q)$(AR) rcs $@ $^ else ifdef bin-y all: $(obj)$(bin-y) $(addprefix $(obj),$(always)) $(obj)$(bin-y): $(addprefix $(obj),$(all-objects)) $(libs-y) ${prereq} $(MSG) LD "$@" $(Q)$(LD) $(ldflags) -o $@ $^ $(O)/$(parent)/$(bin-y): $(obj)$(bin-y) $(Q)mkdir -p $(O)/$(parent) $(Q)install -m 0755 $< $@ install: $(O)/$(parent)/$(bin-y) else all: $(addprefix $(obj),$(all-objects)) $(subdirs) $(addprefix $(obj),$(always)) install: $(subdirs) endif PHONY += clean clean-% clean: $(addprefix clean-,$(subdirs)) ifdef deps $(Q)rm -f $(addprefix $(obj),$(deps)) endif ifdef targets $(Q)rm -f $(addprefix $(obj),$(targets)) endif ifdef all-objects $(Q)rm -f $(addprefix $(obj),$(all-objects)) endif ifdef lib $(Q)rm -f "$(obj)$(lib)" endif ifdef bin $(Q)rm -f $(obj)$(bin) endif ifdef always $(Q)rm -f $(addprefix $(obj),$(always)) endif $(filter $(addprefix $(obj),$(all-objects)),$(c-sources:.c=.o) $(subdir-c-sources:.c=.o)): $(obj)%.o: $(obj)%.c $(MSG) CC "$@" $(Q)$(CC) $(cflags) -c $< -o $@ $(filter $(addprefix $(obj),$(all-objects)),$(s-sources:.s=.o) $(subdir-s-sources:.s=.o)): $(obj)%.o: $(obj)%.s $(MSG) AS "$@" $(Q)$(CC) $(asflags) -c $< -o $@ .PHONY: $(subdirs) $(subdirs): $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj="$(obj)$@" parent="$(obj)" ${MAKECMDGOALS} clean-%: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj="$(obj)$*" clean .PHONY: $(PHONY)