diff --git a/ghc.mk b/ghc.mk
index b62151d8fcc513de8e26a698c1d7aabb4fb5eb1d..a5afe14d2c310ab0160a63f6537a53a7de1d37c7 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 8162c818746c5eefa930f1abdeadee8700240ef1..85a2822ab23ad468709c542224001ce013d30638 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 f45404abdfdd9d63d65da830f281a1a5148835da..04ee71c78915e811d592fa74a7d1b7a731bfefa5 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 40ff02fcc48093b5c1a14580b3a112d56dbe9f18..a18bec9e89c0a1d3c20d66d739207bbce6f33acb 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 c9c62cdcdcad700759efd28dafe233010dece8ee..6ab2edcde0cd4510973d43ab44f7211a14c61094 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 1f43169ce3f03cd8d8f5cd92774694fd17b93c3c..aa66516a110faa42e1f4107d558eb742570f92e4 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 9af611c8b90f5eaed4d95aeb8ff44d0067f943a7..20d05704d26eb388977311ba0abba740aa46f0f1 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 fc9c845c8dec68765239a45e63669ea0e32b7291..458f80e5eda002a9e442b0371220b32ee5f072b9 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))