-----------------------------------------------------------------------------
--- $Id: DriverPipeline.hs,v 1.62 2001/03/28 16:51:03 simonmar Exp $
+-- $Id: DriverPipeline.hs,v 1.70 2001/05/25 12:09:43 simonpj Exp $
--
-- GHC Driver
--
keep_hc <- readIORef v_Keep_hc_files
keep_raw_s <- readIORef v_Keep_raw_s_files
keep_s <- readIORef v_Keep_s_files
-#ifdef ILX
- writeIORef v_Object_suf (Just "ilx")
-#endif
osuf <- readIORef v_Object_suf
+ hcsuf <- readIORef v_HC_suf
let
----------- ----- ---- --- -- -- - - -
cish = cish_suffix suffix
-- for a .hc file we need to force lang to HscC
- real_lang | start_phase == HCc = HscC
- | otherwise = lang
+ real_lang | start_phase == HCc || start_phase == Mangle = HscC
+ | otherwise = lang
let
----------- ----- ---- --- -- -- - - -
HscJava | split -> not_valid
| otherwise -> error "not implemented: compiling via Java"
-#ifdef ILX
HscILX | split -> not_valid
| otherwise -> [ Unlit, Cpp, Hsc ]
-#endif
| cish = [ Cc, As ]
else do
let
- ----------- ----- ---- --- -- -- - - -
- myPhaseInputExt Ln = case osuf of Nothing -> phaseInputExt Ln
- Just s -> s
- myPhaseInputExt other = phaseInputExt other
+ -- .o and .hc suffixes can be overriden by command-line options:
+ myPhaseInputExt Ln | Just s <- osuf = s
+ myPhaseInputExt HCc | Just s <- hcsuf = s
+ myPhaseInputExt other = phaseInputExt other
annotatePipeline
:: [Phase] -- raw pipeline
src <- readFile input_fn
let (import_sources, import_normals, module_name) = getImports src
- deps_sources <- mapM (findDependency True src) import_sources
- deps_normals <- mapM (findDependency False src) import_normals
+ let orig_fn = basename ++ '.':suff
+ deps_sources <- mapM (findDependency True orig_fn) import_sources
+ deps_normals <- mapM (findDependency False orig_fn) import_normals
let deps = deps_sources ++ deps_normals
osuf_opt <- readIORef v_Object_suf
cmdline_includes <- dynFlag cmdlineHcIncludes -- -#include options
let cc_injects = unlines (map mk_include
- (c_includes ++ reverse cmdline_includes))
+ (c_includes ++ reverse cmdline_includes))
mk_include h_file =
case h_file of
'"':_{-"-} -> "#include "++h_file
else return False
-- build a ModuleLocation to pass to hscMain.
- modsrc <- readFile input_fn
- let (srcimps,imps,mod_name) = getImports modsrc
+ (srcimps,imps,mod_name) <- getImportsFromFile input_fn
Just (mod, location)
<- mkHomeModuleLocn mod_name basename (basename ++ '.':suff)
preprocess :: FilePath -> IO FilePath
preprocess filename =
- ASSERT(haskellish_file filename)
+ ASSERT(haskellish_src_file filename)
do init_dyn_flags <- readIORef v_InitDynFlags
writeIORef v_DynFlags init_dyn_flags
pipeline <- genPipeline (StopBefore Hsc) ("preprocess") False
dyn_flags <- readIORef v_DynFlags
let hsc_lang = hscLang dyn_flags
+ (basename, _) = splitFilename input_fn
+
output_fn <- case hsc_lang of
HscAsm -> newTempName (phaseInputExt As)
HscC -> newTempName (phaseInputExt HCc)
HscJava -> newTempName "java" -- ToDo
-#ifdef ILX
- HscILX -> newTempName "ilx" -- ToDo
-#endif
+ HscILX -> return (basename ++ ".ilx") -- newTempName "ilx" -- ToDo
HscInterpreted -> return (error "no output file")
- let (basename, _) = splitFilename input_fn
- dyn_flags' = dyn_flags { hscOutName = output_fn,
+ let dyn_flags' = dyn_flags { hscOutName = output_fn,
hscStubCOutName = basename ++ "_stub.c",
hscStubHOutName = basename ++ "_stub.h" }
+ -- figure out which header files to #include in a generated .hc file
+ c_includes <- getPackageCIncludes
+ cmdline_includes <- dynFlag cmdlineHcIncludes -- -#include options
+
+ let cc_injects = unlines (map mk_include
+ (c_includes ++ reverse cmdline_includes))
+ mk_include h_file =
+ case h_file of
+ '"':_{-"-} -> "#include "++h_file
+ '<':_ -> "#include "++h_file
+ _ -> "#include \""++h_file++"\""
+
+ writeIORef v_HCHeader cc_injects
+
-- run the compiler
hsc_result <- hscMain ghci_mode dyn_flags'
(ms_mod summary) location