module Finder (
initFinder, -- :: PackageConfigInfo -> IO (),
findModule, -- :: ModuleName -> IO (Maybe (Module, ModuleLocation))
+ mkHomeModuleLocn, -- :: ModuleName -> String -> FilePath
+ -- -> IO ModuleLocation
emptyHomeDirCache -- :: IO ()
) where
import CmStaticInfo
import DriverPhases
import DriverState
+import DriverUtil
import Module
import FiniteMap
import Util
import Panic ( panic )
+import Config
import IOExts
import Directory
; writeIORef v_HomeDirCache Nothing
-- lazilly fill in the package cache
; writeIORef v_PkgDirCache (unsafePerformIO (newPkgCache pkgs))
-
--- Debug output
--- ; pkg_dbg_info <- readIORef v_PkgDirCache
--- ; putStrLn (unlines (map show (fmToList pkg_dbg_info)))
}
emptyHomeDirCache :: IO ()
findModule :: ModuleName -> IO (Maybe (Module, ModuleLocation))
findModule name
- = do { hPutStr stderr ("findModule: " ++ moduleNameUserString name ++ " ... ")
- ; maybe_m <- findModule_wrk name
- ; case maybe_m of
- Nothing -> hPutStrLn stderr "Not Found"
- Just mm -> hPutStrLn stderr (showSDoc (ppr (snd mm)))
- ; return maybe_m
- }
-
-findModule_wrk :: ModuleName -> IO (Maybe (Module, ModuleLocation))
-findModule_wrk name
= do { j <- maybeHomeModule name
; case j of
Just home_module -> return (Just home_module)
Just home_map -> return home_map
- let basename = moduleNameString mod_name
+ let basename = moduleNameUserString mod_name
hs = basename ++ ".hs"
lhs = basename ++ ".lhs"
case lookupFM home_map hs of {
- Just path -> mkHomeModuleLocn mod_name (path ++ '/':basename) hs;
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':hs);
Nothing ->
case lookupFM home_map lhs of {
- Just path -> mkHomeModuleLocn mod_name (path ++ '/':basename) lhs;
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':lhs);
+ Nothing -> do
+
+ -- can't find a source file anywhere, check for a lone .hi file.
+ hisuf <- readIORef v_Hi_suf
+ let hi = basename ++ '.':hisuf
+ case lookupFM home_map hi of {
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':hs);
+ Nothing -> do
+
+ -- last chance: .hi-boot-<ver> and .hi-boot
+ let hi_boot = basename ++ ".hi-boot"
+ let hi_boot_ver = basename ++ ".hi-boot-" ++ cHscIfaceFileVersion
+ case lookupFM home_map hi_boot_ver of {
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':hs);
+ Nothing -> do
+ case lookupFM home_map hi_boot of {
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':hs);
Nothing -> return Nothing
+ }}}}}
+
- }}
+-- The .hi file always follows the module name, whereas the object
+-- file may follow the name of the source file in the case where the
+-- two differ (see summariseFile in compMan/CompManager.lhs).
mkHomeModuleLocn mod_name basename source_fn = do
ohi <- readIORef v_Output_hi
hisuf <- readIORef v_Hi_suf
let hifile = case ohi of
- Nothing -> basename ++ '.':hisuf
+ Nothing -> getdir basename
+ ++ '/':moduleNameUserString mod_name
+ ++ '.':hisuf
Just fn -> fn
-- figure out the .o file name. It also lives in the same dir