-- Initialisation
initSysTools,
- setPgmP, -- String -> IO ()
+ setPgmL, -- String -> IO ()
+ setPgmP,
setPgmF,
setPgmc,
setPgmm,
) where
+#include "HsVersions.h"
+
import DriverUtil
import Config
import Outputable
import Panic ( progName, GhcException(..) )
-import Util ( global, dropList, notNull )
+import Util ( global, notNull )
import CmdLineOpts ( dynFlag, verbosity )
-import Exception ( throwDyn )
-#if __GLASGOW_HASKELL__ > 408
-import qualified Exception ( catch )
-#else
-import Exception ( catchAllIO )
-#endif
-import IO
-import Directory ( doesFileExist, removeFile )
-import IOExts ( IORef, readIORef, writeIORef )
+import EXCEPTION ( throwDyn )
+import DATA_IOREF ( IORef, readIORef, writeIORef )
+import DATA_INT
+
import Monad ( when, unless )
import System ( ExitCode(..), exitWith, getEnv, system )
-import CString
-import Int
-import Addr
-
+import IO ( try, catch,
+ openFile, hPutChar, hPutStrLn, hPutStr, hClose, hFlush, IOMode(..),
+ stderr )
+import Directory ( doesFileExist, removeFile )
+
#include "../includes/config.h"
+-- GHC <= 4.08 didn't have rawSystem, and runs into problems with long command
+-- lines on mingw32, so we disallow it now.
+#if defined(mingw32_HOST_OS) && (__GLASGOW_HASKELL__ <= 408)
+#error GHC <= 4.08 is not supported for bootstrapping GHC on i386-unknown-mingw32
+#endif
+
#ifndef mingw32_HOST_OS
-import qualified Posix
+#if __GLASGOW_HASKELL__ > 504
+import qualified System.Posix.Internals
#else
+import qualified Posix
+#endif
+#else /* Must be Win32 */
import List ( isPrefixOf )
-import MarshalArray
+import Util ( dropList )
import Foreign
+import CString ( CString, peekCString )
#endif
-#if __GLASGOW_HASKELL__ > 408
-# if __GLASGOW_HASKELL__ >= 503
-import GHC.IOBase
-# else
-# endif
-# ifdef mingw32_HOST_OS
-import SystemExts ( rawSystem )
-# endif
+#ifdef mingw32_HOST_OS
+#if __GLASGOW_HASKELL__ > 504
+import System.Cmd ( rawSystem )
#else
-import System ( system )
+import SystemExts ( rawSystem )
#endif
+#else /* Not Win32 */
-#include "HsVersions.h"
-
--- Make catch work on older GHCs
-#if __GLASGOW_HASKELL__ > 408
-myCatch = Exception.catch
-#else
-myCatch = catchAllIO
+import System ( system )
#endif
-
\end{code}
; let split_path = perl_path ++ " \"" ++ split_script ++ "\""
mangle_path = perl_path ++ " \"" ++ mangle_script ++ "\""
- ; let mkdll_path = cMKDLL
+ ; let mkdll_path
+ | am_installed = pgmPath (installed "gcc-lib/") cMKDLL ++
+ " --dlltool-name " ++ pgmPath (installed "gcc-lib/") "dlltool" ++
+ " --driver-name " ++ gcc_path
+ | otherwise = cMKDLL
#else
-- UNIX-SPECIFIC STUFF
-- On Unix, the "standard" tools are assumed to be
is used to override a particular program with a new one
\begin{code}
+setPgmL = writeIORef v_Pgm_L
setPgmP = writeIORef v_Pgm_P
setPgmF = writeIORef v_Pgm_F
setPgmc = writeIORef v_Pgm_c
("Deleting: " ++ unwords fs)
(mapM_ rm fs)
where
- rm f = removeFile f `myCatch`
+ rm f = removeFile f `IO.catch`
(\_ignored ->
when (verb >= 2) $
hPutStrLn stderr ("Warning: deleting non-existent " ++ f)
; unless n $ do {
-- And run it!
- ; action `myCatch` handle_exn verb
+ ; action `IO.catch` handle_exn verb
}}
where
handle_exn verb exn = do { when (verb >= 2) (hPutStr stderr "\n")
getExecDir :: IO (Maybe String)
getExecDir = do let len = (2048::Int) -- plenty, PATH_MAX is 512 under Win32.
buf <- mallocArray len
- ret <- getModuleFileName nullAddr buf len
+ ret <- getModuleFileName nullPtr buf len
if ret == 0 then free buf >> return Nothing
else do s <- peekCString buf
free buf
return (Just (reverse (dropList "/bin/ghc.exe" (reverse (unDosifyPath s)))))
-foreign import stdcall "GetModuleFileNameA" unsafe getModuleFileName :: Addr -> CString -> Int -> IO Int32
+foreign import stdcall "GetModuleFileNameA" unsafe
+ getModuleFileName :: Ptr () -> CString -> Int -> IO Int32
#else
getExecDir :: IO (Maybe String) = do return Nothing
#endif
#ifdef mingw32_HOST_OS
-foreign import "_getpid" unsafe getProcessID :: IO Int -- relies on Int == Int32 on Windows
+foreign import ccall "_getpid" unsafe getProcessID :: IO Int -- relies on Int == Int32 on Windows
+#elif __GLASGOW_HASKELL__ > 504
+getProcessID :: IO Int
+getProcessID = System.Posix.Internals.c_getpid >>= return . fromIntegral
#else
getProcessID :: IO Int
getProcessID = Posix.getProcessID
#endif
-#if defined(mingw32_HOST_OS) && (__GLASGOW_HASKELL__ <= 408)
-rawSystem :: String -> IO ExitCode
-rawSystem cmd = system cmd
- -- mingw only: if you try to build a stage2 compiler with a stage1
- -- that has been bootstrapped with 4.08 (or earlier), this will run
- -- into problems with limits on command-line lengths with the std.
- -- Win32 command interpreters. So don't this - use 5.00 or later
- -- to compile up the GHC sources.
-#endif
-
quote :: String -> String
-#if defined(mingw32_HOST_OS)
quote "" = ""
quote s = "\"" ++ s ++ "\""
-#else
-quote s = s
-#endif
\end{code}