ae330ab54c9fa47c70af425f8fdf4099309dc32f
[ghc-hetmet.git] / ghc / utils / ghc-pkg / Package.hs
1 -----------------------------------------------------------------------------
2 -- $Id: Package.hs,v 1.2 2001/03/27 14:10:34 simonmar Exp $
3 --
4 -- Package configuration defn.
5 -----------------------------------------------------------------------------
6
7 #ifdef PKG_TOOL
8 module Package ( 
9         PackageConfig(..), defaultPackageConfig
10 #ifdef WANT_PRETTY
11         , listPkgs              -- :: [PackageConfig] -> String
12         , dumpPackages          -- :: [PackageConfig] -> String
13         , dumpPkgGuts           -- :: PackageConfig -> Doc
14         , dumpFieldContents     -- :: [String] -> Doc
15 #endif
16  ) where
17 #endif
18
19 #ifdef WANT_PRETTY
20 import Pretty
21 #endif
22
23 data PackageConfig
24    = Package {
25         name            :: String,
26         import_dirs     :: [String],
27         source_dirs     :: [String],
28         library_dirs    :: [String],
29         hs_libraries    :: [String],
30         extra_libraries :: [String],
31         include_dirs    :: [String],
32         c_includes      :: [String],
33         package_deps    :: [String],
34         extra_ghc_opts  :: [String],
35         extra_cc_opts   :: [String],
36         extra_ld_opts   :: [String]
37      }
38 #ifdef PKG_TOOL
39         deriving (Read)
40 #endif
41
42 defaultPackageConfig
43    = Package {
44         name = error "defaultPackage",
45         import_dirs     = [],
46         source_dirs     = [],
47         library_dirs    = [],
48         hs_libraries    = [],
49         extra_libraries = [],
50         include_dirs    = [],
51         c_includes      = [],
52         package_deps    = [],
53         extra_ghc_opts  = [],
54         extra_cc_opts   = [],
55         extra_ld_opts   = []
56     }
57
58 -----------------------------------------------------------------------------
59 -- Pretty printing package info
60
61 #ifdef WANT_PRETTY
62 listPkgs :: [PackageConfig] -> String
63 listPkgs pkgs = render (fsep (punctuate comma (map (text . name) pkgs)))
64
65 dumpPackages :: [PackageConfig] -> String
66 dumpPackages pkgs = 
67    render (brackets (vcat (punctuate comma (map dumpPkgGuts pkgs))))
68
69 dumpPkgGuts :: PackageConfig -> Doc
70 dumpPkgGuts pkg =
71    text "Package" $$ nest 3 (braces (
72       sep (punctuate comma [
73          text "name = " <> text (show (name pkg)),
74          dumpField "import_dirs"     (import_dirs     pkg),
75          dumpField "source_dirs"     (source_dirs     pkg),
76          dumpField "library_dirs"    (library_dirs    pkg),
77          dumpField "hs_libraries"    (hs_libraries    pkg),
78          dumpField "extra_libraries" (extra_libraries pkg),
79          dumpField "include_dirs"    (include_dirs    pkg),
80          dumpField "c_includes"      (c_includes      pkg),
81          dumpField "package_deps"    (package_deps    pkg),
82          dumpField "extra_ghc_opts"  (extra_ghc_opts  pkg),
83          dumpField "extra_cc_opts"   (extra_cc_opts   pkg),
84          dumpField "extra_ld_opts"   (extra_ld_opts   pkg)
85       ])))
86
87 dumpField :: String -> [String] -> Doc
88 dumpField name val = hang (text name <+> equals) 2  (dumpFieldContents val)
89
90 dumpFieldContents :: [String] -> Doc
91 dumpFieldContents val = brackets (sep (punctuate comma (map (text . show) val)))
92 #endif
93