module FrontendPlugin where import GhcPlugins import qualified GHC import GHC ( Ghc, LoadHowMuch(..) ) import DriverPipeline hiding ( hsc_env ) import DriverPhases import System.Exit import Control.Monad import Data.List frontendPlugin :: FrontendPlugin frontendPlugin = defaultFrontendPlugin { frontend = doMake } -- Copypasted from ghc/Main.hs doMake :: [String] -> [(String,Maybe Phase)] -> Ghc () doMake opts srcs = do liftIO $ print opts let (hs_srcs, non_hs_srcs) = partition haskellish srcs haskellish (f,Nothing) = looksLikeModuleName f || isHaskellUserSrcFilename f || '.' `notElem` f haskellish (_,Just phase) = phase `notElem` [ As True, As False, Cc, Cobjc, Cobjcxx, CmmCpp, Cmm , StopLn] hsc_env <- GHC.getSession -- if we have no haskell sources from which to do a dependency -- analysis, then just do one-shot compilation and/or linking. -- This means that "ghc Foo.o Bar.o -o baz" links the program as -- we expect. if (null hs_srcs) then liftIO (oneShot hsc_env StopLn srcs) else do o_files <- mapM (\x -> liftIO $ compileFile hsc_env StopLn x) non_hs_srcs dflags <- GHC.getSessionDynFlags let dflags' = dflags { ldInputs = map (FileOption "") o_files ++ ldInputs dflags } _ <- GHC.setSessionDynFlags dflags' targets <- mapM (uncurry GHC.guessTarget) hs_srcs GHC.setTargets targets ok_flag <- GHC.load LoadAllTargets when (failed ok_flag) (liftIO $ exitWith (ExitFailure 1)) return ()