projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[project @ 2001-03-23 16:36:20 by simonmar]
[ghc-hetmet.git]
/
ghc
/
compiler
/
main
/
Finder.lhs
diff --git
a/ghc/compiler/main/Finder.lhs
b/ghc/compiler/main/Finder.lhs
index
387864f
..
4e4844d
100644
(file)
--- a/
ghc/compiler/main/Finder.lhs
+++ b/
ghc/compiler/main/Finder.lhs
@@
-5,8
+5,10
@@
\begin{code}
module Finder (
\begin{code}
module Finder (
- initFinder, -- :: PackageConfigInfo -> IO (),
+ initFinder, -- :: [PackageConfig] -> IO (),
findModule, -- :: ModuleName -> IO (Maybe (Module, ModuleLocation))
findModule, -- :: ModuleName -> IO (Maybe (Module, ModuleLocation))
+ mkHomeModuleLocn, -- :: ModuleName -> String -> FilePath
+ -- -> IO ModuleLocation
emptyHomeDirCache -- :: IO ()
) where
emptyHomeDirCache -- :: IO ()
) where
@@
-16,6
+18,7
@@
import HscTypes ( ModuleLocation(..) )
import CmStaticInfo
import DriverPhases
import DriverState
import CmStaticInfo
import DriverPhases
import DriverState
+import DriverUtil
import Module
import FiniteMap
import Util
import Module
import FiniteMap
import Util
@@
-27,7
+30,7
@@
import Directory
import List
import IO
import Monad
import List
import IO
import Monad
-import Outputable ( showSDoc, ppr ) -- debugging only
+import Outputable
\end{code}
The Finder provides a thin filesystem abstraction to the rest of the
\end{code}
The Finder provides a thin filesystem abstraction to the rest of the
@@
-46,7
+49,7
@@
GLOBAL_VAR(v_PkgDirCache, panic "no pkg cache!",
GLOBAL_VAR(v_HomeDirCache, Nothing, Maybe (FiniteMap String FilePath))
GLOBAL_VAR(v_HomeDirCache, Nothing, Maybe (FiniteMap String FilePath))
-initFinder :: PackageConfigInfo -> IO ()
+initFinder :: [PackageConfig] -> IO ()
initFinder pkgs
= do { -- expunge our home cache
; writeIORef v_HomeDirCache Nothing
initFinder pkgs
= do { -- expunge our home cache
; writeIORef v_HomeDirCache Nothing
@@
-87,36
+90,50
@@
maybeHomeModule mod_name = do
Just home_map -> return home_map
Just home_map -> return home_map
- let basename = moduleNameUserString mod_name
+ let basename = moduleNameUserString mod_name
hs = basename ++ ".hs"
lhs = basename ++ ".lhs"
case lookupFM home_map hs of {
hs = basename ++ ".hs"
lhs = basename ++ ".lhs"
case lookupFM home_map hs of {
- Just path -> mkHomeModuleLocn mod_name (path ++ '/':basename) hs;
+ -- special case to avoid getting "./foo.hs" all the time
+ Just "." -> mkHomeModuleLocn mod_name basename hs;
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':hs);
Nothing ->
case lookupFM home_map lhs of {
Nothing ->
case lookupFM home_map lhs of {
- Just path -> mkHomeModuleLocn mod_name (path ++ '/':basename) lhs;
+ -- special case to avoid getting "./foo.hs" all the time
+ Just "." -> mkHomeModuleLocn mod_name 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 {
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) hs;
+ Just path -> mkHomeModuleLocn mod_name
+ (path ++ '/':basename) (path ++ '/':hs);
Nothing -> do
Nothing -> do
- -- last chance: .hi-boot and .hi-boot-<ver>
+ -- last chance: .hi-boot-<ver> and .hi-boot
let hi_boot = basename ++ ".hi-boot"
let hi_boot_ver = basename ++ ".hi-boot-" ++ cHscIfaceFileVersion
let hi_boot = basename ++ ".hi-boot"
let hi_boot_ver = basename ++ ".hi-boot-" ++ cHscIfaceFileVersion
- case lookupFM home_map hi_boot of {
- Just path -> mkHomeModuleLocn mod_name (path ++ '/':basename) hs;
- Nothing -> do
case lookupFM home_map hi_boot_ver of {
case lookupFM home_map hi_boot_ver of {
- Just path -> mkHomeModuleLocn mod_name (path ++ '/':basename) hs;
+ 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
}}}}}
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
-- figure out the .hi file name: it lives in the same dir as the
mkHomeModuleLocn mod_name basename source_fn = do
-- figure out the .hi file name: it lives in the same dir as the
@@
-124,7
+141,9
@@
mkHomeModuleLocn mod_name basename source_fn = do
ohi <- readIORef v_Output_hi
hisuf <- readIORef v_Hi_suf
let hifile = case ohi of
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
Just fn -> fn
-- figure out the .o file name. It also lives in the same dir
@@
-141,15
+160,14
@@
mkHomeModuleLocn mod_name basename source_fn = do
))
))
-newPkgCache :: [Package] -> IO (FiniteMap String (PackageName, FilePath))
+newPkgCache :: [PackageConfig] -> IO (FiniteMap String (PackageName, FilePath))
newPkgCache pkgs = do
let extendFM fm pkg = do
let dirs = import_dirs pkg
pkg_name = _PK_ (name pkg)
let addDir fm dir = do
contents <- getDirectoryContents' dir
newPkgCache pkgs = do
let extendFM fm pkg = do
let dirs = import_dirs pkg
pkg_name = _PK_ (name pkg)
let addDir fm dir = do
contents <- getDirectoryContents' dir
- let clean_contents = filter isUsefulFile contents
- return (addListToFM fm (zip clean_contents
+ return (addListToFM fm (zip contents
(repeat (pkg_name,dir))))
foldM addDir fm dirs
(repeat (pkg_name,dir))))
foldM addDir fm dirs
@@
-168,7
+186,7
@@
maybePackageModule mod_name = do
then return "hi"
else return (tag ++ "_hi")
then return "hi"
else return (tag ++ "_hi")
- let basename = moduleNameString mod_name
+ let basename = moduleNameUserString mod_name
hi = basename ++ '.':package_hisuf
case lookupFM pkg_cache hi of
hi = basename ++ '.':package_hisuf
case lookupFM pkg_cache hi of
@@
-193,5
+211,5
@@
getDirectoryContents' d
("WARNING: error while reading directory " ++ d)
return []
)
("WARNING: error while reading directory " ++ d)
return []
)
-
+
\end{code}
\end{code}