{-# OPTIONS -W -fno-warn-incomplete-patterns #-}
-----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.11 2000/10/26 16:51:44 sewardj Exp $
+-- $Id: Main.hs,v 1.17 2000/11/03 10:42:39 simonmar Exp $
--
-- GHC Driver program
--
#include "HsVersions.h"
+import CompManager
import DriverPipeline
import DriverState
import DriverFlags
import DriverPhases ( Phase(..) )
import CmdLineOpts ( HscLang(..), DynFlags(..), v_Static_hsc_opts )
import TmpFiles
+import Finder ( initFinder )
+import CmStaticInfo
import Config
import Util
import Panic
import System
import Maybe
-import CompManager
-----------------------------------------------------------------------------
-- Changes:
-----------------------------------------------------------------------------
-- ToDo:
+-- -nohi doesn't work
-- new mkdependHS doesn't support all the options that the old one did (-X et al.)
-- time commands when run with -v
-- split marker
argv' <- setTopDir argv
top_dir <- readIORef v_TopDir
- let installed s = top_dir ++ s
+ let installed s = top_dir ++ '/':s
inplace s = top_dir ++ '/':cCURRENT_DIR ++ '/':s
installed_pkgconfig = installed ("package.conf")
-- read the package configuration
conf_file <- readIORef v_Path_package_config
contents <- readFile conf_file
- writeIORef v_Package_details (read contents)
+ let pkg_details = read contents -- ToDo: faster
+ writeIORef v_Package_details pkg_details
-- find the phase to stop after (i.e. -E, -C, -c, -S flags)
(flags2, mode, stop_flag) <- getGhcMode argv'
-- find the build tag, and re-process the build-specific options
more_opts <- findBuildTag
- _ <- processArgs static_flags more_opts []
-
+ way_non_static <- processArgs static_flags more_opts []
+
-- give the static flags to hsc
static_opts <- buildStaticHscOpts
writeIORef v_Static_hsc_opts static_opts
flags = [] }
-- the rest of the arguments are "dynamic"
- srcs <- processArgs dynamic_flags non_static []
+ srcs <- processArgs dynamic_flags (way_non_static ++
+ non_static ++ warn_opts) []
-- save the "initial DynFlags" away
- dyn_flags <- readIORef v_DynFlags
- writeIORef v_InitDynFlags dyn_flags
+ init_dyn_flags <- readIORef v_DynFlags
+ writeIORef v_InitDynFlags init_dyn_flags
-- complain about any unknown flags
- let unknown_flags = [ f | ('-':f) <- srcs ]
- mapM unknownFlagErr unknown_flags
+ mapM unknownFlagErr [ f | f@('-':_) <- srcs ]
-- get the -v flag
verb <- readIORef v_Verbose
when verb (hPutStrLn stderr ("Using package config file: " ++ conf_file))
+ -- initialise the finder
+ initFinder pkg_details
+
-- mkdependHS is special
when (mode == DoMkDependHS) beginMkDependHS
- -- make is special
- when (mode == DoMake) beginMake
+ -- make/interactive require invoking the compilation manager
+ 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
pipelines <- mapM (genPipeline mode stop_flag) srcs
if null srcs then throwDyn (UsageError "no input files") else do
- -- 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.
+ -- 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
let compileFile (src, phases) = do
- r <- runPipeline phases src (mode==DoLink) True
writeIORef v_Driver_state saved_driver_state
+ writeIORef v_DynFlags init_dyn_flags
+ r <- runPipeline phases src (mode==DoLink) True
return r
o_files <- mapM compileFile src_pipelines
some -> writeIORef v_TopDir (drop 2 (last some)))
return others
-beginMake = panic "`ghc --make' unimplemented"
+beginMake [] = throwDyn (UsageError "no input files")
+beginMake (_:_:_) = throwDyn (UsageError "only one module allowed with --make")
+{-
+beginMake [mod] = do
+ state <- cmInit ""{-ToDo:remove-} pkg_details
+ cmLoadModule state (mkModuleName mod)
+-}
------------------------------------------------------------------------------
--- compatibility code
-
-#if __GLASGOW_HASKELL__ <= 408
-catchJust = catchIO
-ioErrors = justIoErrors
-throwTo = raiseInThread
-#endif
-
-#ifdef mingw32_TARGET_OS
-foreign import "_getpid" getProcessID :: IO Int
-#endif
+beginInteractive srcs = panic "`ghc --interactive' unimplemented"