-- Various other random stuff that we need
import Config
+import HscTypes
import Packages ( dumpPackages )
import DriverPhases ( Phase(..), isSourceFilename, anyHsc,
startPhase, isHaskellSrcFilename )
import StaticFlags
import DynFlags
import BasicTypes ( failed )
-import ErrUtils ( putMsg )
+import ErrUtils
import FastString
import Outputable
import Util
mbMinusB | null minusB_args = Nothing
| otherwise = Just (drop 2 (last minusB_args))
- argv2 <- parseStaticFlags argv1
+ (argv2, staticFlagWarnings) <- parseStaticFlags argv1
-- 2. Parse the "mode" flags (--make, --interactive etc.)
- (cli_mode, argv3) <- parseModeFlags argv2
+ (cli_mode, argv3, modeFlagWarnings) <- 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.
-- The rest of the arguments are "dynamic"
-- Leftover ones are presumably files
- (dflags, fileish_args) <- GHC.parseDynamicFlags dflags1 argv3
+ (dflags, fileish_args, dynamicFlagWarnings) <- GHC.parseDynamicFlags dflags1 argv3
+
+ let flagWarnings = staticFlagWarnings
+ ++ modeFlagWarnings
+ ++ dynamicFlagWarnings
+ handleFlagWarnings dflags flagWarnings
-- make sure we clean up after ourselves
GHC.defaultCleanupHandler dflags $ do
-- we've finished manipulating the DynFlags, update the session
GHC.setSessionDynFlags session dflags
- dflags <- GHC.getSessionDynFlags session
+ dflags <- GHC.getSessionDynFlags session
+ hsc_env <- GHC.sessionHscEnv session
let
-- To simplify the handling of filepaths, we normalise all filepaths right
ShowInterface f -> doShowIface dflags f
DoMake -> doMake session srcs
DoMkDependHS -> doMkDependHS session (map fst srcs)
- StopBefore p -> oneShot dflags p srcs
+ StopBefore p -> oneShot hsc_env p srcs
DoInteractive -> interactiveUI session srcs Nothing
DoEval exprs -> interactiveUI session srcs $ Just $ reverse exprs
-- -----------------------------------------------------------------------------
-- Parsing the mode flag
-parseModeFlags :: [String] -> IO (CmdLineMode, [String])
+parseModeFlags :: [String] -> IO (CmdLineMode, [String], [String])
parseModeFlags args = do
- let ((leftover, errs), (mode, _, flags)) =
+ let ((leftover, errs, warns), (mode, _, flags)) =
runCmdLine (processArgs mode_flags args) (StopBefore StopLn, "", [])
when (not (null errs)) $ do
throwDyn (UsageError (unlines errs))
- return (mode, flags ++ leftover)
+ return (mode, flags ++ leftover, warns)
-type ModeM a = CmdLineP (CmdLineMode, String, [String]) a
+type ModeM = CmdLineP (CmdLineMode, String, [String])
-- mode flags sometimes give rise to new DynFlags (eg. -C, see below)
-- so we collect the new ones and return them.
-mode_flags :: [(String, OptKind (CmdLineP (CmdLineMode, String, [String])))]
+mode_flags :: [Flag ModeM]
mode_flags =
[ ------- help / version ----------------------------------------------
- ( "?" , PassFlag (setMode ShowUsage))
- , ( "-help" , PassFlag (setMode ShowUsage))
- , ( "-print-libdir" , PassFlag (setMode PrintLibdir))
- , ( "V" , PassFlag (setMode ShowVersion))
- , ( "-version" , PassFlag (setMode ShowVersion))
- , ( "-numeric-version" , PassFlag (setMode ShowNumVersion))
- , ( "-info" , PassFlag (setMode ShowInfo))
- , ( "-supported-languages", PassFlag (setMode ShowSupportedLanguages))
+ Flag "?" (PassFlag (setMode ShowUsage))
+ Supported
+ , Flag "-help" (PassFlag (setMode ShowUsage))
+ Supported
+ , Flag "-print-libdir" (PassFlag (setMode PrintLibdir))
+ Supported
+ , Flag "V" (PassFlag (setMode ShowVersion))
+ Supported
+ , Flag "-version" (PassFlag (setMode ShowVersion))
+ Supported
+ , Flag "-numeric-version" (PassFlag (setMode ShowNumVersion))
+ Supported
+ , Flag "-info" (PassFlag (setMode ShowInfo))
+ Supported
+ , Flag "-supported-languages" (PassFlag (setMode ShowSupportedLanguages))
+ Supported
------- interfaces ----------------------------------------------------
- , ( "-show-iface" , HasArg (\f -> setMode (ShowInterface f)
- "--show-iface"))
+ , Flag "-show-iface" (HasArg (\f -> setMode (ShowInterface f)
+ "--show-iface"))
+ Supported
------- 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 -> updateMode (updateDoEval s) "-e"))
+ , Flag "M" (PassFlag (setMode DoMkDependHS))
+ Supported
+ , Flag "E" (PassFlag (setMode (StopBefore anyHsc)))
+ Supported
+ , Flag "C" (PassFlag (\f -> do setMode (StopBefore HCc) f
+ addFlag "-fvia-C"))
+ Supported
+ , Flag "S" (PassFlag (setMode (StopBefore As)))
+ Supported
+ , Flag "-make" (PassFlag (setMode DoMake))
+ Supported
+ , Flag "-interactive" (PassFlag (setMode DoInteractive))
+ Supported
+ , Flag "e" (HasArg (\s -> updateMode (updateDoEval s) "-e"))
+ Supported
-- -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"))
+ , Flag "fno-code" (PassFlag (\f -> do setMode (StopBefore HCc) f
+ addFlag "-fno-code"
+ addFlag "-no-recomp"))
+ Supported
]
setMode :: CmdLineMode -> String -> ModeM ()
haskellish (_,Just phase) =
phase `notElem` [As, Cc, CmmCpp, Cmm, StopLn]
- dflags <- GHC.getSessionDynFlags sess
- o_files <- mapM (compileFile dflags StopLn) non_hs_srcs
+ hsc_env <- GHC.sessionHscEnv sess
+ o_files <- mapM (compileFile hsc_env StopLn) non_hs_srcs
mapM_ (consIORef v_Ld_inputs) (reverse o_files)
targets <- mapM (uncurry GHC.guessTarget) hs_srcs