[project @ 2005-01-11 11:32:44 by simonmar]
[ghc-hetmet.git] / mk / target.mk
index 0497cec..51b5d98 100644 (file)
@@ -324,7 +324,23 @@ HC_SPLIT_PRE = \
     $(RM) $@; if [ ! -d $(basename $@)_split ]; then mkdir $(basename $@)_split; else \
     $(FIND) $(basename $@)_split -name '*.$(way_)o' -print | xargs $(RM) __rm_food; fi
 ifeq "$(GhcWithInterpreter)" "YES"
-HC_SPLIT_POST = (cd $(basename $@)_split && $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o)
+ifeq "$(LdIsGNULd)" "YES"
+# If ld is GNU ld, we can use a linker script to pass the names of the
+# input files.  This avoids problems with limits on the length of the
+# ld command line, which we run into for large Haskell modules.
+HC_SPLIT_POST = \
+  ( cd $(basename $@)_split; \
+    $(RM) ld.script; \
+    touch ld.script; \
+    echo "INPUT(" *.$(way_)o ")" >>ld.script; \
+    $(LD) -r $(LD_X) -o ../$(notdir $@) ld.script; \
+  )
+else
+HC_SPLIT_POST = \
+  ( cd $(basename $@)_split; \
+    $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o; \
+  )
+endif # LdIsGNULd == YES
 else
 HC_SPLIT_POST = touch $@
 endif # GhcWithInterpreter == YES
@@ -353,7 +369,7 @@ endif # $(HS_SRCS)
 ifeq "$(StripLibraries)" "YES"
 ifeq "$(SplitObjs)" "YES"
 SRC_HC_POST_OPTS += \
-  for i in $(basename $@)_split/*; do \
+  for i in $(basename $@)_split/*.$(way_)o; do \
        $(LD) -r $(LD_X) -o $$i.tmp $$i; \
        $(MV) $$i.tmp $$i; \
   done
@@ -823,8 +839,9 @@ install-docs:: $(foreach i,$(XMLDocWays),$(INSTALL_XML_DOC)$(patsubst %.html-no-
        @for i in $(XMLDocWays); do \
                if [ $$i = "html" ]; then \
                        $(INSTALL_DIR) $(datadir)/html; \
-                       echo "( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html )" ; \
-                       ( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html ) ; \
+                       $(INSTALL_DIR) $(datadir)/html/$(INSTALL_XML_DOC); \
+                       echo "( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) )" ; \
+                       ( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) ) ; \
                else \
                        echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.htmlhelp/.chm/ | sed s/\.html-no-chunks/.html/` $(datadir); \
                        $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.htmlhelp/.chm/ | sed s/\.html-no-chunks/.html/` $(datadir); \
@@ -1193,3 +1210,17 @@ ifneq "$(SUBDIRS)" ""
 $(SUBDIRS) ::
          $(MAKE) -C $@ $(MFLAGS)
 endif
+
+# -----------------------------------------------------------------------------
+# Further cleaning
+
+# Sometimes we want to clean things only after the recursve cleaning
+# has heppened (eg. if the files we're about to remove would affect
+# the recursive traversal).
+
+distclean::
+       rm -f $(LATE_DIST_CLEAN_FILES)
+
+maintainer-clean::
+       rm -f $(LATE_DIST_CLEAN_FILES)
+