2 % (c) The University of Glasgow, 2000
4 \section{Package manipulation}
10 mungePackagePaths, packageDependents,
13 PackageName, -- Instance of Outputable
14 mkPackageName, packageNameString,
15 basePackage, rtsPackage, haskell98Package, thPackage, -- :: PackageName
17 PackageConfigMap, emptyPkgMap, extendPkgMap, lookupPkg
21 #include "HsVersions.h"
25 import CmdLineOpts ( dynFlag, verbosity )
26 import DriverUtil ( my_prefix_match )
27 import ErrUtils ( dumpIfSet )
28 import Outputable ( docToSDoc )
33 %*********************************************************
35 \subsection{Basic data types}
37 %*********************************************************
41 #define INTERNAL_PRETTY
42 -- Yes, do generate pretty-printing stuff for packages, and use our
43 -- own Pretty library rather than Text.PrettyPrint
45 -- There's a blob of code shared with ghc-pkg,
46 -- so we just include it from there
47 -- Primarily it defines
48 -- PackageConfig (a record)
49 -- PackageName (FastString)
51 #include "../utils/ghc-pkg/Package.hs"
55 type PackageName = FastString -- No encoding at all
57 mkPackageName :: String -> PackageName
58 mkPackageName = mkFastString
60 packageNameString :: PackageName -> String
61 packageNameString = unpackFS
63 rtsPackage, basePackage, haskell98Package, thPackage :: PackageName
64 basePackage = FSLIT("base")
65 rtsPackage = FSLIT("rts")
66 haskell98Package = FSLIT("haskell98")
67 thPackage = FSLIT("haskell-src") -- Template Haskell libraries in here
69 packageDependents :: PackageConfig -> [PackageName]
70 -- Impedence matcher, because PackageConfig has Strings
71 -- not PackageNames at the moment. Sigh.
72 packageDependents pkg = map mkPackageName (package_deps pkg)
75 A PackageConfigMap maps a PackageName to a PackageConfig
78 type PackageConfigMap = UniqFM PackageConfig
80 lookupPkg :: PackageConfigMap -> PackageName -> Maybe PackageConfig
81 emptyPkgMap :: PackageConfigMap
83 emptyPkgMap = emptyUFM
86 extendPkgMap :: PackageConfigMap -> [PackageConfig] -> PackageConfigMap
87 extendPkgMap pkg_map new_pkgs
88 = foldl add pkg_map new_pkgs
90 add pkg_map p = addToUFM pkg_map (mkFastString (name p)) p
93 %*********************************************************
95 \subsection{Load the config file}
97 %*********************************************************
100 mungePackagePaths :: String -> [PackageConfig] -> [PackageConfig]
101 -- Replace the string "$libdir" at the beginning of a path
102 -- with the current libdir (obtained from the -B option).
103 mungePackagePaths top_dir ps = map munge_pkg ps
105 munge_pkg p = p{ import_dirs = munge_paths (import_dirs p),
106 include_dirs = munge_paths (include_dirs p),
107 library_dirs = munge_paths (library_dirs p),
108 framework_dirs = munge_paths (framework_dirs p) }
110 munge_paths = map munge_path
113 | Just p' <- my_prefix_match "$libdir" p = top_dir ++ p'
118 %*********************************************************
120 \subsection{Display results}
122 %*********************************************************
125 showPackages :: PackageConfigMap -> IO ()
126 -- Show package info on console, if verbosity is >= 3
128 = do { verb <- dynFlag verbosity
129 ; dumpIfSet (verb >= 3) "Packages"
130 (docToSDoc (vcat (map dumpPkgGuts ps)))