[project @ 2001-02-13 15:51:57 by sewardj]
[ghc-hetmet.git] / ghc / compiler / main / Main.hs
index e2a863b..9790e1d 100644 (file)
@@ -1,6 +1,6 @@
 {-# OPTIONS -fno-warn-incomplete-patterns #-}
 -----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.47 2001/01/16 12:41:03 simonmar Exp $
+-- $Id: Main.hs,v 1.51 2001/02/13 15:51:57 sewardj Exp $
 --
 -- GHC Driver program
 --
@@ -17,7 +17,6 @@ module Main (main) where
 
 
 #ifdef GHCI
-import Interpreter
 import InteractiveUI
 #endif
 
@@ -34,7 +33,7 @@ import DriverMkDepend
 import DriverUtil
 import Panic
 import DriverPhases    ( Phase(..), haskellish_file )
-import CmdLineOpts     ( HscLang(..), DynFlags(..), v_Static_hsc_opts )
+import CmdLineOpts
 import TmpFiles
 import Finder          ( initFinder )
 import CmStaticInfo
@@ -42,7 +41,6 @@ import Config
 import Util
 
 
-
 import Concurrent
 import Directory
 import IOExts
@@ -51,6 +49,7 @@ import Exception
 import IO
 import Monad
 import List
+import Char            ( toLower )
 import System
 import Maybe
 
@@ -105,7 +104,7 @@ main =
    later (do  forget_it <- readIORef v_Keep_tmp_files
              unless forget_it $ do
              verb <- dynFlag verbosity
-             cleanTempFiles (verb >= 2)
+             cleanTempFiles verb
      ) $ do
        -- exceptions will be blocked while we clean the temporary files,
        -- so there shouldn't be any difficulty if we receive further
@@ -206,18 +205,17 @@ main =
                               | otherwise       -> defaultHscLang
 
    writeIORef v_DynFlags 
-       DynFlags{ coreToDo = core_todo,
-                 stgToDo  = stg_todo,
-                  hscLang  = lang,
-                 -- leave out hscOutName for now
-                  hscOutName = panic "Main.main:hscOutName not set",
-
-                 verbosity = case mode of
-                               DoInteractive -> 1
-                               DoMake        -> 1
-                               _other        -> 0,
-
-                 flags = [] }
+       defaultDynFlags{ coreToDo = core_todo,
+                        stgToDo  = stg_todo,
+                        hscLang  = lang,
+                        -- leave out hscOutName for now
+                        hscOutName = panic "Main.main:hscOutName not set",
+
+                        verbosity = case mode of
+                                       DoInteractive -> 1
+                                       DoMake        -> 1
+                                       _other        -> 0,
+                       }
 
        -- the rest of the arguments are "dynamic"
    srcs <- processArgs dynamic_flags (way_non_static ++ 
@@ -229,12 +227,6 @@ main =
        -- complain about any unknown flags
    mapM unknownFlagErr [ f | f@('-':_) <- srcs ]
 
-       -- save the flag state, because this could be modified by OPTIONS 
-       -- pragmas during the compilation, and we'll need to restore it
-       -- before starting the next compilation.
-   saved_driver_state <- readIORef v_Driver_state
-   writeIORef v_InitDriverState saved_driver_state
-
    verb <- dynFlag verbosity
 
    when (verb >= 2) 
@@ -270,7 +262,6 @@ main =
    if null srcs then throwDyn (UsageError "no input files") else do
 
    let compileFile src = do
-         writeIORef v_Driver_state saved_driver_state
          writeIORef v_DynFlags init_dyn_flags
 
          -- We compile in two stages, because the file may have an
@@ -321,14 +312,22 @@ beginMake mods
 
 beginInteractive :: [String] -> IO ()
 #ifndef GHCI
-beginInteractive = throwDyn (OtherError "not build for interactive use")
+beginInteractive = throwDyn (OtherError "not built for interactive use")
 #else
-beginInteractive mods
-  = do state <- cmInit Interactive
-       let mod = case mods of
-               []    -> Nothing
-               [mod] -> Just mod
-               _     -> throwDyn (UsageError 
-                                   "only one module allowed with --interactive")
-       interactiveUI state mod
+beginInteractive fileish_args
+  = let is_libraryish nm
+           = let nmr = map toLower (reverse nm)
+                 in take 2 nmr == "o." ||
+                    take 3 nmr == "os." ||
+                    take 4 nmr == "lld."
+        libs = filter is_libraryish fileish_args
+        mods = filter (not.is_libraryish) fileish_args
+        mod = case mods of
+                []    -> Nothing
+                [mod] -> Just mod
+                _     -> throwDyn (UsageError 
+                                    "only one module allowed with --interactive")
+    in
+    do state <- cmInit Interactive
+       interactiveUI state mod libs
 #endif