xref: /optee_os/mk/cleandirs.mk (revision 7ea0c7085a728a7fb6dcff478dcf347148f08efa)
19ac870c9SJerome Forissier# Cleaning directories generated during a previous build,
29ac870c9SJerome Forissier# a failed previous build or even no previous build.
39ac870c9SJerome Forissier# Track build directories through 'cleanfiles'.
49ac870c9SJerome Forissier
59ac870c9SJerome Forissierdefine _enum-parent-dirs
69ac870c9SJerome Forissier$(if $(1),$(1) $(if $(filter / ./,$(dir $(1))),,$(call enum-parent-dirs,$(dir $(1)))),)
79ac870c9SJerome Forissierendef
89ac870c9SJerome Forissier
99ac870c9SJerome Forissierdefine enum-parent-dirs
109ac870c9SJerome Forissier$(call _enum-parent-dirs,$(patsubst %/,%,$(1)))
119ac870c9SJerome Forissierendef
129ac870c9SJerome Forissier
139ac870c9SJerome Forissierdefine _reverse
149ac870c9SJerome Forissier$(if $(1),$(call _reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1))
159ac870c9SJerome Forissierendef
169ac870c9SJerome Forissier
179ac870c9SJerome Forissier# Returns the list of all existing output directories up to $(O) including all
189ac870c9SJerome Forissier# intermediate levels, in depth first order so that rmdir can process them in
199ac870c9SJerome Forissier# order. May return an empty string.
209ac870c9SJerome Forissier# Example: if cleanfiles is "foo/a/file1 foo/b/c/d/file2" and O=foo, this will
219ac870c9SJerome Forissier# return "foo/b/c/d foo/b/c foo/b foo/a" (assuming all exist).
229ac870c9SJerome Forissierdefine cleandirs-for-rmdir
236331a050SJerome Forissier$(eval _O:=$(if $(O),$(O),.))$(wildcard $(addprefix $(_O)/,$(call _reverse,
246331a050SJerome Forissier	$(sort $(foreach d,$(patsubst $(_O)/%,%,$(dir $(cleanfiles))),
259ac870c9SJerome Forissier			   $(call enum-parent-dirs,$(d)))))))
269ac870c9SJerome Forissierendef
2730a44336SJerome Forissier
2830a44336SJerome ForissierRMDIR := rmdir --ignore-fail-on-non-empty
29bc0d2712SJerome Forissier
30bc0d2712SJerome Forissier# Remove files with "rm -f".
31bc0d2712SJerome Forissier# Split (possibly huge) file list into more manageable lines
32bc0d2712SJerome Forissier# (200 files at a time), to minimize the odds of having:
33bc0d2712SJerome Forissier# "/bin/bash: Argument list too long"
34bc0d2712SJerome Forissierdefine do-rm-f
35*7ea0c708SJens Wiklander        $(call _do-rm-f, $(wordlist 1, 200, $(1))) \
36bc0d2712SJerome Forissier        $(eval _tail := $(wordlist 201, $(words $(1)), $(1)))
37bc0d2712SJerome Forissier        $(if $(_tail), $(call do-rm-f, $(_tail)))
38bc0d2712SJerome Forissierendef
39bc0d2712SJerome Forissier
40bc0d2712SJerome Forissierdefine _do-rm-f
41bc0d2712SJerome Forissier        ${q}rm -f $1
42bc0d2712SJerome Forissierendef
43