FIX part of #1372, improvements to the recompilation checker
[ghc-hetmet.git] / compiler / main / DriverPipeline.hs
index c447fef..e9fb307 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,7 +1295,15 @@ linkDynLib dflags o_files dep_packages = do
        -- probably _stub.o files
     extra_ld_inputs <- readIORef v_Ld_inputs
 
-       -- opts from -optdll-<blah>
+    let (md_c_flags, _) = machdepCCOpts dflags
+#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 
 
     let pstate = pkgState dflags
@@ -1303,8 +1314,6 @@ linkDynLib dflags o_files dep_packages = do
                    then []
                    else [ head (libraryDirs rts_pkg) ++ "/Main.dll_o",
                           head (libraryDirs base_pkg) ++ "/PrelMain.dll_o" ]
-
-    let (md_c_flags, _) = machdepCCOpts dflags
     SysTools.runMkDLL dflags
         ([ SysTools.Option verb
          , SysTools.Option "-o"
@@ -1324,7 +1333,30 @@ linkDynLib dflags o_files dep_packages = do
               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
+        ([ SysTools.Option verb
+         , SysTools.Option "-o"
+         , SysTools.FileOption "" output_fn
+         ]
+        ++ map SysTools.Option (
+           md_c_flags
+        ++ o_files
+        ++ [ "-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
+       ))
+#endif
 -- -----------------------------------------------------------------------------
 -- Running CPP
 
@@ -1405,8 +1437,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