[project @ 2004-09-01 09:43:25 by simonmar]
authorsimonmar <unknown>
Wed, 1 Sep 2004 09:43:25 +0000 (09:43 +0000)
committersimonmar <unknown>
Wed, 1 Sep 2004 09:43:25 +0000 (09:43 +0000)
Catch exit(127) result from raw system, and report that we couldn't
execute the program.  This is a semi-hack; all exec() errors get
reported as exit(127) by rawSystem, but if we treat it just like a
program that does exit(127) then the user sees no output.

ghc/compiler/main/SysTools.lhs

index a2dae88..f673c98 100644 (file)
@@ -741,9 +741,18 @@ runSomething phase_name pgm args = do
   let real_args = filter notNull (map showOpt args)
   traceCmd phase_name (unwords (pgm:real_args)) $ do
   exit_code <- rawSystem pgm real_args
-  if (exit_code /= ExitSuccess)
-       then throwDyn (PhaseFailed phase_name exit_code)
-       else return ()
+  case exit_code of
+     ExitSuccess -> 
+       return ()
+     -- rawSystem returns (ExitFailure 127) if the exec failed for any
+     -- reason (eg. the program doesn't exist).  This is the only clue
+     -- we have, but we need to report something to the user because in
+     -- the case of a missing program there will otherwise be no output
+     -- at all.
+     ExitFailure 127 -> 
+       throwDyn (InstallationError ("could not execute: " ++ pgm))
+     ExitFailure _other ->
+       throwDyn (PhaseFailed phase_name exit_code)
 
 traceCmd :: String -> String -> IO () -> IO ()
 -- a) trace the command (at two levels of verbosity)