Document that lazy I/O now throws exceptions
[ghc-hetmet.git] / ghc.mk
diff --git a/ghc.mk b/ghc.mk
index 9ba50fe..1ae3077 100644 (file)
--- a/ghc.mk
+++ b/ghc.mk
@@ -39,8 +39,6 @@
 #
 #   * per-source-file dependencies instead of one .depend file?
 #   * eliminate undefined variables, and use --warn-undefined-variables?
-#   * perhaps we should make all the output dirs in the .depend rule, to
-#     avoid all these mkdirhier calls?
 #   * put outputs from different ways in different subdirs of distdir/build,
 #     then we don't have to use -osuf/-hisuf.  We would have to install
 #     them in different places too, so we'd need ghc-pkg support for packages
 
 .PHONY: default all haddock
 
+# We need second expansion for the way we handle directories, so that
+#     | $$$$(dir $$$$@)/.
+# expands to the directoy of a rule that uses a % pattern.
+.SECONDEXPANSION:
+
 default : all
 
 # Catch make if it runs away into an infinite loop
@@ -398,6 +401,15 @@ rts/package.conf.inplace : libffi/package.conf.inplace
 endif
 
 # -----------------------------------------------------------------------------
+# Directories
+
+# Don't try to delete directories:
+.PRECIOUS: %/.
+
+%/. : $(MKDIRHIER)
+       "$(MKDIRHIER)" $@
+
+# -----------------------------------------------------------------------------
 # Special magic for the ghc-prim package
 
 # We want the ghc-prim package to include the GHC.Prim module when it
@@ -417,8 +429,7 @@ endef
 
 PRIMOPS_TXT = $(GHC_COMPILER_DIR)/prelude/primops.txt
 
-libraries/ghc-prim/dist-install/build/GHC/PrimopWrappers.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT)
-       "$(MKDIRHIER)" $(dir $@)
+libraries/ghc-prim/dist-install/build/GHC/PrimopWrappers.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT) | $$(dir $$@)/.
        "$(GENPRIMOP_INPLACE)" --make-haskell-wrappers <$(PRIMOPS_TXT) >$@
 
 libraries/ghc-prim/GHC/Prim.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT)
@@ -702,13 +713,13 @@ libraries/ghc-prim/dist-install/doc/html/ghc-prim/ghc-prim.haddock: \
     libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs
 
 libraries/ghc-prim/dist-install/build/autogen/GHC/Prim.hs: \
-                            $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE) $(MKDIRHIER)
-       "$(MKDIRHIER)" $(dir $@)
+                            $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE) \
+                          | $$(dir $$@)/.
        "$(GENPRIMOP_INPLACE)" --make-haskell-source < $< > $@
 
 libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs: \
-                            $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE) $(MKDIRHIER)
-       "$(MKDIRHIER)" $(dir $@)
+                            $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE) \
+                          | $$(dir $$@)/.
        "$(GENPRIMOP_INPLACE)" --make-haskell-wrappers < $< > $@
 
 # -----------------------------------------------------------------------------
@@ -804,7 +815,7 @@ INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(bindir)/ghc-pkg.exe
 endif
 
 INSTALLED_PACKAGES = $(filter-out haskeline mtl terminfo,$(PACKAGES))
-HIDDEN_PACKAGES = ghc-binary
+HIDDEN_PACKAGES = binary
 
 install_packages: install_libexecs
 install_packages: libffi/package.conf.install rts/package.conf.install
