findModule, -- :: ModuleName -> IO (Maybe (Module, ModuleLocation))
findModuleDep, -- :: ModuleName -> Bool -> IO (Maybe (Module, ModuleLocation))
findPackageModule, -- :: ModuleName -> IO (Maybe (Module, ModuleLocation))
- mkHomeModuleLocn, -- :: ModuleName -> String -> Maybe FilePath
+ mkHomeModuleLocn, -- :: ModuleName -> String -> FilePath
-- -> IO ModuleLocation
emptyHomeDirCache, -- :: IO ()
flushPackageCache -- :: [PackageConfig] -> IO ()
import Packages ( PackageConfig(..) )
import DriverPhases
import DriverState
+import DriverUtil
import Module
import FastString
import Config
import Directory
import IO
import Monad
-import Outputable
\end{code}
The Finder provides a thin filesystem abstraction to the rest of the
maybeHomeModule mod_name is_source = do
home_path <- readIORef v_Import_paths
hisuf <- readIORef v_Hi_suf
+ mode <- readIORef v_GhcMode
let mod_str = moduleNameUserString mod_name
basename = map (\c -> if c == '.' then '/' else c) mod_str
- -- last chance: .hi-boot-<ver> and .hi-boot
- hi_boot_ver = "hi-boot-" ++ cHscIfaceFileVersion
- std_exts =
- [ (hisuf,
- \ _ fName path -> mkHiOnlyModuleLocn mod_name fName)
- , ("hs",
- \ _ fName path -> mkHomeModuleLocn mod_name path (Just fName))
- , ("lhs",
- \ _ fName path -> mkHomeModuleLocn mod_name path (Just fName))
- ]
+ -- In compilation manager modes, we look for source files in the home
+ -- package because we can compile these automatically. In one-shot
+ -- compilation mode we look for .hi files only.
+ --
+ -- When generating dependencies, we're interested in either category.
+ --
+ source_exts =
+ [ ("hs", \ _ fName path -> mkHomeModuleLocn mod_name path fName)
+ , ("lhs", \ _ fName path -> mkHomeModuleLocn mod_name path fName)
+ ]
+ hi_exts = [ (hisuf, \ _ fName path -> mkHiOnlyModuleLocn mod_name fName) ]
+
+ std_exts
+ | mode == DoMkDependHS = hi_exts ++ source_exts
+ | isCompManagerMode mode = source_exts
+ | otherwise = hi_exts
+
+ -- last chance: .hi-boot-<ver> and .hi-boot
+ hi_boot_ver = "hi-boot-" ++ cHscIfaceFileVersion
boot_exts =
- [ (hi_boot_ver, \ _ fName path -> mkHiOnlyModuleLocn mod_name fName)
- , ("hi-boot", \ _ fName path -> mkHiOnlyModuleLocn mod_name fName)
- ]
+ [ (hi_boot_ver, \ _ fName path -> mkHiOnlyModuleLocn mod_name fName)
+ , ("hi-boot", \ _ fName path -> mkHiOnlyModuleLocn mod_name fName)
+ ]
searchPathExts
- (map ((,) undefined) home_path)
- basename
- (if is_source then (boot_exts++std_exts) else std_exts ++ boot_exts)
+ (map ((,) undefined) home_path)
+ basename
+ (if is_source then (boot_exts++std_exts) else std_exts ++ boot_exts)
-- for SOURCE imports, check the hi-boot extensions
-- before the source/iface ones, to avoid
-- creating circ Makefile deps.
-- 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 maybe_source_fn = do
+mkHomeModuleLocn mod_name
+ basename -- everything but the extension
+ source_fn -- full path to the source (required)
+ = do
hisuf <- readIORef v_Hi_suf
hidir <- readIORef v_Hi_dir
- let hi_rest = basename ++ '.':hisuf
- hi_file | Just d <- hidir = d ++ '/':hi_rest
- | otherwise = hi_rest
+ -- take the *last* component of the module name (if a hierarchical name),
+ -- and append it to the directory to get the .hi file name.
+ let (_,mod_str) = split_longest_prefix (moduleNameUserString mod_name) (=='.')
+ hi_filename = mod_str ++ '.':hisuf
+ hi_path | Just d <- hidir = d
+ | otherwise = getdir basename
+ hi = hi_path ++ '/':hi_filename
-- figure out the .o file name. It also lives in the same dir
-- as the source, but can be overriden by a -odir flag.
return (mkHomeModule mod_name,
ModuleLocation{ ml_hspp_file = Nothing
- , ml_hs_file = maybe_source_fn
- , ml_hi_file = hi_file
+ , ml_hs_file = Just source_fn
+ , ml_hi_file = hi
, ml_obj_file = Just o_file
})
let imp_dirs = concatMap (\ pkg -> map ((,) pkg) (import_dirs pkg)) pkgs
mod_str = moduleNameUserString mod_name
basename = map (\c -> if c == '.' then '/' else c) mod_str
+
+ mkPackageModule mod_name pkg mbFName path =
+ return ( mkModule mod_name (mkFastString (name pkg))
+ , ModuleLocation{ ml_hspp_file = Nothing
+ , ml_hs_file = mbFName
+ , ml_hi_file = path ++ '.':package_hisuf
+ , ml_obj_file = Nothing
+ })
+
searchPathExts
imp_dirs basename
((package_hisuf,\ pkg fName path -> mkPackageModule mod_name pkg Nothing path) :
, ("lhs", \ pkg fName path -> mkPackageModule mod_name pkg (Just fName) path)
]))
where
- mkPackageModule mod_name pkg mbFName path =
- return ( mkModule mod_name (mkFastString (name pkg))
- , ModuleLocation{ ml_hspp_file = Nothing
- , ml_hs_file = mbFName
- , ml_hi_file = path ++".hi"
- , ml_obj_file = Nothing
- })
findPackageModule :: ModuleName -> IO (Maybe (Module, ModuleLocation))
findPackageModule mod_name = findPackageMod mod_name True