- SysTools.runCpp ([verb]
- ++ include_paths
- ++ hs_src_cpp_opts
- ++ hscpp_opts
- ++ md_c_flags
- ++ [ "-x", "c", input_fn, "-o", output_fn ])
-
- -- ToDo: switch away from using 'echo' altogether (but need
- -- a faster alternative than what's done below).
-#if defined(mingw32_TARGET_OS) && defined(MINIMAL_UNIX_DEPS)
- else (do
- h <- openFile output_fn WriteMode
- hPutStrLn h ("{-# LINE 1 \"" ++ input_fn ++ "\" #-}")
- ls <- readFile input_fn -- inefficient, but it'll do for now.
- -- ToDo: speed up via slurping.
- hPutStrLn h ls
- hClose h) `catchAllIO`
- (\_ -> throwDyn (PhaseFailed "Ineffective C pre-processor" (ExitFailure 1)))
-#else
- else do
- SysTools.runSomething "Ineffective C pre-processor"
- ("echo '{-# LINE 1 \"" ++ input_fn ++ "\" #-}' > "
- ++ output_fn ++ " && cat " ++ input_fn
- ++ " >> " ++ output_fn) []
-#endif
- return True
+ SysTools.runCpp ([SysTools.Option verb]
+ ++ map SysTools.Option include_paths
+ ++ map SysTools.Option hs_src_cpp_opts
+ ++ map SysTools.Option hscpp_opts
+ ++ map SysTools.Option md_c_flags
+ ++ [ SysTools.Option "-x"
+ , SysTools.Option "c"
+ , SysTools.Option input_fn
+ -- We hackily use Option instead of FileOption here, so that the file
+ -- name is not back-slashed on Windows. cpp is capable of
+ -- dealing with / in filenames, so it works fine. Furthermore
+ -- if we put in backslashes, cpp outputs #line directives
+ -- with *double* backslashes. And that in turn means that
+ -- our error messages get double backslashes in them.
+ -- In due course we should arrange that the lexer deals
+ -- with these \\ escapes properly.
+ , SysTools.Option "-o"
+ , SysTools.FileOption "" output_fn
+ ])
+ return (Just output_fn)
+
+-------------------------------------------------------------------------------
+-- HsPp phase
+run_phase HsPp basename suff input_fn output_fn
+ = do src_opts <- getOptionsFromSource input_fn
+ unhandled_flags <- processArgs dynamic_flags src_opts []
+ checkProcessArgsResult unhandled_flags basename suff
+
+ let orig_fn = basename ++ '.':suff
+ do_pp <- dynFlag ppFlag
+ if not do_pp then
+ -- no need to preprocess, just pass input file along
+ -- to the next phase of the pipeline.
+ return (Just input_fn)
+ else do
+ hspp_opts <- getOpts opt_F
+ hs_src_pp_opts <- readIORef v_Hs_source_pp_opts
+ SysTools.runPp ( [ SysTools.Option orig_fn
+ , SysTools.Option input_fn
+ , SysTools.FileOption "" output_fn
+ ] ++
+ map SysTools.Option hs_src_pp_opts ++
+ map SysTools.Option hspp_opts
+ )
+ return (Just output_fn)