------------------------------------------------------------------------------
--- Just preprocess a file, put the result in a temp. file (used by the
--- compilation manager during the summary phase).
-
-preprocess :: FilePath -> IO FilePath
-preprocess filename =
- ASSERT(haskellish_src_file filename)
- do restoreDynFlags -- Restore to state of last save
- let fInfo = (filename, getFileSuffix filename)
- pipeline <- genPipeline (StopBefore Hsc) ("preprocess") False
- defaultHscLang fInfo
- (fn,_) <- runPipeline pipeline fInfo
- False{-no linking-} False{-no -o flag-}
- return fn
-
------------------------------------------------------------------------------
--- Compile a single module, under the control of the compilation manager.
---
--- This is the interface between the compilation manager and the
--- compiler proper (hsc), where we deal with tedious details like
--- reading the OPTIONS pragma from the source file, and passing the
--- output of hsc through the C compiler.
-
--- The driver sits between 'compile' and 'hscMain', translating calls
--- to the former into calls to the latter, and results from the latter
--- into results from the former. It does things like preprocessing
--- the .hs file if necessary, and compiling up the .stub_c files to
--- generate Linkables.
-
--- NB. No old interface can also mean that the source has changed.
-
-compile :: GhciMode -- distinguish batch from interactive
- -> ModSummary -- summary, including source
- -> Bool -- True <=> source unchanged
- -> Bool -- True <=> have object
- -> Maybe ModIface -- old interface, if available
- -> HomeSymbolTable -- for home module ModDetails
- -> HomeIfaceTable -- for home module Ifaces
- -> PersistentCompilerState -- persistent compiler state
- -> IO CompResult
-
-data CompResult
- = CompOK PersistentCompilerState -- updated PCS
- ModDetails -- new details (HST additions)
- ModIface -- new iface (HIT additions)
- (Maybe Linkable)
- -- new code; Nothing => compilation was not reqd
- -- (old code is still valid)
-
- | CompErrs PersistentCompilerState -- updated PCS
-
-
-compile ghci_mode summary source_unchanged have_object
- old_iface hst hit pcs = do
- dyn_flags <- restoreDynFlags -- Restore to the state of the last save
-
-
- showPass dyn_flags
- (showSDoc (text "Compiling" <+> ppr (modSummaryName summary)))
-
- let verb = verbosity dyn_flags
- let location = ms_location summary
- let input_fn = unJust "compile:hs" (ml_hs_file location)
- let input_fnpp = unJust "compile:hspp" (ml_hspp_file location)
-
- when (verb >= 2) (hPutStrLn stderr ("compile: input file " ++ input_fnpp))
-
- opts <- getOptionsFromSource input_fnpp
- processArgs dynamic_flags opts []
- dyn_flags <- getDynFlags
-
- let hsc_lang = hscLang dyn_flags
- (basename, _) = splitFilename input_fn
-
- keep_hc <- readIORef v_Keep_hc_files
-#ifdef ILX
- keep_il <- readIORef v_Keep_il_files
-#endif
- keep_s <- readIORef v_Keep_s_files
-
- output_fn <-
- case hsc_lang of
- HscAsm | keep_s -> return (basename ++ '.':phaseInputExt As)
- | otherwise -> newTempName (phaseInputExt As)
- HscC | keep_hc -> return (basename ++ '.':phaseInputExt HCc)
- | otherwise -> newTempName (phaseInputExt HCc)
- HscJava -> newTempName "java" -- ToDo
-#ifdef ILX
- HscILX | keep_il -> return (basename ++ '.':phaseInputExt Ilasm)
- | otherwise -> newTempName (phaseInputExt Ilx2Il)
-#endif
- HscInterpreted -> return (error "no output file")
- HscNothing -> return (error "no output file")
-
- let dyn_flags' = dyn_flags { hscOutName = output_fn,
- hscStubCOutName = basename ++ "_stub.c",
- hscStubHOutName = basename ++ "_stub.h",
- extCoreName = basename ++ ".hcr" }
-
- -- 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
-
- -- -no-recomp should also work with --make
- do_recomp <- readIORef v_Recomp
- let source_unchanged' = source_unchanged && do_recomp
-
- -- run the compiler
- hsc_result <- hscMain ghci_mode dyn_flags'
- (ms_mod summary) location
- source_unchanged' have_object old_iface hst hit pcs
-
- case hsc_result of
- HscFail pcs -> return (CompErrs pcs)
-
- HscNoRecomp pcs details iface -> return (CompOK pcs details iface Nothing)