Add support for OSX ld's -filelist flag
authorIan Lynagh <ian@well-typed.com>
Mon, 18 Mar 2013 22:48:43 +0000 (22:48 +0000)
committerIan Lynagh <ian@well-typed.com>
Mon, 18 Mar 2013 23:42:53 +0000 (23:42 +0000)
Without it, when linking the split objects for Language.Haskell.TH.Syntax,
the commandline was too long when listing all the files directly.

aclocal.m4
compiler/main/DriverPipeline.hs
compiler/main/DynFlags.hs
compiler/main/SysTools.lhs
configure.ac
distrib/configure.ac.in
settings.in

index e225030..2cfa2f1 100644 (file)
@@ -1003,6 +1003,38 @@ AC_SUBST([LdHasNoCompactUnwind])
 ])# FP_PROG_LD_NO_COMPACT_UNWIND
 
 
+# FP_PROG_LD_FILELIST
+# -------------------
+
+# Sets the output variable LdHasFilelist to YES if ld supports
+# -filelist, or NO otherwise.
+AC_DEFUN([FP_PROG_LD_FILELIST],
+[
+AC_CACHE_CHECK([whether ld understands -filelist], [fp_cv_ld_has_filelist],
+[
+    echo 'int foo() { return 0; }' > conftest1.c
+    echo 'int bar() { return 0; }' > conftest2.c
+    ${CC-cc} -c conftest1.c
+    ${CC-cc} -c conftest2.c
+    echo conftest1.o  > conftest.o-files
+    echo conftest2.o >> conftest.o-files
+    if ${LdCmd} -r -filelist conftest.o-files -o conftest.o > /dev/null 2>&1
+    then
+        fp_cv_ld_has_filelist=yes
+    else
+        fp_cv_ld_has_filelist=no
+    fi
+    rm -rf conftest*
+])
+if test "$fp_cv_ld_has_filelist" = yes; then
+    LdHasFilelist=YES
+else
+    LdHasFilelist=NO
+fi
+AC_SUBST([LdHasFilelist])
+])# FP_PROG_LD_FILELIST
+
+
 # FP_PROG_AR
 # ----------
 # Sets fp_prog_ar to a (non-Cygwin) path to ar. Exits if no ar can be found
index fdae0fa..bdc2e8e 100644 (file)
@@ -2134,6 +2134,12 @@ joinObjectFiles dflags o_files output_fn = do
           script <- newTempName dflags "ldscript"
           writeFile script $ "INPUT(" ++ unwords o_files ++ ")"
           ld_r [SysTools.FileOption "" script]
+     else if sLdSupportsFilelist mySettings
+     then do
+          filelist <- newTempName dflags "filelist"
+          writeFile filelist $ unlines o_files
+          ld_r [SysTools.Option "-Wl,-filelist",
+                SysTools.FileOption "-Wl," filelist]
      else do
           ld_r (map (SysTools.FileOption "") o_files)
 
index dbec98a..17484e0 100644 (file)
@@ -758,6 +758,7 @@ data Settings = Settings {
   sSystemPackageConfig   :: FilePath,
   sLdSupportsCompactUnwind :: Bool,
   sLdSupportsBuildId       :: Bool,
+  sLdSupportsFilelist      :: Bool,
   sLdIsGnuLd               :: Bool,
   -- commands for particular phases
   sPgm_L                 :: String,
index 79af4f6..bacd53e 100644 (file)
@@ -243,6 +243,7 @@ initSysTools mbMinusB
                                ++ tntc_gcc_args)
        ldSupportsCompactUnwind <- getBooleanSetting "ld supports compact unwind"
        ldSupportsBuildId       <- getBooleanSetting "ld supports build-id"
+       ldSupportsFilelist      <- getBooleanSetting "ld supports filelist"
        ldIsGnuLd               <- getBooleanSetting "ld is GNU ld"
        perl_path <- getSetting "perl command"
 
@@ -315,6 +316,7 @@ initSysTools mbMinusB
                     sSystemPackageConfig = pkgconfig_path,
                     sLdSupportsCompactUnwind = ldSupportsCompactUnwind,
                     sLdSupportsBuildId       = ldSupportsBuildId,
+                    sLdSupportsFilelist      = ldSupportsFilelist,
                     sLdIsGnuLd               = ldIsGnuLd,
                     sPgm_L   = unlit_path,
                     sPgm_P   = (cpp_prog, cpp_args),
index 535a619..f2c85bc 100644 (file)
@@ -557,6 +557,7 @@ FP_PROG_LD_ReduceMemoryOverheads
 FP_PROG_LD_IS_GNU
 FP_PROG_LD_BUILD_ID
 FP_PROG_LD_NO_COMPACT_UNWIND
+FP_PROG_LD_FILELIST
 
 
 FPTOOLS_SET_C_LD_FLAGS([target],[CFLAGS],[LDFLAGS],[IGNORE_LINKER_LD_FLAGS],[CPPFLAGS])
index 09b5457..6b20f84 100644 (file)
@@ -77,6 +77,7 @@ FP_PROG_LD_ReduceMemoryOverheads
 FP_PROG_LD_IS_GNU
 FP_PROG_LD_BUILD_ID
 FP_PROG_LD_NO_COMPACT_UNWIND
+FP_PROG_LD_FILELIST
 
 #
 dnl ** Check gcc version and flags we need to pass it **
index c749f23..25699ac 100644 (file)
@@ -6,6 +6,7 @@
  ("ld flags", "@SettingsLdFlags@"),
  ("ld supports compact unwind", "@LdHasNoCompactUnwind@"),
  ("ld supports build-id", "@LdHasBuildId@"),
+ ("ld supports filelist", "@LdHasFilelist@"),
  ("ld is GNU ld", "@LdIsGNULd@"),
  ("ar command", "@SettingsArCommand@"),
  ("ar flags", "@ArArgs@"),