[project @ 2005-01-13 14:12:40 by simonmar]
[ghc-hetmet.git] / mk / target.mk
index 1f200e0..72420c9 100644 (file)
@@ -288,12 +288,14 @@ endif
 # whether HS_SRCS is empty or not.
 #
 
+# can't split objs in way 'u', so we disable it here
+ifeq "$(way)" "u"
+SplitObjs = NO
+endif
+
 ifneq "$(HS_SRCS)" ""
 ifeq "$(SplitObjs)" "YES"
 
-# can't split objs in way 'u', so we disable it here
-ifneq "$(way)" "u"
-
 SRC_HC_OPTS += -split-objs
 
 # We generate the archive into a temporary file libfoo.a.tmp, then
@@ -324,7 +326,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
@@ -342,7 +360,6 @@ extraclean ::
        $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
        -rmdir $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) > /dev/null 2>&1
 
-endif # $(way) == u
 endif # $(SplitObjs)
 endif # $(HS_SRCS)
 
@@ -353,7 +370,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
@@ -1194,3 +1211,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)
+