Avoid unnecessary recompilation after ./configure (helps #3228)
authorSimon Marlow <marlowsd@gmail.com>
Tue, 7 Jul 2009 08:50:40 +0000 (08:50 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 7 Jul 2009 08:50:40 +0000 (08:50 +0000)
We cache the old versions of files generated by configure, so that if
configure touches the file without changing it, we can detect that and
restore the timestamp.

Makefile
ghc.mk

index 69c419c..0d563df 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -51,10 +51,39 @@ include mk/custom-settings.mk
 # No need to update makefiles for these targets:
 REALGOALS=$(filter-out bootstrapping-files framework-pkg clean clean_% distclean maintainer-clean show help,$(MAKECMDGOALS))
 
+# configure touches certain files even if they haven't changed.  This
+# can mean a lot of unnecessary recompilation after a re-configure, so
+# here we cache the old versions of these files so we can restore the
+# timestamps.
+#
+define check-configure-file
+# $1 = file
+if ! test -f $1.old; then \
+  echo "backing up $1"; \
+  cp $1 $1.old; \
+  touch -r $1 $1.old; \
+else \
+  if test $1 -nt $1.old; then \
+    if cmp $1 $1.old; then \
+       echo "$1 has been touched, but has not changed"; \
+       touch -r $1.old $1; \
+    else \
+       echo "$1 has changed"; \
+       cp $1 $1.old; \
+       touch -r $1 $1.old; \
+    fi \
+  fi \
+fi
+endef
+
 # NB. not the same as saying '%: ...', which doesn't do the right thing:
 # it does nothing if we specify a target that already exists.
 .PHONY: $(REALGOALS)
 $(REALGOALS) all:
+       @$(call check-configure-file,mk/config.mk)
+       @$(call check-configure-file,mk/project.mk)
+       @$(call check-configure-file,compiler/ghc.cabal)
+
        @echo "===--- updating makefiles phase 0"
        $(MAKE) -r --no-print-directory -f ghc.mk phase=0 just-makefiles
 ifneq "$(OMIT_PHASE_1)" "YES"
diff --git a/ghc.mk b/ghc.mk
index ddd1187..b6df093 100644 (file)
--- a/ghc.mk
+++ b/ghc.mk
@@ -922,8 +922,10 @@ endif
 distclean : clean
        "$(RM)" $(RM_OPTS) config.cache config.status config.log mk/config.h mk/stamp-h
        "$(RM)" $(RM_OPTS) mk/config.mk mk/are-validating.mk mk/project.mk
+       "$(RM)" $(RM_OPTS) mk/config.mk.old mk/project.mk.old
        "$(RM)" $(RM_OPTS) extra-gcc-opts docs/users_guide/ug-book.xml
-       "$(RM)" $(RM_OPTS) compiler/ghc.cabal ghc/ghc-bin.cabal
+       "$(RM)" $(RM_OPTS) compiler/ghc.cabal compiler/ghc.cabal.old
+       "$(RM)" $(RM_OPTS) ghc/ghc-bin.cabal
        "$(RM)" $(RM_OPTS) libraries/base/include/HsBaseConfig.h
        "$(RM)" $(RM_OPTS) libraries/directory/include/HsDirectoryConfig.h
        "$(RM)" $(RM_OPTS) libraries/process/include/HsProcessConfig.h