-{-# OPTIONS -fno-warn-incomplete-patterns #-}
+{-# OPTIONS -fno-warn-incomplete-patterns -optc-DNON_POSIX_SOURCE #-}
+
-----------------------------------------------------------------------------
--- $Id: Main.hs,v 1.86 2001/08/13 15:49:38 simonmar Exp $
+-- $Id: Main.hs,v 1.91 2001/11/03 01:30:42 sof Exp $
--
-- GHC Driver program
--
processArgs, static_flags)
import DriverMkDepend ( beginMkDependHS, endMkDependHS )
-import DriverPhases ( Phase(Hsc, HCc), haskellish_src_file, objish_file )
+import DriverPhases ( Phase(HsPp, Hsc, HCc), haskellish_src_file, objish_file )
import DriverUtil ( add, handle, handleDyn, later, splitFilename,
unknownFlagErr, getFileSuffix )
main =
-- top-level exception handler: any unrecognised exception is a compiler bug.
handle (\exception -> do
+ hFlush stdout
case exception of
-- an IO exception probably isn't our fault, so don't panic
IOException _ -> hPutStr stderr (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 :: GhcException))
- exitWith (ExitFailure 1)
+ handleDyn (\dyn -> do
+ hFlush stdout
+ case dyn of
+ PhaseFailed _phase code -> exitWith code
+ Interrupted -> exitWith (ExitFailure 1)
+ _ -> do hPutStrLn stderr (show (dyn :: GhcException))
+ exitWith (ExitFailure 1)
) $ do
-- make sure we clean up after ourselves
-- leave out hscOutName for now
hscOutName = panic "Main.main:hscOutName not set",
- verbosity = case mode of
- DoInteractive -> 1
- DoMake -> 1
- _other -> 0,
+ verbosity = 1
})
-- the rest of the arguments are "dynamic"
-- -ohi sanity checking
ohi <- readIORef v_Output_hi
if (isJust ohi &&
- (mode == DoMake || mode == DoInteractive || length srcs > 1))
+ (mode == DoMake || mode == DoInteractive || srcs `lengthExceeds` 1))
then throwDyn (UsageError "-ohi can only be used when compiling a single source file")
else do
-- -o sanity checking
o_file <- readIORef v_Output_file
- if (length srcs > 1 && isJust o_file && mode /= DoLink && mode /= DoMkDLL)
+ if (srcs `lengthExceeds` 1 && isJust o_file && mode /= DoLink && mode /= DoMkDLL)
then throwDyn (UsageError "can't apply -o to multiple source files")
else do
-- just preprocess (Haskell source only)
let src_and_suff = (src, getFileSuffix src)
- pp <- if not (haskellish_src_file src) || mode == StopBefore Hsc
+ let not_hs_file = not (haskellish_src_file src)
+ pp <- if not_hs_file || mode == StopBefore Hsc || mode == StopBefore HsPp
then return src_and_suff else do
phases <- genPipeline (StopBefore Hsc) stop_flag
- False{-not persistent-} defaultHscLang
- src_and_suff
+ False{-not persistent-} defaultHscLang
+ src_and_suff
pipeLoop phases src_and_suff False{-no linking-} False{-no -o flag-}
basename suffix