summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2011-12-02 16:55:28 +0000
committerIan Lynagh <igloo@earth.li>2011-12-02 16:55:28 +0000
commit2694bb74158bac7276cded2435bba8e889659f98 (patch)
tree67496c4d879a3589bda9329d7b63e7dcd2a979be
parentb2d3c5576050a69c26a546ba10726618a72d4b67 (diff)
downloadhaskell-2694bb74158bac7276cded2435bba8e889659f98.tar.gz
Use touchy rather than touch when building on Windows
With Windows 7 in a vitrual box VM on OS X, some very odd things happen with dates and time stamps when SSHing into cygwin. e.g. here the "Change" time is in the past: $ date; touch foo; stat foo Fri Dec 2 16:58:07 GMTST 2011 File: `foo' Size: 0 Blocks: 0 IO Block: 65536 regular empty file Device: 540aba0bh/1409989131d Inode: 562949953592977 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ ian) Gid: ( 513/ None) Access: 2011-12-02 16:58:07.414457900 +0000 Modify: 2011-12-02 16:58:07.414457900 +0000 Change: 2011-12-02 16:58:03.495141800 +0000 Birth: 2011-12-02 16:57:57.731469900 +0000 And if we copy such a file, then the copy is older (as determined by the "Modify" time) than the original: $ date; touch foo; stat foo; cp foo bar; stat bar Fri Dec 2 16:59:10 GMTST 2011 File: `foo' Size: 0 Blocks: 0 IO Block: 65536 regular empty file Device: 540aba0bh/1409989131d Inode: 1407374883725128 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ ian) Gid: ( 513/ None) Access: 2011-12-02 16:59:10.118457900 +0000 Modify: 2011-12-02 16:59:10.118457900 +0000 Change: 2011-12-02 16:59:06.189477700 +0000 Birth: 2011-12-02 16:57:57.731469900 +0000 File: `bar' Size: 0 Blocks: 0 IO Block: 65536 regular empty file Device: 540aba0bh/1409989131d Inode: 281474976882512 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ ian) Gid: ( 513/ None) Access: 2011-12-02 16:59:06.394555800 +0000 Modify: 2011-12-02 16:59:06.394555800 +0000 Change: 2011-12-02 16:59:06.395532400 +0000 Birth: 2011-12-02 16:58:40.921899600 +0000 This means that make thinks that things are out of date when it shouldn't, so reinvokes itself repeatedly until the MAKE_RESTARTS infinite-recursion test triggers. The touchy program, like most other programs, creates files with both Modify and Change in the past, which is still a little odd, but is consistent, so doesn't break make.
-rw-r--r--ghc.mk9
-rw-r--r--libffi/ghc.mk12
-rw-r--r--mk/config.mk.in8
-rw-r--r--rts/ghc.mk4
-rw-r--r--rules/build-dependencies.mk8
-rw-r--r--rules/build-prog.mk4
-rw-r--r--utils/ghc-cabal/ghc.mk4
-rw-r--r--utils/touchy/ghc.mk9
8 files changed, 34 insertions, 24 deletions
diff --git a/ghc.mk b/ghc.mk
index b62151d8fc..a5afe14d2c 100644
--- a/ghc.mk
+++ b/ghc.mk
@@ -553,6 +553,11 @@ BUILD_DIRS += \
$(GHC_MKDIRHIER_DIR)
endif
+ifeq "$(Windows)" "YES"
+BUILD_DIRS += \
+ $(GHC_TOUCHY_DIR)
+endif
+
BUILD_DIRS += \
docs/users_guide \
docs/ext-core \
@@ -609,10 +614,6 @@ BUILD_DIRS += \
utils/hpc \
utils/runghc \
ghc
-ifeq "$(Windows)" "YES"
-BUILD_DIRS += \
- $(GHC_TOUCHY_DIR)
-endif
ifneq "$(BINDIST)" "YES"
BUILD_DIRS += \
diff --git a/libffi/ghc.mk b/libffi/ghc.mk
index 8162c81874..85a2822ab2 100644
--- a/libffi/ghc.mk
+++ b/libffi/ghc.mk
@@ -39,7 +39,7 @@ LIBFFI_PATH_MANGLE = PATH=$$(cygpath "$(TOP)")/libffi:$$PATH; export PATH;
endif
ifneq "$(BINDIST)" "YES"
-$(libffi_STAMP_CONFIGURE):
+$(libffi_STAMP_CONFIGURE): $(TOUCH_DEP)
$(call removeFiles,$(libffi_STAMP_STATIC_CONFIGURE))
$(call removeFiles,$(libffi_STAMP_STATIC_BUILD))
$(call removeFiles,$(libffi_STAMP_STATIC_INSTALL))
@@ -88,15 +88,15 @@ $(libffi_STAMP_CONFIGURE):
mv libffi/build/Makefile libffi/build/Makefile.orig
sed "s#wc -w#wc -w | sed 's/ //g'#" < libffi/build/Makefile.orig > libffi/build/Makefile
- touch $@
+ "$(TOUCH_CMD)" $@
-$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE)
+$(libffi_STAMP_BUILD): $(libffi_STAMP_CONFIGURE) $(TOUCH_DEP)
$(MAKE) -C libffi/build MAKEFLAGS=
- touch $@
+ "$(TOUCH_CMD)" $@
-$(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD)
+$(libffi_STAMP_INSTALL): $(libffi_STAMP_BUILD) $(TOUCH_DEP)
$(MAKE) -C libffi/build MAKEFLAGS= install
- touch $@
+ "$(TOUCH_CMD)" $@
$(libffi_STATIC_LIB): $(libffi_STAMP_INSTALL)
@test -f $@ || { echo "$< exists, but $@ does not."; echo "Suggest removing $<."; exit 1; }
diff --git a/mk/config.mk.in b/mk/config.mk.in
index f45404abdf..04ee71c789 100644
--- a/mk/config.mk.in
+++ b/mk/config.mk.in
@@ -740,6 +740,14 @@ TAR_CMD = @TarCmd@
BZIP2_CMD = bzip2
GZIP_CMD = gzip
+ifeq "$(Windows)" "YES"
+TOUCH_CMD = $(utils/touchy_dist_INPLACE)
+TOUCH_DEP = $(TOUCH_CMD)
+else
+TOUCH_CMD = touch
+TOUCH_DEP =
+endif
+
HSCOLOUR_CMD = @HSCOLOUR@
TIME_CMD = @TimeCmd@
diff --git a/rts/ghc.mk b/rts/ghc.mk
index 40ff02fcc4..a18bec9e89 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -107,9 +107,9 @@ endif
ifneq "$(BINDIST)" "YES"
rts_ffi_objs_stamp = rts/dist/ffi/stamp
rts_ffi_objs = rts/dist/ffi/*.o
-$(rts_ffi_objs_stamp): $(libffi_STATIC_LIB) | $$(dir $$@)/.
+$(rts_ffi_objs_stamp): $(libffi_STATIC_LIB) $(TOUCH_DEP) | $$(dir $$@)/.
cd rts/dist/ffi && $(AR) x ../../../$(libffi_STATIC_LIB)
- touch $@
+ "$(TOUCH_CMD)" $@
# This is a little hacky. We don't know the SO version, so we only
# depend on libffi.so, but copy libffi.so*
diff --git a/rules/build-dependencies.mk b/rules/build-dependencies.mk
index c9c62cdcdc..6ab2edcde0 100644
--- a/rules/build-dependencies.mk
+++ b/rules/build-dependencies.mk
@@ -31,9 +31,9 @@ ifneq "$$(NO_GENERATED_MAKEFILE_RULES)" "YES"
# indirectly) include the generated includes files.
$$($1_$2_depfile_haskell) : $$(includes_H_CONFIG) $$(includes_H_PLATFORM)
-$$($1_$2_depfile_haskell) : $$($1_$2_HS_SRCS) $$($1_$2_HS_BOOT_SRCS) $$($1_$2_HC_MK_DEPEND_DEP) | $$$$(dir $$$$@)/.
+$$($1_$2_depfile_haskell) : $$($1_$2_HS_SRCS) $$($1_$2_HS_BOOT_SRCS) $$($1_$2_HC_MK_DEPEND_DEP) $$(TOUCH_DEP) | $$$$(dir $$$$@)/.
$$(call removeFiles,$$@.tmp)
- touch $$@.tmp
+ "$$(TOUCH_CMD)" $$@.tmp
ifneq "$$($1_$2_HS_SRCS)" ""
"$$($1_$2_HC_MK_DEPEND)" -M $$($1_$2_MKDEPENDHS_FLAGS) \
$$(filter-out -split-objs, $$($1_$2_v_ALL_HC_OPTS)) \
@@ -54,9 +54,9 @@ endif
# includes files.
$$($1_$2_depfile_c_asm) : $$(includes_H_CONFIG) $$(includes_H_PLATFORM)
-$$($1_$2_depfile_c_asm) : $$($1_$2_C_FILES_DEPS) $$($1_$2_S_FILES) | $$$$(dir $$$$@)/.
+$$($1_$2_depfile_c_asm) : $$($1_$2_C_FILES_DEPS) $$($1_$2_S_FILES) $$(TOUCH_DEP) | $$$$(dir $$$$@)/.
$$(call removeFiles,$$@.tmp)
- touch $$@.tmp
+ "$$(TOUCH_CMD)" $$@.tmp
ifneq "$$(strip $$($1_$2_C_FILES_DEPS)$$($1_$2_S_FILES))" ""
# We ought to actually do this for each way in $$($1_$2_WAYS), but then
# it takes a long time to make the C deps for the RTS (30 seconds rather
diff --git a/rules/build-prog.mk b/rules/build-prog.mk
index 1f43169ce3..aa66516a11 100644
--- a/rules/build-prog.mk
+++ b/rules/build-prog.mk
@@ -94,9 +94,9 @@ $(call all-target,$1_$2,$1/$2/build/tmp/$$($1_$2_PROG))
# INPLACE_BIN might be empty if we're distcleaning
ifeq "$(findstring clean,$(MAKECMDGOALS))" ""
ifneq "$$($1_$2_INSTALL_INPLACE)" "NO"
-$$($1_$2_INPLACE) : $1/$2/build/tmp/$$($1_$2_PROG) | $$$$(dir $$$$@)/.
+$$($1_$2_INPLACE) : $1/$2/build/tmp/$$($1_$2_PROG) $$(TOUCH_DEP) | $$$$(dir $$$$@)/.
"$$(CP)" -p $$< $$@
- touch $$@
+ "$$(TOUCH_CMD)" $$@
endif
endif
diff --git a/utils/ghc-cabal/ghc.mk b/utils/ghc-cabal/ghc.mk
index 9af611c8b9..20d05704d2 100644
--- a/utils/ghc-cabal/ghc.mk
+++ b/utils/ghc-cabal/ghc.mk
@@ -25,7 +25,7 @@ $(GHC_CABAL_DIR)/dist/build/tmp/ghc-cabal$(exeext): $(wildcard libraries/Cabal/C
$(GHC_CABAL_DIR)/dist/build/tmp/ghc-cabal$(exeext): $(wildcard libraries/Cabal/Cabal/Distribution/*/*.hs)
$(GHC_CABAL_DIR)/dist/build/tmp/ghc-cabal$(exeext): $(wildcard libraries/Cabal/Cabal/Distribution/*.hs)
-$(GHC_CABAL_DIR)/dist/build/tmp/ghc-cabal$(exeext): $(GHC_CABAL_DIR)/Main.hs | $$(dir $$@)/. bootstrapping/.
+$(GHC_CABAL_DIR)/dist/build/tmp/ghc-cabal$(exeext): $(GHC_CABAL_DIR)/Main.hs $(TOUCH_DEP) | $$(dir $$@)/. bootstrapping/.
"$(GHC)" $(SRC_HC_OPTS) --make $(GHC_CABAL_DIR)/Main.hs -o $@ \
-no-user-package-conf \
-Wall $(WERROR) \
@@ -36,7 +36,7 @@ $(GHC_CABAL_DIR)/dist/build/tmp/ghc-cabal$(exeext): $(GHC_CABAL_DIR)/Main.hs | $
-ilibraries/filepath \
-ilibraries/hpc \
$(utils/ghc-cabal_dist_EXTRA_HC_OPTS)
- touch $@
+ "$(TOUCH_CMD)" $@
# touch is required, because otherwise if mkdirhier is newer, we
# repeatedly rebuild ghc-cabal.
diff --git a/utils/touchy/ghc.mk b/utils/touchy/ghc.mk
index fc9c845c8d..458f80e5ed 100644
--- a/utils/touchy/ghc.mk
+++ b/utils/touchy/ghc.mk
@@ -10,8 +10,9 @@
#
# -----------------------------------------------------------------------------
-utils/touchy_dist_C_SRCS = touchy.c
-utils/touchy_dist_PROG = $(GHC_TOUCHY_PGM)
-utils/touchy_dist_TOPDIR = YES
-utils/touchy_dist_INSTALL = YES
+utils/touchy_dist_C_SRCS = touchy.c
+utils/touchy_dist_PROG = $(GHC_TOUCHY_PGM)
+utils/touchy_dist_TOPDIR = YES
+utils/touchy_dist_INSTALL = YES
+utils/touchy_dist_INSTALL_INPLACE = YES
$(eval $(call build-prog,utils/touchy,dist,0))