c43fd6e4e595b1da37cce9cccbba240e15fc28b7
[ghc-hetmet.git] / ghc / utils / ghc-pkg / Package.hs
1 -----------------------------------------------------------------------------
2 --
3 -- (c) The University of Glasgow 2004
4 --
5 -- BACKWARDS COMPATIBILITY only.  This is the old (pre-6.4) package
6 -- configuration type, which is still accepted by ghc-pkg for
7 -- compatibility.  The new type is InstalledPackageInfo from the
8 -- Distribution.InstalledPackageInfo module.
9 --
10 -----------------------------------------------------------------------------
11
12 module Package ( 
13         PackageConfig(..), defaultPackageConfig
14         , listPkgs              -- :: [PackageConfig] -> String
15         , dumpPackages          -- :: [PackageConfig] -> String
16         , dumpPkgGuts           -- :: PackageConfig -> Doc
17         , dumpFieldContents     -- :: [String] -> Doc
18  ) where
19
20 #if __GLASGOW_HASKELL__ >= 504 && !defined(INTERNAL_PRETTY)
21 import Text.PrettyPrint
22 #else
23 import Pretty
24 #endif
25
26 data PackageConfig
27    = Package {
28         name            :: String,
29         auto            :: Bool,
30         import_dirs     :: [String],
31         source_dirs     :: [String],
32         library_dirs    :: [String],
33         hs_libraries    :: [String],
34         extra_libraries :: [String],
35         include_dirs    :: [String],
36         c_includes      :: [String],
37         package_deps    :: [String],
38         extra_ghc_opts  :: [String],
39         extra_cc_opts   :: [String],
40         extra_ld_opts   :: [String],
41         framework_dirs  :: [String], -- ignored everywhere but on Darwin/MacOS X
42         extra_frameworks:: [String]  -- ignored everywhere but on Darwin/MacOS X
43      }
44
45 defaultPackageConfig
46    = Package {
47         name = error "defaultPackage",
48         auto = False,
49         import_dirs     = [],
50         source_dirs     = [],
51         library_dirs    = [],
52         hs_libraries    = [],
53         extra_libraries = [],
54         include_dirs    = [],
55         c_includes      = [],
56         package_deps    = [],
57         extra_ghc_opts  = [],
58         extra_cc_opts   = [],
59         extra_ld_opts   = [],
60         framework_dirs  = [],
61         extra_frameworks= []
62     }
63
64 -----------------------------------------------------------------------------
65 -- Pretty printing package info
66
67 listPkgs :: [PackageConfig] -> String
68 listPkgs pkgs = render (fsep (punctuate comma (map (text . name) pkgs)))
69
70 dumpPackages :: [PackageConfig] -> String
71 dumpPackages pkgs = 
72    render (brackets (vcat (punctuate comma (map dumpPkgGuts pkgs))))
73
74 dumpPkgGuts :: PackageConfig -> Doc
75 dumpPkgGuts pkg =
76    text "Package" $$ nest 3 (braces (
77       sep (punctuate comma [
78          text "name = " <> text (show (name pkg)),
79          text "auto = " <> text (show (auto pkg)),
80          dumpField "import_dirs"     (import_dirs     pkg),
81          dumpField "source_dirs"     (source_dirs     pkg),
82          dumpField "library_dirs"    (library_dirs    pkg),
83          dumpField "hs_libraries"    (hs_libraries    pkg),
84          dumpField "extra_libraries" (extra_libraries pkg),
85          dumpField "include_dirs"    (include_dirs    pkg),
86          dumpField "c_includes"      (c_includes      pkg),
87          dumpField "package_deps"    (package_deps    pkg),
88          dumpField "extra_ghc_opts"  (extra_ghc_opts  pkg),
89          dumpField "extra_cc_opts"   (extra_cc_opts   pkg),
90          dumpField "extra_ld_opts"   (extra_ld_opts   pkg),
91          dumpField "framework_dirs"  (framework_dirs   pkg),
92          dumpField "extra_frameworks"(extra_frameworks pkg)
93       ])))
94
95 dumpField :: String -> [String] -> Doc
96 dumpField name val = hang (text name <+> equals) 2  (dumpFieldContents val)
97
98 dumpFieldContents :: [String] -> Doc
99 dumpFieldContents val = brackets (sep (punctuate comma (map (text . show) val)))
100