Patch for shared libraries support on FreeBSD
[ghc-hetmet.git] / compiler / main / DriverPipeline.hs
index 042fa04..5ac10ec 100644 (file)
@@ -1374,7 +1374,7 @@ linkBinary dflags o_files dep_packages = do
 
     pkg_lib_paths <- getPackageLibraryPath dflags dep_packages
     let pkg_lib_path_opts = concat (map get_pkg_lib_path_opts pkg_lib_paths)
-#ifdef linux_TARGET_OS
+#ifdef elf_OBJ_FORMAT
         get_pkg_lib_path_opts l | (dynLibLoader dflags)==SystemDependent && not opt_Static = ["-L" ++ l, "-Wl,-rpath", "-Wl," ++ l]
                                 | otherwise = ["-L" ++ l]
 #else
@@ -1428,7 +1428,7 @@ linkBinary dflags o_files dep_packages = do
 
     let
        thread_opts | WayThreaded `elem` ways = [ 
-#if !defined(mingw32_TARGET_OS) && !defined(freebsd_TARGET_OS)
+#if !defined(mingw32_TARGET_OS) && !defined(freebsd_TARGET_OS) && !defined(haiku_TARGET_OS)
                        "-lpthread"
 #endif
 #if defined(osf3_TARGET_OS)
@@ -1447,6 +1447,12 @@ linkBinary dflags o_files dep_packages = do
                       ]
                      ++ map SysTools.Option (
                         md_c_flags
+
+#ifdef mingw32_TARGET_OS
+                      -- Permit the linker to auto link _symbol to _imp_symbol.
+                     -- This lets us link against DLLs without needing an "import library".
+                     ++ ["-Wl,--enable-auto-import"]
+#endif
                      ++ o_files
                      ++ extra_ld_inputs
                      ++ lib_path_opts
@@ -1567,7 +1573,7 @@ linkDynLib dflags o_files dep_packages = do
 #endif
     let pkg_lib_paths = collectLibraryPaths pkgs_no_rts
     let pkg_lib_path_opts = concatMap get_pkg_lib_path_opts pkg_lib_paths
-#ifdef linux_TARGET_OS
+#ifdef elf_OBJ_FORMAT
         get_pkg_lib_path_opts l | (dynLibLoader dflags)==SystemDependent && not opt_Static = ["-L" ++ l, "-Wl,-rpath", "-Wl," ++ l]
                                 | otherwise = ["-L" ++ l]
 #else
@@ -1602,6 +1608,11 @@ linkDynLib dflags o_files dep_packages = do
         ++ map (SysTools.FileOption "") o_files
         ++ map SysTools.Option (
            md_c_flags
+           
+         -- Permit the linker to auto link _symbol to _imp_symbol
+        -- This lets us link against DLLs without needing an "import library"
+        ++ ["-Wl,--enable-auto-import"]
+
         ++ extra_ld_inputs
         ++ lib_path_opts
         ++ extra_ld_opts
@@ -1632,16 +1643,22 @@ linkDynLib dflags o_files dep_packages = do
     --  later, so that it will not complain about the use of the option
     --  -undefined dynamic_lookup above.
     -- -install_name
-    --   Causes the dynamic linker to ignore the DYLD_LIBRARY_PATH when loading
-    --   this lib and instead look for it at its absolute path.
-    --   When installing the .dylibs (see target.mk), we'll change that path to
-    --   point to the place they are installed. Therefore, we won't have to set
-    --  up DYLD_LIBRARY_PATH specifically for ghc.
+    --   Mac OS/X stores the path where a dynamic library is (to be) installed
+    --   in the library itself.  It's called the "install name" of the library.
+    --   Then any library or executable that links against it before it's
+    --   installed will search for it in its ultimate install location.  By
+    --   default we set the install name to the absolute path at build time, but
+    --   it can be overridden by the -dylib-install-name option passed to ghc.
+    --   Cabal does this.
     -----------------------------------------------------------------------------
 
     let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; }
 
-    pwd <- getCurrentDirectory
+    instName <- case dylibInstallName dflags of
+        Just n -> return n
+        Nothing -> do
+            pwd <- getCurrentDirectory
+            return $ pwd `combine` output_fn
     SysTools.runLink dflags
         ([ SysTools.Option verb
          , SysTools.Option "-dynamiclib"
@@ -1651,7 +1668,8 @@ linkDynLib dflags o_files dep_packages = do
         ++ map SysTools.Option (
            md_c_flags
         ++ o_files
-        ++ [ "-undefined", "dynamic_lookup", "-single_module", "-Wl,-macosx_version_min","-Wl,10.5", "-install_name " ++ (pwd </> output_fn) ]
+        ++ [ "-undefined", "dynamic_lookup", "-single_module", "-Wl,-macosx_version_min","-Wl,10.5",
+              "-Wl,-read_only_relocs,suppress", "-install_name", instName ]
         ++ extra_ld_inputs
         ++ lib_path_opts
         ++ extra_ld_opts