-{-# OPTIONS -W -fno-warn-incomplete-patterns #-}
+{-# OPTIONS -fno-warn-incomplete-patterns #-}
-----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.29 2000/11/21 14:35:52 simonmar Exp $
+-- $Id: Main.hs,v 1.40 2000/12/18 15:18:11 simonmar Exp $
--
-- GHC Driver program
--
#include "HsVersions.h"
-import CompManager
-import Interpreter
+
#ifdef GHCI
+import Interpreter
import InteractiveUI
#endif
+
+#ifndef mingw32_TARGET_OS
+import Dynamic
+import Posix
+#endif
+
+import CompManager
import DriverPipeline
import DriverState
import DriverFlags
import Panic
import DriverPhases ( Phase(..) )
import CmdLineOpts ( HscLang(..), DynFlags(..), v_Static_hsc_opts )
-import Module ( mkModuleName )
import TmpFiles
import Finder ( initFinder )
import CmStaticInfo
import Config
import Util
+
+
import Concurrent
-#ifndef mingw32_TARGET_OS
-import Posix
-#endif
import Directory
import IOExts
import Exception
-import Dynamic
import IO
import Monad
-- No more "Enter your Haskell program, end with ^D (on a line of its own):"
-- consistency checking removed (may do this properly later)
-- removed -noC
--- no hi diffs (could be added later)
-- no -Ofile
-----------------------------------------------------------------------------
-- Main loop
main =
+ -- top-level exception handler: any unrecognised exception is a compiler bug.
+ handle (\exception -> hPutStr stderr (show (Panic (show exception)))) $ do
+
-- all error messages are propagated as exceptions
handleDyn (\dyn -> case dyn of
PhaseFailed _phase code -> exitWith code
Interrupted -> exitWith (ExitFailure 1)
- _ -> do hPutStrLn stderr (show (dyn :: BarfKind))
+ _ -> do hPutStrLn stderr (show (dyn :: GhcException))
exitWith (ExitFailure 1)
) $ do
(hPutStrLn stderr ("Using package config file: " ++ conf_file))
-- initialise the finder
- initFinder pkg_details
+ pkg_avails <- getPackageInfo
+ initFinder pkg_avails
-- mkdependHS is special
when (mode == DoMkDependHS) beginMkDependHS
-- make/interactive require invoking the compilation manager
- if (mode == DoMake) then beginMake pkg_details srcs else do
- if (mode == DoInteractive) then beginInteractive pkg_details srcs else do
+ if (mode == DoMake) then beginMake srcs else do
+ if (mode == DoInteractive) then beginInteractive srcs else do
-- for each source file, find which phases to run
let lang = hscLang init_dyn_flags
some -> writeIORef v_TopDir (drop 2 (last some)))
return others
-beginMake :: PackageConfigInfo -> [String] -> IO ()
-beginMake pkg_details mods
+beginMake :: [String] -> IO ()
+beginMake mods
= do case mods of
[] -> throwDyn (UsageError "no input files")
- [mod] -> do state <- cmInit pkg_details Batch
+ [mod] -> do state <- cmInit Batch
cmLoadModule state mod
return ()
_ -> throwDyn (UsageError "only one module allowed with --make")
+
+beginInteractive :: [String] -> IO ()
#ifndef GHCI
beginInteractive = throwDyn (OtherError "not build for interactive use")
#else
-beginInteractive pkg_details mods
- = do state <- cmInit pkg_details Interactive
- case mods of
- [] -> return ()
- [mod] -> do cmLoadModule state mod; return ()
- _ -> throwDyn (UsageError
- "only one module allowed with --interactive")
- interactiveUI state
+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
#endif