1 {-# OPTIONS -cpp -fffi #-}
2 #if __GLASGOW_HASKELL__ < 603
7 -----------------------------------------------------------------------------
9 -- (c) The University of Glasgow, 2004
11 -- runghc program, for invoking from a #! line in a script. For example:
15 -- > main = putStrLn "hello!"
17 -- runghc accepts one flag:
19 -- -f <path> specify the path
21 -- -----------------------------------------------------------------------------
23 module Main (main) where
25 import System.Environment
32 import Compat.RawSystem ( rawSystem )
33 import Compat.Directory ( findExecutable )
35 import System.Cmd ( rawSystem )
36 import System.Directory ( findExecutable )
43 "-f" : ghc : args' -> doIt ghc args'
44 ('-' : 'f' : ghc) : args' -> doIt (dropWhile isSpace ghc) args'
46 mb_ghc <- findExecutable "ghc"
48 Nothing -> dieProg ("cannot find ghc")
49 Just ghc -> doIt ghc args
51 doIt :: String -> [String] -> IO ()
53 let (ghc_args, rest) = break notArg args
55 [] -> dieProg "syntax: runghc [-f GHCPATH] [GHC-ARGS] FILE ARG..."
56 filename : prog_args -> do
57 let expr = "System.Environment.withProgName " ++ show filename ++
58 " (System.Environment.withArgs " ++ show prog_args ++
59 " (GHC.TopHandler.runIOFastExit" ++
60 " (Main.main Prelude.>> Prelude.return ())))"
61 res <- rawSystem ghc (["-ignore-dot-ghci"] ++ ghc_args ++
62 [ "-e", expr, filename])
63 -- runIOFastExit: makes exceptions raised by Main.main
64 -- behave in the same way as for a compiled program.
65 -- The "fast exit" part just calls exit() directly
66 -- instead of doing an orderly runtime shutdown,
67 -- otherwise the main GHCi thread will complain about
70 -- Why (main >> return ()) rather than just main? Because
71 -- otherwise GHCi by default tries to evaluate the result
72 -- of the IO in order to show it (see #1200).
75 notArg :: String -> Bool
76 notArg ('-':_) = False
79 dieProg :: String -> IO a
82 hPutStrLn stderr (p ++ ": " ++ msg)
83 exitWith (ExitFailure 1)