import DriverPipeline ( oneShot, compileFile )
import DriverMkDepend ( doMkDependHS )
#ifdef GHCI
-import InteractiveUI ( interactiveUI )
+import InteractiveUI ( interactiveUI, ghciWelcomeMsg )
#endif
-- Various other random stuff that we need
import DriverPhases ( Phase(..), isSourceFilename, anyHsc,
startPhase, isHaskellSrcFilename )
import StaticFlags
-import DynFlags ( defaultDynFlags )
+import DynFlags
import BasicTypes ( failed )
import ErrUtils ( putMsg )
import FastString ( getFastStringTable, isZEncoded, hasZEncoding )
argv0 <- getArgs
let
- (minusB_args, argv1) = partition (prefixMatch "-B") argv0
+ (minusB_args, argv1) = partition ("-B" `isPrefixOf`) argv0
mbMinusB | null minusB_args = Nothing
| otherwise = Just (drop 2 (last minusB_args))
-- 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 ()
+ ShowSupportedLanguages -> do showSupportedLanguages
+ exitWith ExitSuccess
+ ShowVersion -> do showVersion
+ exitWith ExitSuccess
+ ShowNumVersion -> do putStrLn cProjectVersion
+ exitWith ExitSuccess
+ _ -> return ()
-- start our GHC session
session <- GHC.newSession mbMinusB
---------------- Final sanity checking -----------
checkOptions cli_mode dflags srcs objs
- ---------------- Do the business -----------
+ ---------------- Do the business -----------
+ let alreadyHandled = panic (show cli_mode ++
+ " should already have been handled")
case cli_mode of
- 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)
+ ShowUsage -> showGhcUsage dflags cli_mode
+ PrintLibdir -> putStrLn (topDir dflags)
+ ShowSupportedLanguages -> alreadyHandled
+ ShowVersion -> alreadyHandled
+ ShowNumVersion -> alreadyHandled
+ 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
-- GHC modes of operation
data CmdLineMode
- = ShowUsage -- ghc -?
- | PrintLibdir -- ghc --print-libdir
- | ShowVersion -- ghc -V/--version
- | ShowNumVersion -- ghc --numeric-version
- | ShowInterface String -- ghc --show-iface
- | DoMkDependHS -- ghc -M
- | StopBefore Phase -- ghc -E | -C | -S
- -- StopBefore StopLn is the default
- | DoMake -- ghc --make
- | DoInteractive -- ghc --interactive
- | DoEval String -- ghc -e
+ = ShowUsage -- ghc -?
+ | PrintLibdir -- ghc --print-libdir
+ | ShowSupportedLanguages -- ghc --supported-languages
+ | ShowVersion -- ghc -V/--version
+ | ShowNumVersion -- ghc --numeric-version
+ | ShowInterface String -- ghc --show-iface
+ | DoMkDependHS -- ghc -M
+ | StopBefore Phase -- ghc -E | -C | -S
+ -- StopBefore StopLn is the default
+ | DoMake -- ghc --make
+ | DoInteractive -- ghc --interactive
+ | DoEval String -- ghc -e
deriving (Show)
isInteractiveMode, isInterpretiveMode :: CmdLineMode -> Bool
, ( "V" , PassFlag (setMode ShowVersion))
, ( "-version" , PassFlag (setMode ShowVersion))
, ( "-numeric-version", PassFlag (setMode ShowNumVersion))
+ , ( "-supported-languages", PassFlag (setMode ShowSupportedLanguages))
------- interfaces ----------------------------------------------------
, ( "-show-iface" , HasArg (\f -> setMode (ShowInterface f)
showBanner cli_mode dflags = do
let verb = verbosity dflags
+#ifdef GHCI
+ -- Show the GHCi banner
+ when (isInteractiveMode cli_mode && verb >= 1) $ putStrLn ghciWelcomeMsg
+#endif
+
-- Display details of the configuration in verbose mode
when (verb >= 2) $
do hPutStr stderr "Glasgow Haskell Compiler, Version "
hPutStr stderr " booted by GHC version "
hPutStrLn stderr cBooterVersion
+showSupportedLanguages :: IO ()
+showSupportedLanguages = do mapM_ putStrLn supportedLanguages
+ exitWith ExitSuccess
+
showVersion :: IO ()
showVersion = do
putStrLn (cProjectName ++ ", version " ++ cProjectVersion)
showGhcUsage dflags cli_mode = do
let usage_path
- | DoInteractive <- cli_mode = ghcUsagePath dflags
- | otherwise = ghciUsagePath dflags
+ | DoInteractive <- cli_mode = ghciUsagePath dflags
+ | otherwise = ghcUsagePath dflags
usage <- readFile usage_path
dump usage
exitWith ExitSuccess