diff --git a/ghc/driver/Main.hs b/ghc/driver/Main.hs
index 39e61eb2ab97eaaff00f34deef5505c099eb85ff..4cf93d06c5c31cbe26b36dc2e63f9d7843163e3d 100644
--- a/ghc/driver/Main.hs
+++ b/ghc/driver/Main.hs
@@ -5,6 +5,9 @@
 --
 -----------------------------------------------------------------------------
 
+-- with path so that ghc -M can find config.h
+#include "../includes/config.h"
+
 module Main (main) where
 
 import Package
@@ -12,7 +15,10 @@ import Config
 
 import RegexString
 import Concurrent
+#ifndef mingw32_TARGET_OS
 import Posix
+#endif
+import Directory
 import IOExts
 import Exception
 import Dynamic
@@ -25,6 +31,10 @@ import System
 import Maybe
 import Char
 
+#ifdef mingw32_TARGET_OS
+foreign import "_getpid" getProcessID :: IO Int 
+#endif
+
 #define GLOBAL_VAR(name,value,ty)  \
 name = global (value) :: IORef (ty); \
 {-# NOINLINE name #-}
@@ -37,7 +47,7 @@ name = global (value) :: IORef (ty); \
 -- mkDLL
 -- java generation
 -- user ways
--- Win32 support
+-- Win32 support: proper signal handling
 -- make sure OPTIONS in .hs file propogate to .hc file if -C or -keep-hc-file-too
 -- reading the package configuration file is too slow
 
@@ -174,7 +184,7 @@ cleanTempFiles = do
   let blowAway f =
 	   (do  on verb (hPutStrLn stderr ("removing: " ++ f))
 		if '*' `elem` f then system ("rm -f " ++ f) >> return ()
-			        else removeLink f)
+			        else removeFile f)
 	    `catchAllIO`
 	   (\e -> on verb (hPutStrLn stderr 
 				("warning: can't remove tmp file" ++ f)))
@@ -236,7 +246,11 @@ GLOBAL_VAR(dry_run, 		False,		Bool)
 GLOBAL_VAR(recomp,  		True,		Bool)
 GLOBAL_VAR(tmp_prefix, 		cTMPDIR,	String)
 GLOBAL_VAR(stolen_x86_regs, 	4, 		Int)
-GLOBAL_VAR(static, 		True,		Bool)  -- ToDo: not for mingw32
+#if !defined(HAVE_WIN32_DLL_SUPPORT) || defined(DONT_WANT_WIN32_DLL_SUPPORT)
+GLOBAL_VAR(static, 		True,		Bool)
+#else
+GLOBAL_VAR(static,              False,          Bool)
+#endif
 GLOBAL_VAR(collect_ghc_timing, 	False,		Bool)
 GLOBAL_VAR(do_asm_mangling,	True,		Bool)
 
@@ -588,8 +602,8 @@ deletePackage pkg = do
 checkConfigAccess :: IO ()
 checkConfigAccess = do
   conf_file <- readIORef package_config
-  access <- fileAccess conf_file True True False
-  unless access $
+  access <- getPermissions conf_file
+  unless (writable access)
 	throwDyn (OtherError "you don't have permission to modify the package configuration file")
 
 maybeRestoreOldConfig :: String -> IO () -> IO ()
@@ -1096,10 +1110,13 @@ main =
   do
 	-- install signal handlers
    main_thread <- myThreadId
+
+#ifndef mingw32_TARGET_OS
    let sig_handler = Catch (raiseInThread main_thread 
 				(DynException (toDyn Interrupted)))
    installHandler sigQUIT sig_handler Nothing 
    installHandler sigINT  sig_handler Nothing
+#endif
 
    pgm    <- getProgName
    writeIORef prog_name pgm
@@ -1282,7 +1299,7 @@ newTempName extn = do
   findTempName tmp_dir x
   where findTempName tmp_dir x = do
   	   let filename = tmp_dir ++ "/ghc" ++ show x ++ '.':extn
