{-# OPTIONS -W -fno-warn-incomplete-patterns #-}
-----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.13 2000/10/27 13:50:25 sewardj Exp $
+-- $Id: Main.hs,v 1.20 2000/11/13 12:43:20 sewardj Exp $
--
-- GHC Driver program
--
#include "HsVersions.h"
+import CompManager
import DriverPipeline
import DriverState
import DriverFlags
import DriverUtil
import DriverPhases ( Phase(..) )
import CmdLineOpts ( HscLang(..), DynFlags(..), v_Static_hsc_opts )
+import Module ( mkModuleName )
import TmpFiles
import Finder ( initFinder )
-import CmStaticInfo ( mkPCI )
+import CmStaticInfo
import Config
import Util
import Panic
-----------------------------------------------------------------------------
-- 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
-- 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 (do hPutStr stderr "Glasgow Haskell Compiler, Version "
- hPutStr stderr version_str
+ hPutStr stderr cProjectVersion
hPutStr stderr ", for Haskell 98, compiled by GHC version "
- hPutStrLn stderr booter_version)
+ hPutStrLn stderr cBooterVersion)
when verb (hPutStrLn stderr ("Using package config file: " ++ conf_file))
-- initialise the finder
- pkg_details <- readIORef v_Package_details
- pci <- mkPCI pkg_details
- initFinder pci
+ 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 pkg_details 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
+ pipelines <- mapM (genPipeline mode stop_flag True) srcs
let src_pipelines = zip srcs pipelines
+ -- sanity checking
o_file <- readIORef v_Output_file
- if isJust o_file && mode /= DoLink && length srcs > 1
- then throwDyn (UsageError "can't apply -o option to multiple source files")
+ ohi <- readIORef v_Output_hi
+ if length srcs > 1 && (isJust ohi || (isJust o_file && mode /= DoLink))
+ then throwDyn (UsageError "can't apply -o or -ohi options to multiple source files")
else do
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 :: PackageConfigInfo -> [String] -> IO ()
+beginMake pkg_details mods
+ | null mods
+ = throwDyn (UsageError "no input files")
+ | not (null (tail mods))
+ = throwDyn (UsageError "only one module allowed with --make")
+ | otherwise
+ = do state <- cmInit pkg_details
+ cmLoadModule state (mkModuleName (head mods))
+ return ()
+
+beginInteractive srcs = panic "`ghc --interactive' unimplemented"