X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FcompMan%2FCompManager.lhs;h=1722ddcd47d89bc138ebf726cfcccb7ad4b894e2;hb=17b0047a49fcdd62f2c3c2f09e3745b091350050;hp=044b1d0c951a9a24f222b5c3d37e0801539723ad;hpb=854ab9a44c4f9a9cb6239bb0af14c150b0e454c6;p=ghc-hetmet.git diff --git a/ghc/compiler/compMan/CompManager.lhs b/ghc/compiler/compMan/CompManager.lhs index 044b1d0..1722ddc 100644 --- a/ghc/compiler/compMan/CompManager.lhs +++ b/ghc/compiler/compMan/CompManager.lhs @@ -57,7 +57,7 @@ where #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 @@ -232,9 +232,9 @@ moduleNameToModule hpt mn = do _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} = @@ -638,15 +638,22 @@ cmLoadModules cmstate1 dflags mg2unsorted -- 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 @@ -698,18 +705,11 @@ cmLoadFinish ok Succeeded hpt mods ghci_mode pcs 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 @@ -1162,15 +1162,13 @@ downsweep roots old_summaries 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] @@ -1191,6 +1189,18 @@ downsweep roots old_summaries 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 @@ -1209,12 +1219,10 @@ summariseFile file = 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