1cur_makefile := $(lastword $(MAKEFILE_LIST)) 2 3# ========================================================================== 4# Cleaning up 5# ========================================================================== 6 7src := $(obj) 8 9PHONY := __clean 10__clean: 11 12$(cur_makefile): ; 13 14# Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir 15# Usage: 16# $(Q)$(MAKE) $(clean)=dir 17clean := -f $(srctree)/scripts/clean.mk obj 18 19kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 20include $(kbuild-dir)/Makefile 21 22# Figure out what we need to build from the various variables 23# ========================================================================== 24 25__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) 26subdir-y += $(__subdir-y) 27__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) 28subdir-m += $(__subdir-m) 29__subdir- := $(patsubst %/,%,$(filter %/, $(obj-))) 30subdir- += $(__subdir-) 31 32# Subdirectories we need to descend into 33 34subdir-ym := $(sort $(subdir-y) $(subdir-m)) 35subdir-ymn := $(sort $(subdir-ym) $(subdir-)) 36 37obj-ymn := $(obj-y) $(obj-m) $(obj-) 38lib-ymn := $(lib-y) $(lib-m) $(lib-) 39 40# if $(foo-objs) exists, foo.o is a composite object 41multi-used-ymn := $(sort $(foreach m,$(obj-ymn), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m)))) 42multi-objs-ymn := $(foreach m, $(multi-used-ymn), $($(m:.o=-objs)) $($(m:.o=-y))) 43 44obj-ymn := $(patsubst %/, %/built-in.o %/built-in.a, $(obj-y) $(obj-m) $(obj-)) 45 46extra-ymn := $(extra-y) $(extra-m) $(extra-) 47 48# build a list of files to remove, usually relative to the current 49# directory 50 51__clean-files := $(obj-ymn) $(lib-ymn) $(multi-used-ymn) \ 52 $(multi-objs-ymn) $(extra-ymn) \ 53 built-in.o built-in.a lib.a \ 54 $(always) $(targets) $(clean-files) 55 56__clean-files := $(filter-out $(no-clean-files), $(__clean-files)) 57 58# clean-files is given relative to the current directory, unless it 59# starts with $(objtree)/ (which means "./", so do not add "./" unless 60# you want to delete a file from the toplevel object directory). 61 62__clean-files := $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \ 63 $(filter $(objtree)/%, $(__clean-files)) 64 65# same as clean-files 66 67__clean-dirs := $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(clean-dirs))) \ 68 $(filter $(objtree)/%, $(clean-dirs)) 69 70# Add subdir path 71subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) 72obj-ymn := $(addprefix $(obj)/,$(obj-ymn)) 73lib-ymn := $(addprefix $(obj)/,$(lib-ymn)) 74multi-used-ymn := $(addprefix $(obj)/,$(multi-used-ymn)) 75multi-objs-ymn := $(addprefix $(obj)/,$(multi-objs-ymn)) 76 77SUBMODS := $(filter $(obj)/%,$(SUBMODS)) 78 79ifneq ($(SUBMODS),) 80include scripts/submods.mk 81 82buildsubdir-ymn := $(call get_subdirs,$(subdir-ymn),$(SUBMODS)) 83__full-clean-files := $(__clean-files) 84__clean-files := $(filter $(SUBMODS),$(__full-clean-files)) 85__clean-files += $(obj)/built-in.o $(obj)/built-in.a $(obj)/lib.a 86__clean-files += $(foreach m,$(multi-used-ymn),$(if $(filter $(SUBMODS),$(call get_multi_objs,$m))),$m,) 87 88# Check for invalid targets 89errobj-ymn := $(SUBMODS) 90errobj-ymn := $(filter-out $(buildsubdir-ymn) $(addsuffix /%,$(buildsubdir-ymn)),$(errobj-ymn)) 91errobj-ymn := $(filter-out $(__clean-files),$(errobj-ymn)) 92errobj-ymn := $(filter-out $(foreach m,$(multi-used-ymn),$(call get_multi_objs,$m)),$(errobj-ymn)) 93ifneq ($(errobj-ymn),) 94$(warning Unknown targets in [$(obj)]: $(errobj-ymn)) 95endif 96 97else # SUBMODS 98 99ifeq ($(ALLCLEAN),1) 100RM_ALL := 1 101ifneq ($(KBUILD_OUTPUT),) 102RM_DIR := 1 103endif 104endif 105 106ifeq ($(RM_DIR),1) 107buildsubdir-ymn := 108else 109buildsubdir-ymn := $(subdir-ymn) 110endif 111 112endif # SUBMODS 113 114# Include intermediate files 115include $(srctree)/scripts/include.mk 116__clean-files += $(foreach f,$(__clean-files),$(call get_depfile_name,$f)) 117 118#$(info RM_DIR=$(RM_DIR), RM_ALL=$(RM_ALL)) 119#$(info buildsubdir-ymn=$(buildsubdir-ymn)) 120#$(info __clean-files=$(__clean-files)) 121 122__clean-files := $(wildcard $(__clean-files)) 123__clean-dirs := $(wildcard $(__clean-dirs)) 124 125# ========================================================================== 126 127ifeq ($(RM_DIR),1) 128 129quiet_cmd_clean = RMDIR $(obj) 130 cmd_clean = $(call CMDRMDIR,$(obj)) 131 132else # RM_DIR 133 134quiet_cmd_clean = CLEAN $(obj) 135ifeq ($(RM_ALL),1) 136 cmd_clean = $(call CMDRMFILER,$(obj),*.o *.a *.s *.d) 137else 138 cmd_clean = $(call CMDRMFILE,$(__clean-files)) 139endif 140quiet_cmd_cleandir = CLEAN $(__clean-dirs) 141 cmd_cleandir = $(call CMDRMDIR,$(__clean-dirs)) 142 143endif # RM_DIR 144 145 146__clean: $(buildsubdir-ymn) 147 @: 148ifeq ($(RM_DIR),1) 149 +$(call cmd,clean) 150else # RM_DIR 151ifeq ($(RM_ALL),1) 152 +$(call cmd,clean) 153else 154ifneq ($(strip $(__clean-files)),) 155 +$(call cmd,clean) 156endif 157endif 158ifneq ($(strip $(__clean-dirs)),) 159 +$(call cmd,cleandir) 160endif 161endif # RM_DIR 162 163 164# =========================================================================== 165# Generic stuff 166# =========================================================================== 167 168# Descending 169# --------------------------------------------------------------------------- 170 171PHONY += $(subdir-ymn) 172$(subdir-ymn): 173 $(Q)$(MAKE) $(clean)=$@ 174 175 176# Declare the contents of the .PHONY variable as phony. We keep that 177# information in a variable se we can use it in if_changed and friends. 178 179.PHONY: $(PHONY) 180