Remove unused -optdll option.
[ghc-hetmet.git] / compiler / main / DriverPipeline.hs
index c447fef..e414f4c 100644 (file)
@@ -35,7 +35,7 @@ import Module
 import UniqFM          ( eltsUFM )
 import ErrUtils
 import DynFlags
-import StaticFlags     ( v_Ld_inputs, opt_Static, WayName(..) )
+import StaticFlags     ( v_Ld_inputs, opt_Static, opt_HardwireLibPaths, WayName(..) )
 import Config
 import Panic
 import Util
@@ -156,7 +156,9 @@ compile hsc_env mod_summary maybe_old_linkable old_iface mod_index nmods = do
              return (CompOK details iface maybe_old_linkable)
        handleBatch (HscRecomp hasStub, iface, details)
            | isHsBoot src_flavour
-               = return (CompOK details iface Nothing)
+               = do SysTools.touch dflags' "Touching object file"
+                                   object_filename
+                    return (CompOK details iface Nothing)
            | otherwise
                = do stub_unlinked <- getStubLinkable hasStub
                     (hs_unlinked, unlinked_time) <-
@@ -638,15 +640,15 @@ runPhase (Hsc src_flavour) stop dflags0 basename suff input_fn get_output_fn _ma
            dflags = dflags0 { includePaths = current_dir : paths }
        
   -- gather the imports and module name
-        (hspp_buf,mod_name) <- 
+        (hspp_buf,mod_name,imps,src_imps) <- 
             case src_flavour of
                ExtCoreFile -> do {  -- no explicit imports in ExtCore input.
                                  ; m <- getCoreModuleName input_fn
-                                 ; return (Nothing, mkModuleName m) }
+                                 ; return (Nothing, mkModuleName m, [], []) }
 
                other -> do { buf <- hGetStringBuffer input_fn
-                           ; (_,_,L _ mod_name) <- getImports dflags buf input_fn
-                           ; return (Just buf, mod_name) }
+                           ; (src_imps,imps,L _ mod_name) <- getImports dflags buf input_fn
+                           ; return (Just buf, mod_name, imps, src_imps) }
 
   -- Build a ModLocation to pass to hscMain.
   -- The source filename is rather irrelevant by now, but it's used
@@ -733,8 +735,8 @@ runPhase (Hsc src_flavour) stop dflags0 basename suff input_fn get_output_fn _ma
                                        ms_location  = location4,
                                        ms_hs_date   = src_timestamp,
                                        ms_obj_date  = Nothing,
-                                       ms_imps      = unused_field,
-                                       ms_srcimps   = unused_field }
+                                       ms_imps      = imps,
+                                       ms_srcimps   = src_imps }
 
   -- run the compiler!
        mbResult <- hscCompileOneShot hsc_env
@@ -1171,7 +1173,9 @@ linkBinary dflags o_files dep_packages = do
     -- dependencies, and eliminating duplicates.
 
     pkg_lib_paths <- getPackageLibraryPath dflags dep_packages
-    let pkg_lib_path_opts = map ("-L"++) pkg_lib_paths
+    let pkg_lib_path_opts = concat (map get_pkg_lib_path_opts pkg_lib_paths)
+       get_pkg_lib_path_opts l | opt_HardwireLibPaths && not opt_Static = ["-L" ++ l, "-Wl,-rpath", "-Wl," ++ l]
+                               | otherwise = ["-L" ++ l]
 
     let lib_paths = libraryPaths dflags
     let lib_path_opts = map ("-L"++) lib_paths
@@ -1279,7 +1283,6 @@ linkDynLib dflags o_files dep_packages = do
     let static = opt_Static
     let no_hs_main = dopt Opt_NoHsMain dflags
     let o_file = outputFile dflags
-    let output_fn = case o_file of { Just s -> s; Nothing -> "HSdll.dll"; }
 
     pkg_lib_paths <- getPackageLibraryPath dflags dep_packages
     let pkg_lib_path_opts = map ("-L"++) pkg_lib_paths
@@ -1292,20 +1295,89 @@ linkDynLib dflags o_files dep_packages = do
        -- probably _stub.o files
     extra_ld_inputs <- readIORef v_Ld_inputs
 
-       -- opts from -optdll-<blah>
-    let extra_ld_opts = getOpts dflags opt_dll 
+    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"; }
 
-    let pstate = pkgState dflags
-       rts_pkg  = getPackageDetails pstate rtsPackageId
-        base_pkg = getPackageDetails pstate basePackageId
+    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 output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; }
+
+    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
+        ++ [ "-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
+       ))
+#else
+    -----------------------------------------------------------------------------
+    -- Making a DSO
+    -----------------------------------------------------------------------------
 
-    let extra_os = if static || no_hs_main
-                   then []
-                   else [ head (libraryDirs rts_pkg) ++ "/Main.dll_o",
-                          head (libraryDirs base_pkg) ++ "/PrelMain.dll_o" ]
+    let output_fn = case o_file of { Just s -> s; Nothing -> "a.out"; }
 
-    let (md_c_flags, _) = machdepCCOpts dflags
-    SysTools.runMkDLL dflags
+    SysTools.runLink dflags
         ([ SysTools.Option verb
          , SysTools.Option "-o"
          , SysTools.FileOption "" output_fn
@@ -1313,18 +1385,14 @@ linkDynLib dflags o_files dep_packages = do
         ++ map SysTools.Option (
            md_c_flags
         ++ o_files
-        ++ extra_os
-        ++ [ "--target=i386-mingw32" ]
+        ++ [ "-shared", "-Wl,-Bsymbolic" ] -- we need symbolic linking to resolve non-PIC intra-package-relocations
         ++ 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" ])
        ))
-
+#endif
 -- -----------------------------------------------------------------------------
 -- Running CPP
 
@@ -1405,8 +1473,6 @@ hscNextPhase dflags other hsc_lang =
 
 
 hscMaybeAdjustTarget :: DynFlags -> Phase -> HscSource -> HscTarget -> HscTarget
-hscMaybeAdjustTarget dflags stop HsBootFile current_hsc_lang 
-  = HscNothing         -- No output (other than Foo.hi-boot) for hs-boot files
 hscMaybeAdjustTarget dflags stop other current_hsc_lang 
   = hsc_lang 
   where