| 1 | module Main where |
|---|
| 2 | |
|---|
| 3 | import GHC hiding (flags, ModuleName) |
|---|
| 4 | import qualified Config as GHC |
|---|
| 5 | import ErrUtils ( MsgDoc ) |
|---|
| 6 | import Outputable ( PprStyle, showSDocForUser, qualName, qualModule ) |
|---|
| 7 | import FastString ( unpackFS ) |
|---|
| 8 | import StringBuffer ( stringToStringBuffer ) |
|---|
| 9 | |
|---|
| 10 | import System.Process |
|---|
| 11 | import Data.Time |
|---|
| 12 | import Data.IORef |
|---|
| 13 | import Control.Applicative |
|---|
| 14 | import qualified Control.Exception as Ex |
|---|
| 15 | |
|---|
| 16 | main :: IO () |
|---|
| 17 | main = |
|---|
| 18 | handleOtherErrors $ do |
|---|
| 19 | |
|---|
| 20 | libdir <- getGhcLibdir |
|---|
| 21 | |
|---|
| 22 | runGhc (Just libdir) $ |
|---|
| 23 | handleSourceError printException $ do |
|---|
| 24 | |
|---|
| 25 | flags0 <- getSessionDynFlags |
|---|
| 26 | (flags, _, _) <- parseDynamicFlags flags0 $ [noLoc "-XCPP"] |
|---|
| 27 | |
|---|
| 28 | defaultCleanupHandler flags $ do |
|---|
| 29 | setSessionDynFlags flags { |
|---|
| 30 | hscTarget = HscNothing, |
|---|
| 31 | ghcLink = NoLink, |
|---|
| 32 | ghcMode = CompManager, |
|---|
| 33 | log_action = collectSrcError, |
|---|
| 34 | verbosity = 1 |
|---|
| 35 | } |
|---|
| 36 | addTarget Target |
|---|
| 37 | { targetId = TargetFile "Ticks.hs" Nothing |
|---|
| 38 | , targetAllowObjCode = True |
|---|
| 39 | , targetContents = Nothing |
|---|
| 40 | } |
|---|
| 41 | load LoadAllTargets |
|---|
| 42 | return () |
|---|
| 43 | |
|---|
| 44 | return () |
|---|
| 45 | where |
|---|
| 46 | handleOtherErrors = |
|---|
| 47 | Ex.handle $ \e -> |
|---|
| 48 | putStrLn $ "Exception:\n" ++ show (e :: Ex.SomeException) ++ "\n" |
|---|
| 49 | |
|---|
| 50 | getGhcLibdir :: IO FilePath |
|---|
| 51 | getGhcLibdir = do |
|---|
| 52 | let ghcbinary = "ghc-" ++ GHC.cProjectVersion |
|---|
| 53 | out <- readProcess ghcbinary ["--print-libdir"] "" |
|---|
| 54 | case lines out of |
|---|
| 55 | [libdir] -> return libdir |
|---|
| 56 | _ -> fail "cannot parse output of ghc --print-libdir" |
|---|
| 57 | |
|---|
| 58 | collectSrcError :: DynFlags |
|---|
| 59 | -> Severity -> SrcSpan -> PprStyle -> MsgDoc -> IO () |
|---|
| 60 | collectSrcError flags severity srcspan style msg = do |
|---|
| 61 | let showSeverity SevOutput = "SevOutput" |
|---|
| 62 | showSeverity SevDump = "SevDump" |
|---|
| 63 | showSeverity SevInfo = "SevInfo" |
|---|
| 64 | showSeverity SevWarning = "SevWarning" |
|---|
| 65 | showSeverity SevError = "SevError" |
|---|
| 66 | showSeverity SevFatal = "SevFatal" |
|---|
| 67 | putStrLn |
|---|
| 68 | $ "Normal error message:\nSeverity: " ++ showSeverity severity |
|---|
| 69 | ++ " SrcSpan: " ++ show srcspan |
|---|
| 70 | -- ++ " PprStyle: " ++ show style |
|---|
| 71 | ++ " MsgDoc: " ++ showSDocForUser flags (qualName style,qualModule style) msg |
|---|
| 72 | ++ "\n" |
|---|