X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FMain.hs;h=f7c5be72beb722ee6b91d20edfc1cc8cf9c7908b;hb=d5934bbb856aa0aa620c9b2e0fa51c90a1a5a048;hp=ec5a116894830d0149712c225b5e5ef6cf394bcf;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/main/Main.hs b/compiler/main/Main.hs index ec5a116..f7c5be7 100644 --- a/compiler/main/Main.hs +++ b/compiler/main/Main.hs @@ -18,36 +18,37 @@ 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 ) -import SysTools ( getTopDir, getUsageMsgPaths ) #ifdef GHCI import InteractiveUI ( ghciWelcomeMsg, interactiveUI ) #endif -- 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 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: @@ -64,11 +65,18 @@ import Maybe main = GHC.defaultErrorHandler defaultDynFlags $ do + -- 1. extract the -B flag from the args argv0 <- getArgs - argv1 <- parseStaticFlags =<< GHC.initFromArgs argv0 + + let + (minusB_args, argv1) = partition (prefixMatch "-B") argv0 + mbMinusB | null minusB_args = Nothing + | otherwise = Just (drop 2 (last minusB_args)) + + argv2 <- parseStaticFlags argv1 -- 2. Parse the "mode" flags (--make, --interactive etc.) - (cli_mode, argv2) <- parseModeFlags argv1 + (cli_mode, argv3) <- parseModeFlags argv2 let mode = case cli_mode of DoInteractive -> Interactive @@ -78,7 +86,7 @@ main = _ -> OneShot -- start our GHC session - session <- GHC.newSession mode + session <- GHC.newSession mode mbMinusB dflags0 <- GHC.getSessionDynFlags session @@ -102,20 +110,17 @@ main = -- The rest of the arguments are "dynamic" -- Leftover ones are presumably files - (dflags2, fileish_args) <- GHC.parseDynamicFlags dflags1 argv2 + (dflags, fileish_args) <- GHC.parseDynamicFlags dflags1 argv3 -- make sure we clean up after ourselves - GHC.defaultCleanupHandler dflags2 $ do + GHC.defaultCleanupHandler dflags $ do -- Display banner - showBanner cli_mode dflags2 - - -- Read the package config(s), and process the package-related - -- command-line flags - dflags <- initPackages dflags2 + showBanner cli_mode dflags -- we've finished manipulating the DynFlags, update the session GHC.setSessionDynFlags session dflags + dflags <- GHC.getSessionDynFlags session let -- To simplify the handling of filepaths, we normalise all filepaths right @@ -140,11 +145,11 @@ main = ---------------- Do the business ----------- case cli_mode of - ShowUsage -> showGhcUsage cli_mode - PrintLibdir -> do d <- getTopDir; putStrLn d + ShowUsage -> showGhcUsage dflags cli_mode + PrintLibdir -> putStrLn (topDir dflags) ShowVersion -> showVersion ShowNumVersion -> putStrLn cProjectVersion - ShowInterface f -> showIface f + ShowInterface f -> doShowIface dflags f DoMake -> doMake session srcs DoMkDependHS -> doMkDependHS session (map fst srcs) StopBefore p -> oneShot dflags p srcs @@ -392,6 +397,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. @@ -421,11 +435,10 @@ showVersion = do putStrLn (cProjectName ++ ", version " ++ cProjectVersion) exitWith ExitSuccess -showGhcUsage cli_mode = do - (ghc_usage_path,ghci_usage_path) <- getUsageMsgPaths +showGhcUsage dflags cli_mode = do let usage_path - | DoInteractive <- cli_mode = ghci_usage_path - | otherwise = ghc_usage_path + | DoInteractive <- cli_mode = ghcUsagePath dflags + | otherwise = ghciUsagePath dflags usage <- readFile usage_path dump usage exitWith ExitSuccess