#include "HsVersions.h"
import DriverPipeline ( CompResult(..), preprocess, compile, link )
-import DriverState ( v_Output_file )
+import DriverState ( v_Output_file, v_NoHsMain )
import DriverPhases
import DriverUtil
import Finder
_not_a_home_module -> do
maybe_stuff <- findModule mn
case maybe_stuff of
- Nothing -> throwDyn (CmdLineError ("can't find module `"
+ Left _ -> throwDyn (CmdLineError ("can't find module `"
++ moduleNameUserString mn ++ "'"))
- Just (m,_) -> return m
+ Right (m,_) -> return m
cmGetContext :: CmState -> IO ([String],[String])
cmGetContext CmState{ic=ic} =
-- clean up after ourselves
cleanTempFilesExcept verb (ppFilesFromSummaries modsDone)
- -- issue a warning for the confusing case where the user said '-o foo'
- -- but we're not going to do any linking.
ofile <- readIORef v_Output_file
- when (ghci_mode == Batch && isJust ofile && not a_root_is_Main
+ no_hs_main <- readIORef v_NoHsMain
+
+ -- Issue a warning for the confusing case where the user
+ -- said '-o foo' but we're not going to do any linking.
+ -- We attempt linking if either (a) one of the modules is
+ -- called Main, or (b) the user said -no-hs-main, indicating
+ -- that main() is going to come from somewhere else.
+ --
+ let do_linking = a_root_is_Main || no_hs_main
+ when (ghci_mode == Batch && isJust ofile && not do_linking
&& verb > 0) $
hPutStrLn stderr "Warning: output was redirected with -o, but no output will be generated\nbecause there is no Main module."
-- link everything together
- linkresult <- link ghci_mode dflags a_root_is_Main hpt3
+ linkresult <- link ghci_mode dflags do_linking hpt3
cmLoadFinish Succeeded linkresult
hpt3 modsDone ghci_mode pcs3
return (new_cmstate, ok, mods_loaded)
--- used to fish out the preprocess output files for the purposes
--- of cleaning up.
+-- used to fish out the preprocess output files for the purposes of
+-- cleaning up. The preprocessed file *might* be the same as the
+-- source file, but that doesn't do any harm.
ppFilesFromSummaries summaries
- = [ fn | Just fn <- map toPpFile summaries ]
- where
- toPpFile sum
- | hspp /= ml_hs_file loc = hspp
- | otherwise = Nothing
- where
- loc = ms_location sum
- hspp = ml_hspp_file loc
-
+ = [ fn | Just fn <- map (ml_hspp_file.ms_location) summaries ]
-----------------------------------------------------------------------------
-- getValidLinkables
getSummary (currentMod,nm)
= do found <- findModule nm
case found of
- Just (mod, location) -> do
+ Right (mod, location) -> do
let old_summary = findModInSummaries old_summaries mod
summarise mod location old_summary
- Nothing ->
- throwDyn (CmdLineError
- ("can't find module `"
- ++ showSDoc (ppr nm) ++ "' (while processing "
- ++ show currentMod ++ ")"))
+ Left files -> do
+ dflags <- getDynFlags
+ throwDyn (noModError dflags currentMod nm files)
-- loop invariant: env doesn't contain package modules
loop :: [(FilePath,ModuleName)] -> ModuleEnv ModSummary -> IO [ModSummary]
loop new_imps (extendModuleEnvList env
[ (ms_mod s, s) | s <- new_home_summaries ])
+-- ToDo: we don't have a proper line number for this error
+noModError dflags loc mod_nm files = ProgramError (showSDoc (
+ hang (text loc <> colon) 4 $
+ (text "Can't find module" <+> quotes (ppr mod_nm) $$ extra)
+ ))
+ where
+ extra
+ | verbosity dflags < 3 =
+ text "(use -v to see a list of the files searched for)"
+ | otherwise =
+ hang (ptext SLIT("locations searched:")) 4 (vcat (map text files))
+
-----------------------------------------------------------------------------
-- Summarising modules
= do hspp_fn <- preprocess file
(srcimps,imps,mod_name) <- getImportsFromFile hspp_fn
- let (path, basename, ext) = splitFilename3 file
- -- GHC.Prim doesn't exist physically, so don't go looking for it.
+ let -- GHC.Prim doesn't exist physically, so don't go looking for it.
the_imps = filter (/= gHC_PRIM_Name) imps
- (mod, location) <- mkHomeModLocation mod_name True{-is a root-}
- path basename ext
+ (mod, location) <- mkHomeModLocation mod_name file
src_timestamp
<- case ml_hs_file location of