1# ========================================================================== 2# Cleaning up 3# ========================================================================== 4 5src := $(obj) 6 7PHONY := __clean 8__clean: 9 10# Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir 11# Usage: 12# $(Q)$(MAKE) $(clean)=dir 13clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj 14 15# The filename Kbuild has precedence over Makefile 16kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 17include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile) 18 19# Figure out what we need to build from the various variables 20# ========================================================================== 21 22__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) 23subdir-y += $(__subdir-y) 24__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) 25subdir-m += $(__subdir-m) 26__subdir-n := $(patsubst %/,%,$(filter %/, $(obj-n))) 27subdir-n += $(__subdir-n) 28__subdir- := $(patsubst %/,%,$(filter %/, $(obj-))) 29subdir- += $(__subdir-) 30 31# Subdirectories we need to descend into 32 33subdir-ym := $(sort $(subdir-y) $(subdir-m)) 34subdir-ymn := $(sort $(subdir-ym) $(subdir-n) $(subdir-)) 35 36# Add subdir path 37 38subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) 39 40# Temporal work-around for U-Boot 41 42subdir-ymn := $(foreach f, $(subdir-ymn), \ 43 $(if $(wildcard $(srctree)/$f/Makefile),$f)) 44 45# build a list of files to remove, usually relative to the current 46# directory 47 48__clean-files := $(extra-y) $(extra-m) $(extra-) \ 49 $(always) $(targets) $(clean-files) \ 50 $(host-progs) \ 51 $(hostprogs-y) $(hostprogs-m) $(hostprogs-) 52 53__clean-files := $(filter-out $(no-clean-files), $(__clean-files)) 54 55# as clean-files is given relative to the current directory, this adds 56# a $(obj) prefix, except for absolute paths 57 58__clean-files := $(wildcard \ 59 $(addprefix $(obj)/, $(filter-out /%, $(__clean-files))) \ 60 $(filter /%, $(__clean-files))) 61 62# as clean-dirs is given relative to the current directory, this adds 63# a $(obj) prefix, except for absolute paths 64 65__clean-dirs := $(wildcard \ 66 $(addprefix $(obj)/, $(filter-out /%, $(clean-dirs))) \ 67 $(filter /%, $(clean-dirs))) 68 69# ========================================================================== 70 71quiet_cmd_clean = CLEAN $(obj) 72 cmd_clean = rm -f $(__clean-files) 73quiet_cmd_cleandir = CLEAN $(__clean-dirs) 74 cmd_cleandir = rm -rf $(__clean-dirs) 75 76 77__clean: $(subdir-ymn) 78ifneq ($(strip $(__clean-files)),) 79 +$(call cmd,clean) 80endif 81ifneq ($(strip $(__clean-dirs)),) 82 +$(call cmd,cleandir) 83endif 84ifneq ($(strip $(clean-rule)),) 85 +$(clean-rule) 86endif 87 @: 88 89 90# =========================================================================== 91# Generic stuff 92# =========================================================================== 93 94# Descending 95# --------------------------------------------------------------------------- 96 97PHONY += $(subdir-ymn) 98$(subdir-ymn): 99 $(Q)$(MAKE) $(clean)=$@ 100 101# If quiet is set, only print short version of command 102 103cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) 104 105 106# Declare the contents of the .PHONY variable as phony. We keep that 107# information in a variable se we can use it in if_changed and friends. 108 109.PHONY: $(PHONY) 110