Allow testsuite to run under MSYS/MinGW using native Python (not Cygwin Python).
authorbrianlsmith <brianlsmith@gmail.com>
Sun, 17 Sep 2006 01:06:02 +0000 (01:06 +0000)
committerbrianlsmith <brianlsmith@gmail.com>
Sun, 17 Sep 2006 01:06:02 +0000 (01:06 +0000)
This patch is based on a similar one "Enable timeout in Windows
and don't require cygwin python" by Esa Ilari Vuokko. It seems
like timeout is always built on Windows so I rearranged the logic
there to make the code clearer, Esa's patch required the user to
uncomment the MinGW-specific logic in order for it to work; this
patch does not have the MinGW-specific logic commented out.

I tested this on the trunk in Ubuntu 6.06 on i686 (VMWare).
I tested this on the trunk and ghc-6.6 branch on Windows i686.

testsuite/driver/testlib.py
testsuite/tests/ghc-regress/ghci/shell.hs
testsuite/tests/ghc-regress/lib/Process/process001.hs
testsuite/tests/ghc-regress/lib/Process/process002.hs
testsuite/timeout/timeout.hs

index 209750c..ee46ad8 100644 (file)
@@ -922,16 +922,20 @@ def guess_compiler_flags():
 
 def runCmd( cmd ):
     if_verbose( 1, cmd )
-    # On Windows, we need to run the command via the cygwin shell here,
-    # rather than CMD.EXE.  os.system() does the right thing (as long as
-    # Python is the cygwin Python), but our timeout program doesn't.  So
-    # We disable the use of the timeout program on Windows, for now.
-    if (config.timeout_prog == '' or config.platform == 'i386-unknown-mingw32'):
-        return os.system( cmd )
+    r = 0
+    if config.platform == 'i386-unknown-mingw32':
+       # On MinGW, we will always have timeout
+        assert config.timeout_prog!=''
+        # We need to add " around the command, because
+        # (like Windows programs usually) timeout parses the commandline.
+        r = os.spawnl(os.P_WAIT, config.timeout_prog,
+                     config.timeout_prog,`config.timeout`,'"%s"'%cmd )
+    elif config.timeout_prog!='':
+       r = os.spawnv(os.P_WAIT, config.timeout_prog,
+                     [config.timeout_prog,`config.timeout`,cmd] )
     else:
-        r = os.spawnv(os.P_WAIT, config.timeout_prog,
-                         [config.timeout_prog,`config.timeout`,cmd] )
-        return r << 8
+        r = os.system(cmd)
+    return r << 8
 
 def rm_no_fail( file ):
    try:
index 3a0ef9a..b0ef7aa 100644 (file)
@@ -1,11 +1,12 @@
 {-# OPTIONS -cpp #-}\r
 \r
 -- Used to present a consistent shell view for :! commands in GHCi\r
--- scripts.  We're assuming cygwin is installed in C:/cygwin.\r
+-- scripts.  We're assuming that sh.exe is in the path and that it\r
+-- is a Bourne-compatible shell.\r
 \r
 import System.Cmd\r
 #ifdef mingw32_HOST_OS\r
-shell s = system ("c:/cygwin/bin/sh.exe -c '" ++ s ++ "'")\r
+shell s = system ("sh.exe -c '" ++ s ++ "'")\r
 #else\r
 shell s = system s\r
 #endif\r
index 2fc463f..4cea4a7 100644 (file)
@@ -3,7 +3,7 @@ import System.IO
 import System.Process
 
 #ifdef mingw32_HOST_OS
-cmd = "c:/cygwin/bin/ls"
+cmd = "ls"
 #else
 cmd = "/bin/ls"
 #endif
index 29047ae..008ce79 100644 (file)
@@ -3,7 +3,7 @@ import System.Process
 import System.IO
 
 #ifdef mingw32_HOST_OS
-cmd = "c:/cygwin/bin/ls"
+cmd = "ls"
 #else
 cmd = "/bin/ls"
 #endif
index 81f3ab4..7c84d91 100644 (file)
@@ -81,7 +81,10 @@ main = do
         forkIO (do threadDelay (read secs * 1000000)\r
                    putMVar m Nothing\r
                )\r
-        forkIO (do p <- runCommand cmd\r
+       -- Assume sh.exe is in the path\r
+        forkIO (do p <- runProcess\r
+                            "sh" ["-c",cmd]\r
+                            Nothing Nothing Nothing Nothing Nothing\r
                   putMVar mp p\r
                   r <- waitForProcess p\r
                   putMVar m (Just r))\r
@@ -93,7 +96,7 @@ main = do
                 exitWith (ExitFailure 99)\r
           Just r -> do\r
                 exitWith r\r
-    _other -> do hPutStrLn stderr "timeout: bad arguments"\r
+    _other -> do hPutStrLn stderr $ "timeout: bad arguments " ++ show args\r
                  exitWith (ExitFailure 1)\r
 \r
 killProcess p = do\r