[project @ 2005-01-27 11:55:37 by simonmar]
[ghc-hetmet.git] / mk / target.mk
index 6dead33..4ef96a4 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
@@ -710,6 +727,9 @@ install:: $(INSTALL_PROGS)
        @for i in $(INSTALL_PROGS); do \
                    echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \
                    $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ;  \
+                    if `test $(darwin_TARGET_OS) == 1` ; \
+                    then sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(bindir)/$$i ; \
+                    fi ; \
        done
 endif
 
@@ -753,6 +773,9 @@ install:: $(INSTALL_LIBS)
                    $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
                  *.so) \
                    $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
+                 *.dylib) \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir); \
+                   install_name_tool -id $(libdir)/`basename $$i` $(libdir)/`basename $$i` ;; \
                  *) \
                    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
                esac; \