Link Windows DLLs and OSX dylibs correctly in linkDynLib
authorClemens Fruhwirth <clemens@endorphin.org>
Tue, 7 Aug 2007 14:40:18 +0000 (14:40 +0000)
committerClemens Fruhwirth <clemens@endorphin.org>
Tue, 7 Aug 2007 14:40:18 +0000 (14:40 +0000)
compiler/main/DriverPipeline.hs

index e9fb307..e414f4c 100644 (file)
@@ -1296,49 +1296,85 @@ linkDynLib dflags o_files dep_packages = do
     extra_ld_inputs <- readIORef v_Ld_inputs
 
     let (md_c_flags, _) = machdepCCOpts dflags
+    let extra_ld_opts = getOpts dflags opt_l
 #if defined(mingw32_HOST_OS)
     -----------------------------------------------------------------------------
     -- Making a DLL
     -----------------------------------------------------------------------------
-
     let output_fn = case o_file of { Just s -> s; Nothing -> "HSdll.dll"; }
 
-    -- opts from -optdll-<blah>
-    let extra_ld_opts = getOpts dflags opt_dll 
+    SysTools.runLink dflags
+        ([ SysTools.Option verb
+         , SysTools.Option "-o"
+         , SysTools.FileOption "" output_fn
+         , SysTools.Option "-shared"
+         , SysTools.Option "-Wl,--export-all-symbols"
+         , SysTools.FileOption "-Wl,--out-implib=" (output_fn ++ ".a")
+         ]
+        ++ map (SysTools.FileOption "") o_files
+        ++ map SysTools.Option (
+           md_c_flags
+        ++ extra_ld_inputs
+        ++ lib_path_opts
+        ++ extra_ld_opts
+        ++ pkg_lib_path_opts
+        ++ pkg_link_opts
+       ))
+#elif defined(darwin_TARGET_OS)
+    -----------------------------------------------------------------------------
+    -- Making a darwin dylib
+    -----------------------------------------------------------------------------
+    -- About the options used for Darwin:
+    -- -dynamiclib
+    --   Apple's way of saying -shared
+    -- -undefined dynamic_lookup:
+    --   Without these options, we'd have to specify the correct dependencies
+    --   for each of the dylibs. Note that we could (and should) do without this
+    --  for all libraries except the RTS; all we need to do is to pass the
+    --  correct HSfoo_dyn.dylib files to the link command.
+    --  This feature requires Mac OS X 10.3 or later; there is a similar feature,
+    --  -flat_namespace -undefined suppress, which works on earlier versions,
+    --  but it has other disadvantages.
+    -- -single_module
+    --  Build the dynamic library as a single "module", i.e. no dynamic binding
+    --  nonsense when referring to symbols from within the library. The NCG
+    --  assumes that this option is specified (on i386, at least).
+    -- -Wl,-macosx_version_min -Wl,10.3
+    --  Tell the linker its safe to assume that the library will run on 10.3 or
+    --  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.
+    -----------------------------------------------------------------------------
 
-    let pstate = pkgState dflags
-       rts_pkg  = getPackageDetails pstate rtsPackageId
-        base_pkg = getPackageDetails pstate basePackageId
+    let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; }
 
-    let extra_os = if static || no_hs_main
-                   then []
-                   else [ head (libraryDirs rts_pkg) ++ "/Main.dll_o",
-                          head (libraryDirs base_pkg) ++ "/PrelMain.dll_o" ]
-    SysTools.runMkDLL dflags
+    pwd <- getCurrentDirectory
+    SysTools.runLink dflags
         ([ SysTools.Option verb
+         , SysTools.Option "-dynamiclib"
          , SysTools.Option "-o"
          , SysTools.FileOption "" output_fn
          ]
         ++ map SysTools.Option (
            md_c_flags
         ++ o_files
-        ++ extra_os
-        ++ [ "--target=i386-mingw32" ]
+        ++ [ "-undefined", "dynamic_lookup", "-single_module", "-Wl,-macosx_version_min","-Wl,10.3", "-install_name " ++ (pwd `joinFileName` output_fn) ]
         ++ extra_ld_inputs
         ++ lib_path_opts
         ++ extra_ld_opts
         ++ pkg_lib_path_opts
         ++ pkg_link_opts
-         ++ (if "--def" `elem` (concatMap words extra_ld_opts)
-              then [ "" ]
-               else [ "--export-all" ])
        ))
 #else
     -----------------------------------------------------------------------------
     -- Making a DSO
     -----------------------------------------------------------------------------
-    -- opts from -optl-<blah>
-    let extra_ld_opts = getOpts dflags opt_l 
+
     let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; }
 
     SysTools.runLink dflags