X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FPackages.lhs;h=ef4a6e4b8e7ba4d10070425290a55f663cc53e30;hb=2d532e45924dfdb5b5157caf4d3fc3541497d86c;hp=cad3af321e550feaf09c9987614191fb35685cb7;hpb=64b344bbf1378fda2aae7294544470765c5eecaf;p=ghc-hetmet.git diff --git a/ghc/compiler/main/Packages.lhs b/ghc/compiler/main/Packages.lhs index cad3af3..ef4a6e4 100644 --- a/ghc/compiler/main/Packages.lhs +++ b/ghc/compiler/main/Packages.lhs @@ -4,67 +4,114 @@ \section{Package manipulation} \begin{code} -module Packages ( PackageConfig(..), - defaultPackageConfig, - mungePackagePaths, - showPackages - ) +module Packages ( + PackageConfig(..), + defaultPackageConfig, + packageDependents, + showPackages, + + PackageName, -- Instance of Outputable + mkPackageName, packageNameString, + basePackage, rtsPackage, haskell98Package, thPackage, -- :: PackageName + + PackageConfigMap, emptyPkgMap, lookupPkg, + extendPackageConfigMap, getPackageDetails, getPackageConfigMap, + ) where #include "HsVersions.h" -import Pretty import CmdLineOpts ( dynFlag, verbosity ) -import DriverUtil ( my_prefix_match ) import ErrUtils ( dumpIfSet ) -import Outputable ( docToSDoc, trace ) -\end{code} +import Outputable ( docToSDoc ) +import FastString +import UniqFM +import Util +import Pretty + +import DATA_IOREF + +-- ----------------------------------------------------------------------------- +-- The PackageConfig type -\begin{code} #define WANT_PRETTY --- Yes, do generate pretty-printing stuff for packages +#define INTERNAL_PRETTY +-- Yes, do generate pretty-printing stuff for packages, and use our +-- own Pretty library rather than Text.PrettyPrint -- There's a blob of code shared with ghc-pkg, -- so we just include it from there +-- Primarily it defines PackageConfig (a record) + #include "../utils/ghc-pkg/Package.hs" -\end{code} -%********************************************************* -%* * -\subsection{Load the config file} -%* * -%********************************************************* +-- ----------------------------------------------------------------------------- +-- Package names -\begin{code} -mungePackagePaths :: String -> [PackageConfig] -> [PackageConfig] --- Replace the string "$libdir" at the beginning of a path --- with the current libdir (obtained from the -B option). -mungePackagePaths top_dir ps = map munge_pkg ps - where - munge_pkg p = p{ import_dirs = munge_paths (import_dirs p), - include_dirs = munge_paths (include_dirs p), - library_dirs = munge_paths (library_dirs p) } - - munge_paths = map munge_path - - munge_path p - | Just p' <- my_prefix_match "$libdir" p = top_dir ++ p' - | otherwise = trace ("not: " ++ p) p -\end{code} +type PackageName = FastString -- No encoding at all +mkPackageName :: String -> PackageName +mkPackageName = mkFastString -%********************************************************* -%* * -\subsection{Display results} -%* * -%********************************************************* +packageNameString :: PackageName -> String +packageNameString = unpackFS -\begin{code} -showPackages :: [PackageConfig] -> IO () +rtsPackage, basePackage, haskell98Package, thPackage :: PackageName +basePackage = FSLIT("base") +rtsPackage = FSLIT("rts") +haskell98Package = FSLIT("haskell98") +thPackage = FSLIT("haskell-src") -- Template Haskell libraries in here + +packageDependents :: PackageConfig -> [PackageName] +-- Impedence matcher, because PackageConfig has Strings +-- not PackageNames at the moment. Sigh. +packageDependents pkg = map mkPackageName (package_deps pkg) + +-- ----------------------------------------------------------------------------- +-- A PackageConfigMap maps a PackageName to a PackageConfig + +type PackageConfigMap = UniqFM PackageConfig + +lookupPkg :: PackageConfigMap -> PackageName -> Maybe PackageConfig + +emptyPkgMap :: PackageConfigMap + +emptyPkgMap = emptyUFM +lookupPkg = lookupUFM + +extendPkgMap :: PackageConfigMap -> [PackageConfig] -> PackageConfigMap +extendPkgMap pkg_map new_pkgs + = foldl add pkg_map new_pkgs + where + add pkg_map p = addToUFM pkg_map (mkFastString (name p)) p + +GLOBAL_VAR(v_Package_details, emptyPkgMap, PackageConfigMap) + +getPackageConfigMap :: IO PackageConfigMap +getPackageConfigMap = readIORef v_Package_details + +extendPackageConfigMap :: [PackageConfig] -> IO () +extendPackageConfigMap pkg_configs = do + old_pkg_map <- readIORef v_Package_details + writeIORef v_Package_details (extendPkgMap old_pkg_map pkg_configs) + +getPackageDetails :: [PackageName] -> IO [PackageConfig] +getPackageDetails ps = do + pkg_details <- getPackageConfigMap + return [ pkg | Just pkg <- map (lookupPkg pkg_details) ps ] + + +-- ----------------------------------------------------------------------------- +-- Displaying packages + +showPackages :: PackageConfigMap -> IO () -- Show package info on console, if verbosity is >= 3 -showPackages ps +showPackages pkg_map = do { verb <- dynFlag verbosity ; dumpIfSet (verb >= 3) "Packages" (docToSDoc (vcat (map dumpPkgGuts ps))) } + where + ps = eltsUFM pkg_map + \end{code}