-  	   b  <- fileExist filename
+  	   b  <- doesFileExist filename
 	   if b then findTempName tmp_dir (x+1)
 		else return filename
 
@@ -1423,7 +1440,7 @@ run_phase Hsc	basename input_fn output_fn
 	let stub_c = basename ++ "_stub.c"
 	
 		-- copy .h_stub file into current dir if present
-	b <- fileExist tmp_stub_h
+	b <- doesFileExist tmp_stub_h
 	on b (do
 	      	run_something "Copy stub .h file"
 				("cp " ++ tmp_stub_h ++ ' ':stub_h)
@@ -1457,9 +1474,8 @@ run_phase Hsc	basename input_fn output_fn
 run_phase cc_phase basename input_fn output_fn
    | cc_phase == Cc || cc_phase == HCc
    = do	cc <- readIORef pgm_c
-       	cc_opts <- getOpts opt_c
+       	cc_opts <- (getOpts opt_c)
        	cmdline_include_dirs <- readIORef include_paths
-       -- ToDo: $c_flags .= " -mno-cygwin" if ( $TargetPlatform =~ /-mingw32$/ );
 
         let hcc = cc_phase == HCc
 
@@ -1512,6 +1528,9 @@ run_phase cc_phase basename input_fn output_fn
 		   ++ [ verb, "-S", "-Wimplicit", opt_flag ]
 		   ++ [ "-D__GLASGOW_HASKELL__="++cProjectVersionInt ]
 		   ++ cc_opts
+#ifdef mingw32_TARGET_OS
+                   ++ [" -mno-cygwin"]
+#endif
 		   ++ include_paths
 		   ++ pkg_extra_cc_opts
 --		   ++ [">", ccout]
@@ -1671,7 +1690,7 @@ run_something phase_name cmd
    unless n $ do 
 
    -- and run it!
-   exit_code <- system cmd  `catchAllIO` 
+   exit_code <- system ("sh -c \"" ++ cmd ++ "\"")  `catchAllIO` 
 		   (\e -> throwDyn (PhaseFailed phase_name (ExitFailure 1)))
 
    if exit_code /= ExitSuccess
@@ -1985,7 +2004,7 @@ findFile name alt_path = unsafePerformIO (do
   top_dir <- readIORef topDir
   let installed_file = top_dir ++ '/':name
   let inplace_file   = top_dir ++ '/':cCURRENT_DIR ++ '/':alt_path
-  b <- fileExist inplace_file
+  b <- doesFileExist inplace_file
   if b  then return inplace_file
 	else return installed_file
  )
diff --git a/ghc/driver/Makefile b/ghc/driver/Makefile
index f81e3b331d4355acdd4860522ddc79ecc1ba8e8c..20568929406769fb554de4386a3e805338b27a4c 100644
--- a/ghc/driver/Makefile
+++ b/ghc/driver/Makefile
@@ -1,5 +1,5 @@
 #-----------------------------------------------------------------------------
-# $Id: Makefile,v 1.41 2000/07/06 09:35:37 simonmar Exp $
+# $Id: Makefile,v 1.42 2000/07/17 15:25:05 rrt Exp $
 #
 
 TOP=..
@@ -12,8 +12,12 @@ endif
 
 ghc_407_at_least = $(shell expr "$(GhcMinVersion)" \>= 7)
 ifeq "$(ghc_407_at_least)" "1"
+ifneq "$(mingw32_TARGET_OS)" "1"
 SRC_HC_OPTS += -fglasgow-exts -cpp -package concurrent -package posix -package text
 else
+SRC_HC_OPTS += -fglasgow-exts -cpp -package concurrent -package text
+endif
+else
 SRC_HC_OPTS += -fglasgow-exts -cpp -syslib concurrent -syslib posix -syslib misc
 endif