--- a/GNUmakefile
+++ b/GNUmakefile
@@ -61,9 +61,15 @@ include $(GNUSTEP_MAKEFILES)/common.make
 include ./Version
 -include config.mak
 
+# Helper variable to check if the generated makefiles are present.  If
+# they are not, the tree is clean so prevent make from recursing into
+# subprojects when clean/distclean is being invoked again.
+_have_makefiles := $(shell test -f config.mak -o -f base.make && echo yes)
+
 #
 # The list of subproject directories
 #
+ifeq ($(_have_makefiles),yes)
 SUBPROJECTS = Source
 ifeq ($(GNUSTEP_BASE_HAVE_GNUTLS), 0)
 ifneq ($(GNUSTEP_TARGET_OS), mingw32)
@@ -71,6 +77,7 @@ ifneq ($(GNUSTEP_TARGET_OS), mingw32)
 endif
 endif
 SUBPROJECTS += Tools NSTimeZones Resources Tests
+endif
 
 -include Makefile.preamble
 
--- a/Makefile.postamble
+++ b/Makefile.postamble
@@ -1,4 +1,4 @@
-#  -*-makefile-*-
+#  -*-makefile-gmake-*-
 #  Makefile.postamble
 #
 #  Copyright (C) 1997 Free Software Foundation, Inc.
@@ -33,7 +33,19 @@
 #
 
 # Things to do before compiling
-#before-all::
+# Automatically run ./configure if needed to generate the makefiles
+# which we need in order to do our job.  If you need any special
+# argument to ./configure, you can't rely on this rule, and you must
+# always run ./configure manually.
+before-all:: config.mak base.make
+ifeq ($(_have_makefiles),)
+	./configure
+# The prerequisites have been generated but there are no SUBPROJECTS
+# defined because _have_makefiles has been defined to the empty string
+# when make was invoked initially.  Force make to reread the makefiles
+# in order to continue with the compilation.
+	$(MAKE)
+endif
 
 # Things to do after compiling
 # after-all::
@@ -79,14 +91,22 @@ after-distclean::
 # Things to do after checking
 # after-check::
 
-# Automatically run ./configure if needed to generate the makefiles
-# which we need in order to do our job.  If you need any special
-# argument to ./configure, you can't rely on this rule, and you must
-# always run ./configure manually.  This rule is usually executed
-# whenever 'make xxx' is invoked after a 'make distclean' - which is
-# why we can't guess what the ./configure arguments were last time
-# ./configure was called - make distclean cleans the sources
-# completely, wiping out any memory of specific configuration.
-config.mak base.make: config.mak.in base.make.in Version configure
-	./configure
-
+# If the generated makefiles are present but their prerequisites have
+# changed, let config.status regenerate them.  This is much faster and
+# equally safe than running configure again, provided that configure
+# has not been modified.  Make sure to handle that case too.
+ifeq ($(_have_makefiles),yes)
+config.mak: config.status config.mak.in
+	@./$< $@
+
+base.make: config.status base.make.in Version
+# If Version is newer than the target, configure must be rerun so that
+# its variables get AC_SUBST'ed and actually updated in base.make.
+	@if [ Version -nt $@ ]; then ./configure; else ./$< $@; fi
+
+config.status: configure
+	@if [ -f $@ ]; then ./$@ --recheck; else ./$<; fi
+else
+# The makefiles are missing and will be generated by config.status.
+config.mak base.make: ;
+endif
--- a/Source/Makefile.postamble
+++ b/Source/Makefile.postamble
@@ -1,4 +1,4 @@
-#
+#  -*-makefile-gmake-*-
 #  Makefile.postamble
 #
 #  Copyright (C) 1997 Free Software Foundation, Inc.
@@ -102,18 +102,16 @@ before-uninstall::
 
 # Things to do after cleaning
 after-clean::
-	rm -f libgnustep-base.def
+	rm -f libgnustep-base.def Info-gnustep.plist
 
 # Things to do before distcleaning
 # before-distclean::
 
 # Things to do after distcleaning
 after-distclean::
-	rm -f mframe/mframe.h Foundation \
-		NSNumber[0-9]*.m GSValue[0-9]*.m
+	rm -f $(GNUSTEP_TARGET_DIR)/dynamic-load.h
+	rm -f $(GNUSTEP_TARGET_DIR)/config.h
 	rm -rf $(GNUSTEP_TARGET_DIR)/GNUstepBase
-	rm -rf $(GNUSTEP_TARGET_DIR)/mframe.h
-	rm -rf $(GNUSTEP_TARGET_DIR)/mframe.h
 	rm -rf $(GNUSTEP_TARGET_CPU)
 
 # Things to do before checking
@@ -139,11 +137,6 @@ $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h: ../config.status
 	-mv $(HEADER_DIR_BASE)/GSConfig.h $(GNUSTEP_TARGET_DIR)/GNUstepBase
 	-touch $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h
 
-$(GNUSTEP_TARGET_DIR)/mframe.h: mframe/config.status
-	$(MKDIRS) $(GNUSTEP_TARGET_DIR)
-	-mv mframe/mframe.h $(GNUSTEP_TARGET_DIR)
-	-touch $(GNUSTEP_TARGET_DIR)/mframe.h
-
 ifneq ($(GNUSTEP_TARGET_DIR),.)
 $(GNUSTEP_TARGET_DIR)/common.h: common.h
 	$(MKDIRS) $(GNUSTEP_TARGET_DIR)
