diff --git a/ghc/compiler/main/SysTools.lhs b/ghc/compiler/main/SysTools.lhs index a2dae88f1b79065122ce103e32fb77f1fb184d54..f673c9874fd0738f9e08f74bd364f28d453cff53 100644 --- a/ghc/compiler/main/SysTools.lhs +++ b/ghc/compiler/main/SysTools.lhs @@ -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)