X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FMain.hs;h=730c43edc77a500d1a4420281db2212c434cfac4;hb=c8b37bf43c61c2fc42ec6ba4ad57f631a59fc2d4;hp=ad8d1f44c76fa60400f58342fd650e9623133b08;hpb=982c1f494de8a691294a95aee108e765c3f592a0;p=ghc-hetmet.git diff --git a/compiler/main/Main.hs b/compiler/main/Main.hs index ad8d1f4..730c43e 100644 --- a/compiler/main/Main.hs +++ b/compiler/main/Main.hs @@ -54,6 +54,7 @@ import System.IO import System.Directory ( doesDirectoryExist ) import System.Environment import System.Exit +import System.FilePath import Control.Monad import Data.List import Data.Maybe @@ -147,7 +148,7 @@ main = -- To simplify the handling of filepaths, we normalise all filepaths right -- away - e.g., for win32 platforms, backslashes are converted -- into forward slashes. - normal_fileish_paths = map normalisePath fileish_args + normal_fileish_paths = map normalise fileish_args (srcs, objs) = partition_args normal_fileish_paths [] [] -- Note: have v_Ld_inputs maintain the order in which 'objs' occurred on @@ -171,7 +172,6 @@ main = ShowUsage -> showGhcUsage dflags cli_mode PrintLibdir -> putStrLn (topDir dflags) ShowSupportedLanguages -> alreadyHandled - ShowDocDir -> showDocDir (topDir dflags) ShowVersion -> alreadyHandled ShowNumVersion -> alreadyHandled ShowInterface f -> doShowIface dflags f @@ -179,7 +179,7 @@ main = DoMkDependHS -> doMkDependHS session (map fst srcs) StopBefore p -> oneShot dflags p srcs DoInteractive -> interactiveUI session srcs Nothing - DoEval expr -> interactiveUI session srcs (Just expr) + DoEval exprs -> interactiveUI session srcs $ Just $ reverse exprs dumpFinalStats dflags exitWith ExitSuccess @@ -306,7 +306,6 @@ verifyOutputFiles dflags = do data CmdLineMode = ShowUsage -- ghc -? | PrintLibdir -- ghc --print-libdir - | ShowDocDir -- ghc --print-docdir | ShowInfo -- ghc --info | ShowSupportedLanguages -- ghc --supported-languages | ShowVersion -- ghc -V/--version @@ -317,7 +316,7 @@ data CmdLineMode -- StopBefore StopLn is the default | DoMake -- ghc --make | DoInteractive -- ghc --interactive - | DoEval String -- ghc -e + | DoEval [String] -- ghc -e foo -e bar => DoEval ["bar", "foo"] deriving (Show) isInteractiveMode, isInterpretiveMode :: CmdLineMode -> Bool @@ -369,7 +368,6 @@ mode_flags = ( "?" , PassFlag (setMode ShowUsage)) , ( "-help" , PassFlag (setMode ShowUsage)) , ( "-print-libdir" , PassFlag (setMode PrintLibdir)) - , ( "-print-docdir" , PassFlag (setMode ShowDocDir)) , ( "V" , PassFlag (setMode ShowVersion)) , ( "-version" , PassFlag (setMode ShowVersion)) , ( "-numeric-version" , PassFlag (setMode ShowNumVersion)) @@ -378,31 +376,38 @@ mode_flags = ------- interfaces ---------------------------------------------------- , ( "-show-iface" , HasArg (\f -> setMode (ShowInterface f) - "--show-iface")) + "--show-iface")) ------- primary modes ------------------------------------------------ - , ( "M" , PassFlag (setMode DoMkDependHS)) - , ( "E" , PassFlag (setMode (StopBefore anyHsc))) - , ( "C" , PassFlag (\f -> do setMode (StopBefore HCc) f - addFlag "-fvia-C")) - , ( "S" , PassFlag (setMode (StopBefore As))) - , ( "-make" , PassFlag (setMode DoMake)) - , ( "-interactive" , PassFlag (setMode DoInteractive)) - , ( "e" , HasArg (\s -> setMode (DoEval s) "-e")) - - -- -fno-code says to stop after Hsc but don't generate any code. - , ( "fno-code" , PassFlag (\f -> do setMode (StopBefore HCc) f - addFlag "-fno-code" - addFlag "-no-recomp")) + , ( "M" , PassFlag (setMode DoMkDependHS)) + , ( "E" , PassFlag (setMode (StopBefore anyHsc))) + , ( "C" , PassFlag (\f -> do setMode (StopBefore HCc) f + addFlag "-fvia-C")) + , ( "S" , PassFlag (setMode (StopBefore As))) + , ( "-make" , PassFlag (setMode DoMake)) + , ( "-interactive" , PassFlag (setMode DoInteractive)) + , ( "e" , HasArg (\s -> updateMode (updateDoEval s) "-e")) + + -- -fno-code says to stop after Hsc but don't generate any code. + , ( "fno-code" , PassFlag (\f -> do setMode (StopBefore HCc) f + addFlag "-fno-code" + addFlag "-no-recomp")) ] setMode :: CmdLineMode -> String -> ModeM () -setMode m flag = do +setMode m flag = updateMode (\_ -> m) flag + +updateDoEval :: String -> CmdLineMode -> CmdLineMode +updateDoEval expr (DoEval exprs) = DoEval (expr : exprs) +updateDoEval expr _ = DoEval [expr] + +updateMode :: (CmdLineMode -> CmdLineMode) -> String -> ModeM () +updateMode f flag = do (old_mode, old_flag, flags) <- getCmdLineState - when (notNull old_flag && flag /= old_flag) $ - throwDyn (UsageError - ("cannot use `" ++ old_flag ++ "' with `" ++ flag ++ "'")) - putCmdLineState (m, flag, flags) + if notNull old_flag && flag /= old_flag + then throwDyn (UsageError + ("cannot use `" ++ old_flag ++ "' with `" ++ flag ++ "'")) + else putCmdLineState (f old_mode, flag, flags) addFlag :: String -> ModeM () addFlag s = do @@ -475,12 +480,6 @@ showSupportedLanguages :: IO () showSupportedLanguages = do mapM_ putStrLn supportedLanguages exitWith ExitSuccess -showDocDir :: FilePath -> IO () -showDocDir topdir = putStrLn docDir - where docDir = if cRelocatableBuild - then topdir ++ "/doc" - else cDocDir - showVersion :: IO () showVersion = do putStrLn (cProjectName ++ ", version " ++ cProjectVersion)