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 $(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- := $(patsubst %/,%,$(filter %/, $(obj-))) 27subdir- += $(__subdir-) 28 29# Subdirectories we need to descend into 30 31subdir-ym := $(sort $(subdir-y) $(subdir-m)) 32subdir-ymn := $(sort $(subdir-ym) $(subdir-)) 33 34# Add subdir path 35 36subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) 37 38# Temporal work-around for U-Boot 39 40subdir-ymn := $(foreach f, $(subdir-ymn), \ 41 $(if $(wildcard $(srctree)/$f/Makefile),$f)) 42 43# build a list of files to remove, usually relative to the current 44# directory 45 46__clean-files := $(extra-y) $(extra-m) $(extra-) \ 47 $(always) $(targets) $(clean-files) \ 48 $(host-progs) \ 49 $(hostprogs-y) $(hostprogs-m) $(hostprogs-) 50 51__clean-files := $(filter-out $(no-clean-files), $(__clean-files)) 52 53# as clean-files is given relative to the current directory, this adds 54# a $(obj) prefix, except for absolute paths 55 56__clean-files := $(wildcard \ 57 $(addprefix $(obj)/, $(filter-out /%, $(__clean-files))) \ 58 $(filter /%, $(__clean-files))) 59 60# as clean-dirs is given relative to the current directory, this adds 61# a $(obj) prefix, except for absolute paths 62 63__clean-dirs := $(wildcard \ 64 $(addprefix $(obj)/, $(filter-out /%, $(clean-dirs))) \ 65 $(filter /%, $(clean-dirs))) 66 67# ========================================================================== 68 69quiet_cmd_clean = CLEAN $(obj) 70 cmd_clean = rm -f $(__clean-files) 71quiet_cmd_cleandir = CLEAN $(__clean-dirs) 72 cmd_cleandir = rm -rf $(__clean-dirs) 73 74 75__clean: $(subdir-ymn) 76ifneq ($(strip $(__clean-files)),) 77 +$(call cmd,clean) 78endif 79ifneq ($(strip $(__clean-dirs)),) 80 +$(call cmd,cleandir) 81endif 82ifneq ($(strip $(clean-rule)),) 83 +$(clean-rule) 84endif 85 @: 86 87 88# =========================================================================== 89# Generic stuff 90# =========================================================================== 91 92# Descending 93# --------------------------------------------------------------------------- 94 95PHONY += $(subdir-ymn) 96$(subdir-ymn): 97 $(Q)$(MAKE) $(clean)=$@ 98 99# If quiet is set, only print short version of command 100 101cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) 102 103 104# Declare the contents of the .PHONY variable as phony. We keep that 105# information in a variable se we can use it in if_changed and friends. 106 107.PHONY: $(PHONY) 108