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 "package" -> return (\p -> p{package = $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 { id }
85 -- another case of license
88 {\p -> case unpackFS $1 of
89 "exposedModules" -> p{exposedModules = map mkModuleNameFS $3}
90 "hiddenModules" -> p{hiddenModules = map mkModuleNameFS $3}
91 "importDirs" -> p{importDirs = map unpackFS $3}
92 "libraryDirs" -> p{libraryDirs = map unpackFS $3}
93 "hsLibraries" -> p{hsLibraries = map unpackFS $3}
94 "extraLibraries" -> p{extraLibraries = map unpackFS $3}
95 "extraGHCiLibraries"-> p{extraGHCiLibraries= map unpackFS $3}
96 "includeDirs" -> p{includeDirs = map unpackFS $3}
97 "includes" -> p{includes = map unpackFS $3}
98 "hugsOptions" -> p{hugsOptions = map unpackFS $3}
99 "ccOptions" -> p{ccOptions = map unpackFS $3}
100 "ldOptions" -> p{ldOptions = map unpackFS $3}
101 "frameworkDirs" -> p{frameworkDirs = map unpackFS $3}
102 "frameworks" -> p{frameworks = map unpackFS $3}
103 "haddockInterfaces" -> p{haddockInterfaces = map unpackFS $3}
104 "haddockHTMLs" -> p{haddockHTMLs = map unpackFS $3}
105 "depends" -> p{depends = []}
106 -- empty list only, non-empty handled below
110 | VARID '=' pkgidlist
111 {% case unpackFS $1 of
112 "depends" -> return (\p -> p{depends = $3})
116 pkgid :: { PackageIdentifier }
117 : CONID '{' VARID '=' CONID STRING ',' VARID '=' version '}'
118 {% case unpackFS $5 of
120 return $ PackageIdentifier {
121 pkgName = PackageName (unpackFS $6),
127 version :: { Version }
128 : CONID '{' VARID '=' intlist ',' VARID '=' strlist '}'
129 { Version{ versionBranch=$5,
130 versionTags=map unpackFS $9 } }
132 pkgidlist :: { [PackageIdentifier] }
133 : '[' pkgids ']' { $2 }
134 -- empty list case is covered by strlist, to avoid conflicts
136 pkgids :: { [PackageIdentifier] }
138 | pkgid ',' pkgids { $1 : $3 }
142 | '[' ints ']' { $2 }
145 : INT { [ fromIntegral $1 ] }
146 | INT ',' ints { fromIntegral $1 : $3 }
148 strlist :: { [FastString] }
150 | '[' strs ']' { $2 }
152 strs :: { [FastString] }
154 | STRING ',' strs { $1 : $3 }
158 happyError = srcParseFail
160 loadPackageConfig :: DynFlags -> FilePath -> IO [PackageConfig]
161 loadPackageConfig dflags conf_filename = do
162 buf <- hGetStringBuffer conf_filename
163 let loc = mkSrcLoc (mkFastString conf_filename) 1 0
164 case unP parse (mkPState buf loc dflags) of
166 ghcError (InstallationError (showSDoc (mkLocMessage span err)))
168 POk _ pkg_details -> do