[project @ 2001-01-02 15:30:57 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverUtil.hs
index 764be3f..91fd3ca 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverUtil.hs,v 1.11 2000/11/20 16:28:29 simonmar Exp $
+-- $Id: DriverUtil.hs,v 1.16 2000/12/20 15:44:01 rrt Exp $
 --
 -- Utils for the driver
 --
@@ -9,9 +9,11 @@
 
 module DriverUtil where
 
+#include "../includes/config.h"
 #include "HsVersions.h"
 
 import Util
+import Panic
 
 import IOExts
 import Exception
@@ -20,6 +22,7 @@ import RegexString
 
 import IO
 import System
+import Directory ( removeFile )
 import List
 import Char
 import Monad
@@ -27,8 +30,6 @@ import Monad
 -----------------------------------------------------------------------------
 -- Errors
 
-short_usage = "Usage: For basic information, try the `--help' option."
-   
 GLOBAL_VAR(v_Path_usage,  "",  String)
 
 long_usage = do
@@ -38,38 +39,9 @@ long_usage = do
   exitWith ExitSuccess
   where
      dump "" = return ()
-     dump ('$':'$':s) = hPutStr stderr prog_name >> dump s
+     dump ('$':'$':s) = hPutStr stderr progName >> dump s
      dump (c:s) = hPutChar stderr c >> dump s
 
-data BarfKind
-  = PhaseFailed String ExitCode
-  | Interrupted
-  | UsageError String                  -- prints the short usage msg after the error
-  | OtherError String                  -- just prints the error message
-  deriving Eq
-
-prog_name = unsafePerformIO (getProgName)
-{-# NOINLINE prog_name #-}
-
-instance Show BarfKind where
-  showsPrec _ e = showString prog_name . showString ": " . showBarf e
-
-showBarf (UsageError str)
-   = showString str . showChar '\n' . showString short_usage
-showBarf (OtherError str)
-   = showString str
-showBarf (PhaseFailed phase code)
-   = showString phase . showString " failed, code = " . shows code
-showBarf (Interrupted)
-   = showString "interrupted"
-
-unknownFlagErr f = throwDyn (UsageError ("unrecognised flag: " ++ f))
-
-barfKindTc = mkTyCon "BarfKind"
-{-# NOINLINE barfKindTc #-}
-instance Typeable BarfKind where
-  typeOf _ = mkAppTy barfKindTc []
-
 -----------------------------------------------------------------------------
 -- Reading OPTIONS pragmas
 
@@ -88,7 +60,8 @@ getOptionsFromSource file
                   | prefixMatch "#" l -> look h
                   | prefixMatch "{-# LINE" l -> look h   -- -}
                   | Just (opts:_) <- matchRegex optionRegex l
-                       -> return (words opts)
+                       -> do rest <- look h
+                              return (words opts ++ rest)
                   | otherwise -> return []
 
 optionRegex = mkRegex "\\{-#[ \t]+OPTIONS[ \t]+(.*)#-\\}"   -- -}
@@ -96,6 +69,9 @@ optionRegex = mkRegex "\\{-#[ \t]+OPTIONS[ \t]+(.*)#-\\}"   -- -}
 -----------------------------------------------------------------------------
 -- Utils
 
+unknownFlagErr :: String -> a
+unknownFlagErr f = throwDyn (UsageError ("unrecognised flag: " ++ f))
+
 my_partition :: (a -> Maybe b) -> [a] -> ([(a,b)],[a])
 my_partition _ [] = ([],[])
 my_partition p (a:as)
@@ -116,6 +92,9 @@ later = flip finally
 handleDyn :: Typeable ex => (ex -> IO a) -> IO a -> IO a
 handleDyn = flip catchDyn
 
+handle :: (Exception -> IO a) -> IO a -> IO a
+handle = flip Exception.catchAllIO
+
 split :: Char -> String -> [String]
 split c s = case rest of
                []     -> [chunk] 
@@ -181,3 +160,24 @@ newdir dir s = dir ++ '/':drop_longest_prefix s '/'
 
 remove_spaces :: String -> String
 remove_spaces = reverse . dropWhile isSpace . reverse . dropWhile isSpace
+
+
+-- system that works feasibly under Windows (i.e. passes the command line to sh,
+-- because system() under Windows doesn't look at SHELL, and always uses CMD.EXE)
+kludgedSystem cmd phase_name
+ = do
+#ifndef mingw32_TARGET_OS
+   exit_code <- system cmd `catchAllIO` 
+                  (\_ -> throwDyn (PhaseFailed phase_name (ExitFailure 1)))
+#else
+   pid <- myGetProcessID
+   let tmp = "/tmp/sh" ++ show pid
+   h <- openFile tmp WriteMode
+   hPutStrLn h cmd
+   hClose h
+   exit_code <- system ("sh - " ++ tmp) `catchAllIO` 
+                  (\_ -> removeFile tmp >>
+                          throwDyn (PhaseFailed phase_name (ExitFailure 1)))
+   removeFile tmp
+#endif
+   return exit_code