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 27*30a44336SJerome Forissier 28*30a44336SJerome ForissierRMDIR := rmdir --ignore-fail-on-non-empty 29