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:
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
_ -> OneShot
-- start our GHC session
- session <- GHC.newSession mode
+ session <- GHC.newSession mode mbMinusB
dflags0 <- GHC.getSessionDynFlags session
-- 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
---------------- 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
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.
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