xref: /optee_os/mk/cleandirs.mk (revision 9ac870c9bb8ed00492cb57eb2c6ee399bf24ef36)
1*9ac870c9SJerome Forissier# Cleaning directories generated during a previous build,
2*9ac870c9SJerome Forissier# a failed previous build or even no previous build.
3*9ac870c9SJerome Forissier# Track build directories through 'cleanfiles'.
4*9ac870c9SJerome Forissier
5*9ac870c9SJerome Forissierdefine _enum-parent-dirs
6*9ac870c9SJerome Forissier$(if $(1),$(1) $(if $(filter / ./,$(dir $(1))),,$(call enum-parent-dirs,$(dir $(1)))),)
7*9ac870c9SJerome Forissierendef
8*9ac870c9SJerome Forissier
9*9ac870c9SJerome Forissierdefine enum-parent-dirs
10*9ac870c9SJerome Forissier$(call _enum-parent-dirs,$(patsubst %/,%,$(1)))
11*9ac870c9SJerome Forissierendef
12*9ac870c9SJerome Forissier
13*9ac870c9SJerome Forissierdefine _reverse
14*9ac870c9SJerome Forissier$(if $(1),$(call _reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1))
15*9ac870c9SJerome Forissierendef
16*9ac870c9SJerome Forissier
17*9ac870c9SJerome Forissier# Returns the list of all existing output directories up to $(O) including all
18*9ac870c9SJerome Forissier# intermediate levels, in depth first order so that rmdir can process them in
19*9ac870c9SJerome Forissier# order. May return an empty string.
20*9ac870c9SJerome Forissier# Example: if cleanfiles is "foo/a/file1 foo/b/c/d/file2" and O=foo, this will
21*9ac870c9SJerome Forissier# return "foo/b/c/d foo/b/c foo/b foo/a" (assuming all exist).
22*9ac870c9SJerome Forissierdefine cleandirs-for-rmdir
23*9ac870c9SJerome Forissier$(wildcard $(addprefix $(O)/,$(call _reverse,$(sort
24*9ac870c9SJerome Forissier			$(foreach d,$(patsubst $(O)/%,%,$(dir $(cleanfiles))),
25*9ac870c9SJerome Forissier				    $(call enum-parent-dirs,$(d)))))))
26*9ac870c9SJerome Forissierendef
27