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