-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 (name_of_summary 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
- keep_il <- readIORef v_Keep_il_files
- 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)