+compileFiles :: GhcMode
+ -> [String] -- Source files
+ -> IO [String] -- Object files
+compileFiles mode srcs = do
+ stop_flag <- readIORef v_GhcModeFlag
+ mapM (compileFile mode stop_flag) srcs
+
+
+compileFile mode stop_flag src = do
+ restoreDynFlags
+
+ exists <- doesFileExist src
+ when (not exists) $
+ throwDyn (CmdLineError ("file `" ++ src ++ "' does not exist"))
+
+ -- We compile in two stages, because the file may have an
+ -- OPTIONS pragma that affects the compilation pipeline (eg. -fvia-C)
+ let (basename, suffix) = splitFilename src
+
+ -- just preprocess (Haskell source only)
+ let src_and_suff = (src, getFileSuffix src)
+ let not_hs_file = not (haskellish_src_file src)
+ pp <- if not_hs_file || mode == StopBefore Hsc || mode == StopBefore HsPp
+ then return src_and_suff else do
+ phases <- genPipeline (StopBefore Hsc) stop_flag
+ False{-not persistent-} defaultHscLang
+ src_and_suff
+ pipeLoop phases src_and_suff False{-no linking-} False{-no -o flag-}
+ basename suffix
+
+ -- rest of compilation
+ hsc_lang <- dynFlag hscLang
+ phases <- genPipeline mode stop_flag True hsc_lang pp
+ (r,_) <- pipeLoop phases pp (mode==DoLink || mode==DoMkDLL)
+ True{-use -o flag-} basename suffix
+ return r
+
+
+-- ----------------------------------------------------------------------------
+-- Run --make mode
+
+doMake :: [String] -> IO ()
+doMake [] = throwDyn (UsageError "no input files")
+doMake srcs = do
+ dflags <- getDynFlags
+ state <- cmInit Batch
+ graph <- cmDepAnal state dflags srcs
+ (_, ok_flag, _) <- cmLoadModules state dflags graph
+ when (failed ok_flag) (exitWith (ExitFailure 1))
+ return ()
+
+-- ---------------------------------------------------------------------------
+-- Various banners and verbosity output.
+
+showBanners :: GhcMode -> FilePath -> [String] -> IO ()
+showBanners mode conf_file static_opts = do
+ verb <- dynFlag verbosity