@@ -854,6 +865,7 @@ $(eval $(call bindist,.,\
        $(BINDIST_EXTRAS) \
        $(includes_H_CONFIG) \
        $(includes_H_PLATFORM) \
+    $(includes_H_FILES) \
        includes/ghcconfig.h \
        includes/rts/Config.h \
     $(INSTALL_HEADERS) \
@@ -882,8 +894,8 @@ endif
 BIN_DIST_MK = $(BIN_DIST_PREP_DIR)/bindist.mk
 
 unix-binary-dist-prep:
-       "$(RM)" $(RM_OPTS) -r bindistprep/*
-       mkdir $(BIN_DIST_PREP_DIR)
+       "$(RM)" $(RM_OPTS) -r bindistprep/
+       "$(MKDIRHIER)" $(BIN_DIST_PREP_DIR)
        set -e; for i in LICENSE compiler ghc rts libraries utils docs libffi includes driver mk rules Makefile aclocal.m4 config.sub config.guess install-sh extra-gcc-opts.in ghc.mk inplace; do ln -s ../../$$i $(BIN_DIST_PREP_DIR)/; done
        echo "HADDOCK_DOCS       = $(HADDOCK_DOCS)"       >> $(BIN_DIST_MK)
        echo "LATEX_DOCS         = $(LATEX_DOCS)"         >> $(BIN_DIST_MK)
@@ -898,12 +910,16 @@ unix-binary-dist-prep:
        cd bindistprep && "$(TAR)" hcf - -T ../$(BIN_DIST_LIST) | bzip2 -c > ../$(BIN_DIST_PREP_TAR_BZ2)
 
 windows-binary-dist-prep:
-       "$(RM)" $(RM_OPTS) -r bindistprep/*
+       "$(RM)" $(RM_OPTS) -r bindistprep/
        $(MAKE) prefix=$(TOP)/$(BIN_DIST_PREP_DIR) install
        cd bindistprep && "$(TAR)" cf - $(BIN_DIST_NAME) | bzip2 -c > ../$(BIN_DIST_PREP_TAR_BZ2)
 
 windows-installer:
-       "$(ISCC)" /O. /F$(WINDOWS_INSTALLER_BASE) - < distrib/ghc.iss
+ifeq "$(ISCC)" ""
+       @echo No ISCC, so not making installer
+else
+       "$(ISCC)" /O. /Fbindistprep/$(WINDOWS_INSTALLER_BASE) - < distrib/ghc.iss
+endif
 
 nTimes = set -e; for i in `seq 1 $(1)`; do echo Try "$$i: $(2)"; if $(2); then break; fi; done
 
@@ -961,17 +977,13 @@ VERSION :
 sdist : VERSION
 
 # Use:
-#     $(call sdist_file,compiler,stage2,cmm,CmmLex,x)
-# to copy the generated file that replaces compiler/cmm/CmmLex.x, where
+#     $(call sdist_file,compiler,stage2,cmm,Foo/Bar,CmmLex,x)
+# to copy the generated file that replaces compiler/cmm/Foo/Bar/CmmLex.x, where
 # "stage2" is the dist dir.
-sdist_file = \
-  if test -f $(TOP)/$1/$2/build/$4.hs; then \
-    "$(CP)" $(TOP)/$1/$2/build/$4.hs $1/$3/ ; \
-    mv $1/$3/$4.$5 $1/$3/$4.$5.source ;\
-  else \
-    echo "does not exist: $1/$2/build/$4.hs"; \
-    exit 1; \
-  fi
+define sdist_file
+       "$(CP)" $1/$2/build/$4/$5.hs $(SRC_DIST_DIR)/$1/$3/$4
+       mv $(SRC_DIST_DIR)/$1/$3/$4/$5.$6 $(SRC_DIST_DIR)/$1/$3/$4/$5.$6.source
+endef
 
 .PHONY: sdist-prep
 sdist-prep :
@@ -983,15 +995,16 @@ sdist-prep :
        cd $(SRC_DIST_DIR) && $(MAKE) distclean
        rm -rf $(SRC_DIST_DIR)/libraries/tarballs/
        rm -rf $(SRC_DIST_DIR)/libraries/stamp/
-       cd $(SRC_DIST_DIR) && if test -f $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs; then "$(CP)" $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs libraries/haskell-src/Language/Haskell/ ; mv libraries/haskell-src/Language/Haskell/Parser.ly libraries/haskell-src/Language/Haskell/Parser.ly.source ; fi
-       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,cmm,CmmLex,x)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,cmm,CmmParse,y)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,parser,Lexer,x)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,parser,Parser,y.pp)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,parser,ParserCore,y)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,utils/hpc,dist,,HpcParser,y)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,utils/genprimopcode,dist,,Lexer,x)
-       cd $(SRC_DIST_DIR) && $(call sdist_file,utils/genprimopcode,dist,,Parser,y)
+       $(call sdist_file,compiler,stage2,cmm,,CmmLex,x)
+       $(call sdist_file,compiler,stage2,cmm,,CmmParse,y)
+       $(call sdist_file,compiler,stage2,parser,,Lexer,x)
+       $(call sdist_file,compiler,stage2,parser,,Parser,y.pp)
+       $(call sdist_file,compiler,stage2,parser,,ParserCore,y)
+       $(call sdist_file,utils/hpc,dist,,,HpcParser,y)
+       $(call sdist_file,utils/genprimopcode,dist,,,Lexer,x)
+       $(call sdist_file,utils/genprimopcode,dist,,,Parser,y)
+       $(call sdist_file,utils/haddock,dist,src,Haddock/Interface,Lex,x)
+       $(call sdist_file,utils/haddock,dist,src,Haddock/Interface,Parse,y)
        cd $(SRC_DIST_DIR) && "$(RM)" $(RM_OPTS) -r compiler/stage[123] mk/build.mk
        cd $(SRC_DIST_DIR) && "$(FIND)" $(SRC_DIST_DIRS) \( -name _darcs -o -name SRC -o -name "autom4te*" -o -name "*~" -o -name ".cvsignore" -o -name "\#*" -o -name ".\#*" -o -name "log" -o -name "*-SAVE" -o -name "*.orig" -o -name "*.rej" -o -name "*-darcs-backup*" \) -print | xargs "$(RM)" $(RM_OPTS) -r
 
@@ -1059,6 +1072,11 @@ $(foreach lib,$(PACKAGES) $(PACKAGES_STAGE2),\
   $(eval $(call clean-target,libraries/$(lib),dist-install,libraries/$(lib)/dist-install)))
 endif
 
+clean : clean_bindistprep
+.PHONY: clean_bindistprep
+clean_bindistprep:
+       "$(RM)" $(RM_OPTS) -r bindistprep/
+
 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