summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-07-07 08:50:40 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-07-07 08:50:40 +0000
commit0bde11509ca13d4d0914496ee652d7c2b43a0420 (patch)
tree590b887273ad06a885d657abb11bdb47a8fe5e59
parenta6ce3525d991c7df80aec6355b9d0aa941810a94 (diff)
downloadhaskell-0bde11509ca13d4d0914496ee652d7c2b43a0420.tar.gz
Avoid unnecessary recompilation after ./configure (helps #3228)
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.
-rw-r--r--Makefile29
-rw-r--r--ghc.mk4
2 files changed, 32 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 69c419c47d..0d563df8e1 100644
--- 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 ddd118796e..b6df093d33 100644
--- 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