X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FMain.hs;h=758451f6f31e2c1a82eb1aaa3c65df5026ef8ffa;hb=80ce44f764633347ea15b570e3f758b6e7aecd63;hp=971eb3500c303e296f48b2d6d8b9eb9882a175af;hpb=ee565d464248078a4f2d46f98667aa4fcdc56db4;p=ghc-hetmet.git diff --git a/compiler/main/Main.hs b/compiler/main/Main.hs index 971eb35..758451f 100644 --- a/compiler/main/Main.hs +++ b/compiler/main/Main.hs @@ -18,7 +18,8 @@ import GHC ( Session, DynFlags(..), GhcMode(..), HscTarget(..), import CmdLineParser -- Implementations of the various modes (--show-iface, mkdependHS. etc.) -import MkIface ( showIface ) +import LoadIface ( showIface ) +import HscMain ( newHscEnv ) import DriverPipeline ( oneShot, compileFile ) import DriverMkDepend ( doMkDependHS ) #ifdef GHCI @@ -27,26 +28,27 @@ import InteractiveUI ( ghciWelcomeMsg, interactiveUI ) -- Various other random stuff that we need import Config ( cProjectVersion, cBooterVersion, cProjectName ) -import Packages ( dumpPackages, initPackages ) +import Packages ( dumpPackages ) import DriverPhases ( Phase(..), isSourceFilename, anyHsc, startPhase, isHaskellSrcFilename ) -import StaticFlags ( staticFlags, v_Ld_inputs, parseStaticFlags ) +import StaticFlags import DynFlags ( defaultDynFlags ) import BasicTypes ( failed ) -import ErrUtils ( Message, debugTraceMsg, putMsg ) +import ErrUtils ( putMsg ) import FastString ( getFastStringTable, isZEncoded, hasZEncoding ) import Outputable import Util import Panic -- Standard Haskell libraries -import EXCEPTION ( throwDyn ) -import IO -import Directory ( doesDirectoryExist ) -import System ( getArgs, exitWith, ExitCode(..) ) -import Monad -import List -import Maybe +import Control.Exception ( throwDyn ) +import System.IO +import System.Directory ( doesDirectoryExist ) +import System.Environment +import System.Exit +import Control.Monad +import Data.List +import Data.Maybe ----------------------------------------------------------------------------- -- ToDo: @@ -76,6 +78,18 @@ main = -- 2. Parse the "mode" flags (--make, --interactive etc.) (cli_mode, argv3) <- parseModeFlags argv2 + -- If all we want to do is to show the version number then do it + -- now, before we start a GHC session etc. + -- If we do it later then bootstrapping gets confused as it tries + -- to find out what version of GHC it's using before package.conf + -- exists, so starting the session fails. + case cli_mode of + ShowVersion -> do showVersion + exitWith ExitSuccess + ShowNumVersion -> do putStrLn cProjectVersion + exitWith ExitSuccess + _ -> return () + let mode = case cli_mode of DoInteractive -> Interactive DoEval _ -> Interactive @@ -143,16 +157,16 @@ main = ---------------- Do the business ----------- case cli_mode of - ShowUsage -> showGhcUsage dflags cli_mode - PrintLibdir -> putStrLn (topDir dflags) - ShowVersion -> showVersion - ShowNumVersion -> putStrLn cProjectVersion - ShowInterface f -> showIface f - DoMake -> doMake session srcs - DoMkDependHS -> doMkDependHS session (map fst srcs) - StopBefore p -> oneShot dflags p srcs - DoInteractive -> interactiveUI session srcs Nothing - DoEval expr -> interactiveUI session srcs (Just expr) + ShowUsage -> showGhcUsage dflags cli_mode + PrintLibdir -> putStrLn (topDir dflags) + ShowVersion -> panic "ShowVersion should already have been handled" + ShowNumVersion -> panic "ShowNumVersion should already have been handled" + ShowInterface f -> doShowIface dflags f + DoMake -> doMake session srcs + DoMkDependHS -> doMkDependHS session (map fst srcs) + StopBefore p -> oneShot dflags p srcs + DoInteractive -> interactiveUI session srcs Nothing + DoEval expr -> interactiveUI session srcs (Just expr) dumpFinalStats dflags exitWith ExitSuccess @@ -211,9 +225,10 @@ checkOptions cli_mode dflags srcs objs = do when (notNull unknown_opts) (unknownFlagsErr unknown_opts) -- -prof and --interactive are not a good combination - when (notNull (wayNames dflags) && isInterpretiveMode cli_mode) $ + when (notNull (filter (/= WayThreaded) (wayNames dflags)) + && isInterpretiveMode cli_mode) $ do throwDyn (UsageError - "--interactive can't be used with -prof, -ticky, -unreg or -smp.") + "--interactive can't be used with -prof, -ticky, or -unreg.") -- -ohi sanity check if (isJust (outputHi dflags) && (isCompManagerMode cli_mode || srcs `lengthExceeds` 1)) @@ -395,6 +410,15 @@ doMake sess srcs = do when (failed ok_flag) (exitWith (ExitFailure 1)) return () + +-- --------------------------------------------------------------------------- +-- --show-iface mode + +doShowIface :: DynFlags -> FilePath -> IO () +doShowIface dflags file = do + hsc_env <- newHscEnv dflags + showIface hsc_env file + -- --------------------------------------------------------------------------- -- Various banners and verbosity output.