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
30 import System.Directory ( removeFile )
31 import Control.Exception ( bracket )
32 import System.Directory ( findExecutable, getTemporaryDirectory )
35 import Compat.RawSystem ( rawSystem )
37 import System.Cmd ( rawSystem )
43 case getGhcLoc args of
44 (Just ghc, args') -> doIt ghc args'
45 (Nothing, args') -> do
46 mb_ghc <- findExecutable "ghc"
48 Nothing -> dieProg ("cannot find ghc")
49 Just ghc -> doIt ghc args'
51 getGhcLoc :: [String] -> (Maybe FilePath, [String])
52 getGhcLoc ("-f" : ghc : args) = (Just ghc, args)
53 getGhcLoc (('-' : 'f' : ghc) : args) = (Just ghc, args)
54 -- If you need the first GHC flag to be a -f flag then you can pass --
56 getGhcLoc ("--" : args) = (Nothing, args)
57 getGhcLoc args = (Nothing, args)
59 doIt :: String -> [String] -> IO ()
61 let (ghc_args, rest) = getGhcArgs args
64 -- behave like typical perl, python, ruby interpreters:
66 tmpdir <- getTemporaryDirectory
68 (openTempFile tmpdir "runghcXXXX.hs")
69 (\(filename,_) -> removeFile filename)
71 getContents >>= hPutStr h
73 doIt ghc (ghc_args ++ [filename])
74 filename : prog_args -> do
75 let c1 = ":set prog " ++ show filename
76 c2 = ":main " ++ show prog_args
77 res <- rawSystem ghc (["-ignore-dot-ghci"] ++ ghc_args ++
78 [ "-e", c1, "-e", c2, filename])
81 getGhcArgs :: [String] -> ([String], [String])
83 = let (ghcArgs, otherArgs) = case break pastArgs args of
84 (xs, "--":ys) -> (xs, ys)
86 in (map unescape ghcArgs, otherArgs)
87 where unescape ('-':'-':'g':'h':'c':'-':'a':'r':'g':'=':arg) = arg
90 pastArgs :: String -> Bool
91 -- You can use -- to mark the end of the flags, in case you need to use
92 -- a file called -foo.hs for some reason. You almost certainly shouldn't,
95 pastArgs ('-':_) = False
98 dieProg :: String -> IO a
101 hPutStrLn stderr (p ++ ": " ++ msg)
102 exitWith (ExitFailure 1)
105 -- usage = "syntax: runghc [-f GHC-PATH | --] [GHC-ARGS] [--] FILE ARG..."