2 {-# OPTIONS -fno-warn-unused-binds -fno-warn-unused-matches -fno-warn-missing-signatures -fno-warn-incomplete-patterns -Wwarn #-}
3 -- The above warning supression flag is a temporary kludge.
4 -- While working on this module you are encouraged to remove it and fix
5 -- any warnings in the module. See
6 -- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
9 module ParsePkgConf( loadPackageConfig ) where
11 #include "HsVersions.h"
13 import Distribution.Package hiding ( depends )
20 import ErrUtils ( mkLocMessage )
36 VARID { L _ (ITvarid $$) }
37 CONID { L _ (ITconid $$) }
38 STRING { L _ (ITstring $$) }
39 INT { L _ (ITinteger $$) }
41 %monad { P } { >>= } { return }
42 %lexer { lexer } { L _ ITeof }
44 %tokentype { Located Token }
47 pkgconf :: { [ PackageConfig ] }
49 | '[' pkgs ']' { reverse $2 }
51 pkgs :: { [ PackageConfig ] }
53 | pkgs ',' pkg { $3 : $1 }
55 pkg :: { PackageConfig }
56 : CONID '{' fields '}' { $3 defaultPackageConfig }
58 fields :: { PackageConfig -> PackageConfig }
59 : field { \p -> $1 p }
60 | fields ',' field { \p -> $1 ($3 p) }
62 field :: { PackageConfig -> PackageConfig }
64 {% case unpackFS $1 of
65 "sourcePackageId" -> return (\p -> p{sourcePackageId = $3})
69 | VARID '=' STRING { id }
70 -- we aren't interested in the string fields, they're all
71 -- boring (copyright, maintainer etc.)
74 {% case unpackFS $1 of {
77 "True" -> return (\p -> p{exposed=True});
78 "False" -> return (\p -> p{exposed=False});
80 "license" -> return id; -- not interested
84 | VARID '=' CONID STRING
85 { \p -> case unpackFS $1 of
86 "installedPackageId" ->
87 p{installedPackageId = InstalledPackageId (unpackFS $4)}
88 _ -> p -- another case of license
92 {\p -> case unpackFS $1 of
93 "exposedModules" -> p{exposedModules = map mkModuleNameFS $3}
94 "hiddenModules" -> p{hiddenModules = map mkModuleNameFS $3}
95 "importDirs" -> p{importDirs = map unpackFS $3}
96 "libraryDirs" -> p{libraryDirs = map unpackFS $3}
97 "hsLibraries" -> p{hsLibraries = map unpackFS $3}
98 "extraLibraries" -> p{extraLibraries = map unpackFS $3}
99 "extraGHCiLibraries"-> p{extraGHCiLibraries= map unpackFS $3}
100 "includeDirs" -> p{includeDirs = map unpackFS $3}
101 "includes" -> p{includes = map unpackFS $3}
102 "hugsOptions" -> p{hugsOptions = map unpackFS $3}
103 "ccOptions" -> p{ccOptions = map unpackFS $3}
104 "ldOptions" -> p{ldOptions = map unpackFS $3}
105 "frameworkDirs" -> p{frameworkDirs = map unpackFS $3}
106 "frameworks" -> p{frameworks = map unpackFS $3}
107 "haddockInterfaces" -> p{haddockInterfaces = map unpackFS $3}
108 "haddockHTMLs" -> p{haddockHTMLs = map unpackFS $3}
109 "depends" -> p{depends = []}
110 -- empty list only, non-empty handled below
115 {% case unpackFS $1 of
116 "depends" -> return (\p -> p{depends = $3})
120 pkgid :: { PackageIdentifier }
121 : CONID '{' VARID '=' CONID STRING ',' VARID '=' version '}'
122 {% case unpackFS $5 of
124 return $ PackageIdentifier {
125 pkgName = PackageName (unpackFS $6),
131 version :: { Version }
132 : CONID '{' VARID '=' intlist ',' VARID '=' strlist '}'
133 { Version{ versionBranch=$5,
134 versionTags=map unpackFS $9 } }
136 ipid :: { InstalledPackageId }
138 {% case unpackFS $1 of
139 "InstalledPackageId" -> return (InstalledPackageId (unpackFS $2))
143 ipidlist :: { [InstalledPackageId] }
144 : '[' ipids ']' { $2 }
145 -- empty list case is covered by strlist, to avoid conflicts
147 ipids :: { [InstalledPackageId] }
149 | ipid ',' ipids { $1 : $3 }
153 | '[' ints ']' { $2 }
156 : INT { [ fromIntegral $1 ] }
157 | INT ',' ints { fromIntegral $1 : $3 }
159 strlist :: { [FastString] }
161 | '[' strs ']' { $2 }
163 strs :: { [FastString] }
165 | STRING ',' strs { $1 : $3 }
169 happyError = srcParseFail
171 loadPackageConfig :: DynFlags -> FilePath -> IO [PackageConfig]
172 loadPackageConfig dflags conf_filename = do
173 buf <- hGetStringBuffer conf_filename
174 let loc = mkSrcLoc (mkFastString conf_filename) 1 0
175 case unP parse (mkPState buf loc dflags) of
177 ghcError (InstallationError (showSDoc (mkLocMessage span err)))
179 POk _ pkg_details -> do