Documentation for (&&) and (&&) states that they are lazy in their second argument...
[ghc.git] / compiler / main / PackageConfig.hs
1 {-# LANGUAGE CPP, RecordWildCards, FlexibleInstances, MultiParamTypeClasses #-}
2
3 -- |
4 -- Package configuration information: essentially the interface to Cabal, with
5 -- some utilities
6 --
7 -- (c) The University of Glasgow, 2004
8 --
9 module PackageConfig (
10 -- $package_naming
11
12 -- * UnitId
13 packageConfigId,
14 expandedPackageConfigId,
15 definitePackageConfigId,
16 installedPackageConfigId,
17
18 -- * The PackageConfig type: information about a package
19 PackageConfig,
20 InstalledPackageInfo(..),
21 ComponentId(..),
22 SourcePackageId(..),
23 PackageName(..),
24 Version(..),
25 defaultPackageConfig,
26 sourcePackageIdString,
27 packageNameString,
28 pprPackageConfig,
29 ) where
30
31 #include "HsVersions.h"
32
33 import GhcPrelude
34
35 import GHC.PackageDb
36 import Data.Version
37
38 import FastString
39 import Outputable
40 import Module
41 import Unique
42
43 -- -----------------------------------------------------------------------------
44 -- Our PackageConfig type is the InstalledPackageInfo from ghc-boot,
45 -- which is similar to a subset of the InstalledPackageInfo type from Cabal.
46
47 type PackageConfig = InstalledPackageInfo
48 ComponentId
49 SourcePackageId
50 PackageName
51 Module.InstalledUnitId
52 Module.UnitId
53 Module.ModuleName
54 Module.Module
55
56 -- TODO: there's no need for these to be FastString, as we don't need the uniq
57 -- feature, but ghc doesn't currently have convenient support for any
58 -- other compact string types, e.g. plain ByteString or Text.
59
60 newtype SourcePackageId = SourcePackageId FastString deriving (Eq, Ord)
61 newtype PackageName = PackageName FastString deriving (Eq, Ord)
62
63 instance BinaryStringRep SourcePackageId where
64 fromStringRep = SourcePackageId . mkFastStringByteString
65 toStringRep (SourcePackageId s) = bytesFS s
66
67 instance BinaryStringRep PackageName where
68 fromStringRep = PackageName . mkFastStringByteString
69 toStringRep (PackageName s) = bytesFS s
70
71 instance Uniquable SourcePackageId where
72 getUnique (SourcePackageId n) = getUnique n
73
74 instance Uniquable PackageName where
75 getUnique (PackageName n) = getUnique n
76
77 instance Outputable SourcePackageId where
78 ppr (SourcePackageId str) = ftext str
79
80 instance Outputable PackageName where
81 ppr (PackageName str) = ftext str
82
83 defaultPackageConfig :: PackageConfig
84 defaultPackageConfig = emptyInstalledPackageInfo
85
86 sourcePackageIdString :: PackageConfig -> String
87 sourcePackageIdString pkg = unpackFS str
88 where
89 SourcePackageId str = sourcePackageId pkg
90
91 packageNameString :: PackageConfig -> String
92 packageNameString pkg = unpackFS str
93 where
94 PackageName str = packageName pkg
95
96 pprPackageConfig :: PackageConfig -> SDoc
97 pprPackageConfig InstalledPackageInfo {..} =
98 vcat [
99 field "name" (ppr packageName),
100 field "version" (text (showVersion packageVersion)),
101 field "id" (ppr unitId),
102 field "exposed" (ppr exposed),
103 field "exposed-modules" (ppr exposedModules),
104 field "hidden-modules" (fsep (map ppr hiddenModules)),
105 field "trusted" (ppr trusted),
106 field "import-dirs" (fsep (map text importDirs)),
107 field "library-dirs" (fsep (map text libraryDirs)),
108 field "dynamic-library-dirs" (fsep (map text libraryDynDirs)),
109 field "hs-libraries" (fsep (map text hsLibraries)),
110 field "extra-libraries" (fsep (map text extraLibraries)),
111 field "extra-ghci-libraries" (fsep (map text extraGHCiLibraries)),
112 field "include-dirs" (fsep (map text includeDirs)),
113 field "includes" (fsep (map text includes)),
114 field "depends" (fsep (map ppr depends)),
115 field "cc-options" (fsep (map text ccOptions)),
116 field "ld-options" (fsep (map text ldOptions)),
117 field "framework-dirs" (fsep (map text frameworkDirs)),
118 field "frameworks" (fsep (map text frameworks)),
119 field "haddock-interfaces" (fsep (map text haddockInterfaces)),
120 field "haddock-html" (fsep (map text haddockHTMLs))
121 ]
122 where
123 field name body = text name <> colon <+> nest 4 body
124
125 -- -----------------------------------------------------------------------------
126 -- UnitId (package names, versions and dep hash)
127
128 -- $package_naming
129 -- #package_naming#
130 -- Mostly the compiler deals in terms of 'UnitId's, which are md5 hashes
131 -- of a package ID, keys of its dependencies, and Cabal flags. You're expected
132 -- to pass in the unit id in the @-this-unit-id@ flag. However, for
133 -- wired-in packages like @base@ & @rts@, we don't necessarily know what the
134 -- version is, so these are handled specially; see #wired_in_packages#.
135
136 -- | Get the GHC 'UnitId' right out of a Cabalish 'PackageConfig'
137 installedPackageConfigId :: PackageConfig -> InstalledUnitId
138 installedPackageConfigId = unitId
139
140 packageConfigId :: PackageConfig -> UnitId
141 packageConfigId p =
142 if indefinite p
143 then newUnitId (componentId p) (instantiatedWith p)
144 else DefiniteUnitId (DefUnitId (unitId p))
145
146 expandedPackageConfigId :: PackageConfig -> UnitId
147 expandedPackageConfigId p =
148 newUnitId (componentId p) (instantiatedWith p)
149
150 definitePackageConfigId :: PackageConfig -> Maybe DefUnitId
151 definitePackageConfigId p =
152 case packageConfigId p of
153 DefiniteUnitId def_uid -> Just def_uid
154 _ -> Nothing