Index: Makefile
===================================================================
--- Makefile	(revision 5186)
+++ Makefile	(working copy)
@@ -119,9 +119,33 @@
 crt0s:=
 ldscripts:=
 types:=obj initobj driver smmobj
-includemakefiles=$(foreach type,$(2), $(eval $(type)-y:=)) $(eval subdirs-y:=) $(eval -include $(1)) $(if $(strip $(3)),$(foreach type,$(2),$(eval $(type)s+=$$(patsubst util/%,$(obj)/util/%,$$(patsubst src/%,$(obj)/%,$$(addprefix $(dir $(1)),$$($(type)-y))))))) $(eval subdirs+=$$(subst $(PWD)/,,$$(abspath $$(addprefix $(dir $(1)),$$(subdirs-y)))))
-evaluate_subdirs=$(eval cursubdirs:=$(subdirs)) $(eval subdirs:=) $(foreach dir,$(cursubdirs),$(eval $(call includemakefiles,$(dir)/Makefile.inc,$(types),$(1)))) $(if $(subdirs),$(eval $(call evaluate_subdirs, $(1))))
 
+# Clean -y variables, include Makefile.inc
+# If $(3) is non-empty, add paths to files in X-y, and add them to Xs
+# Add subdirs-y to subdirs
+includemakefiles= \
+	$(foreach type,$(2), $(eval $(type)-y:=)) \
+	$(eval subdirs-y:=) \
+	$(eval -include $(1)) \
+	$(if $(strip $(3)), \
+		$(foreach type,$(2), \
+			$(eval $(type)s+= \
+				$$(patsubst util/%, \
+					$(obj)/util/%, \
+					$$(patsubst src/%, \
+						$(obj)/%, \
+						$$(addprefix $(dir $(1)),$$($(type)-y))))))) \
+	$(eval subdirs+=$$(subst $(PWD)/,,$$(abspath $$(addprefix $(dir $(1)),$$(subdirs-y)))))
+
+# For each path in $(subdirs) call includemakefiles, passing $(1) as $(3)
+# Repeat until subdirs is empty
+evaluate_subdirs= \
+	$(eval cursubdirs:=$(subdirs)) \
+	$(eval subdirs:=) \
+	$(foreach dir,$(cursubdirs), \
+		$(eval $(call includemakefiles,$(dir)/Makefile.inc,$(types),$(1)))) \
+	$(if $(subdirs),$(eval $(call evaluate_subdirs, $(1))))
+
 # collect all object files eligible for building
 subdirs:=$(PLATFORM-y) $(BUILD-y)
 $(eval $(call evaluate_subdirs, modify))
