-----------------------------------------------------------------------------
--- $Id: SysTools.lhs,v 1.49 2001/08/15 09:32:40 rrt Exp $
--
-- (c) The University of Glasgow 2001
--
#else
import List ( isPrefixOf )
import MarshalArray
-import SystemExts ( rawSystem )
+#endif
+
+-- This is a kludge for bootstrapping with 4.08.X. Given that
+-- all distributed compilers >= 5.0 will be compiled with themselves.
+-- I don't think this kludge is a problem. And we have to start
+-- building with >= 5.0 on Win32 anyway.
+#if __GLASGOW_HASKELL__ > 408
+-- use the line below when we can be sure of compiling with GHC >=
+-- 5.02, and remove the implementation of rawSystem at the end of this
+-- file
+import PrelIOBase -- this can be removed when SystemExts is used
+import CError ( throwErrnoIfMinus1 ) -- as can this
+-- import SystemExts ( rawSystem )
+#else
+import System ( system )
#endif
#include "HsVersions.h"
this type gives us a handle on transforming filenames, and filenames only,
to whatever format they're expected to be on a particular platform.]
-
\begin{code}
data Option
- = FileOption String
+ = FileOption -- an entry that _contains_ filename(s) / filepaths.
+ String -- a non-filepath prefix that shouldn't be transformed (e.g., "/out="
+ String -- the filepath/filename portion
| Option String
showOptions :: [Option] -> String
showOptions ls = unwords (map (quote.showOpt) ls)
where
- showOpt (FileOption f) = dosifyPath f
+ showOpt (FileOption pre f) = pre ++ dosifyPath f
showOpt (Option s) = s
#if defined(mingw32_TARGET_OS)
runSomething "Linker" p args
#ifdef ILX
-runIlx2il :: [String] -> IO ()
+runIlx2il :: [Option] -> IO ()
runIlx2il args = do p <- readIORef v_Pgm_I
runSomething "Ilx2Il" p args
-runIlasm :: [String] -> IO ()
+runIlasm :: [Option] -> IO ()
runIlasm args = do p <- readIORef v_Pgm_i
runSomething "Ilasm" p args
#endif
touch :: String -> String -> IO ()
touch purpose arg = do p <- readIORef v_Pgm_T
- runSomething purpose p [FileOption arg]
+ runSomething purpose p [FileOption "" arg]
copy :: String -> String -> String -> IO ()
copy purpose from to = do
pgmPath dir pgm = dosifyPath dir ++ '\\' : pgm
--- HACK!
-dosifyPath "\"/DLL\"" = "\"/DLL\""
-dosifyPath "\"/QUIET\"" = "\"/QUIET\""
-dosifyPath l@('"':'/':'O':'U':'T':_) = l
--- end of HACK!
dosifyPath stuff
= subst '/' '\\' real_stuff
where
getProcessID :: IO Int
getProcessID = Posix.getProcessID
#endif
+
+rawSystem :: String -> IO ExitCode
+#if __GLASGOW_HASKELL__ > 408
+rawSystem "" = ioException (IOError Nothing InvalidArgument "rawSystem" "null command" Nothing)
+rawSystem cmd =
+ withCString cmd $ \s -> do
+ status <- throwErrnoIfMinus1 "rawSystem" (primRawSystem s)
+ case status of
+ 0 -> return ExitSuccess
+ n -> return (ExitFailure n)
+
+foreign import ccall "rawSystemCmd" unsafe primRawSystem :: CString -> IO Int
+#else
+rawSystem = System.system
+#endif
+
+
\end{code}