2 {-# OPTIONS -fno-warn-unused-binds -fno-warn-unused-matches -fno-warn-missing-signatures #-}
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"
19 import ErrUtils ( mkLocMessage )
22 import Panic ( GhcException(..) )
23 import Control.Exception ( throwDyn )
34 VARID { L _ (ITvarid $$) }
35 CONID { L _ (ITconid $$) }
36 STRING { L _ (ITstring $$) }
37 INT { L _ (ITinteger $$) }
39 %monad { P } { >>= } { return }
40 %lexer { lexer } { L _ ITeof }
42 %tokentype { Located Token }
45 pkgconf :: { [ PackageConfig ] }
47 | '[' pkgs ']' { reverse $2 }
49 pkgs :: { [ PackageConfig ] }
51 | pkgs ',' pkg { $3 : $1 }
53 pkg :: { PackageConfig }
54 : CONID '{' fields '}' { $3 defaultPackageConfig }
56 fields :: { PackageConfig -> PackageConfig }
57 : field { \p -> $1 p }
58 | fields ',' field { \p -> $1 ($3 p) }
60 field :: { PackageConfig -> PackageConfig }
62 {% case unpackFS $1 of
63 "package" -> return (\p -> p{package = $3})
67 | VARID '=' STRING { id }
68 -- we aren't interested in the string fields, they're all
69 -- boring (copyright, maintainer etc.)
72 {% case unpackFS $1 of {
75 "True" -> return (\p -> p{exposed=True});
76 "False" -> return (\p -> p{exposed=False});
78 "license" -> return id; -- not interested
82 | VARID '=' CONID STRING { id }
83 -- another case of license
86 {\p -> case unpackFS $1 of
87 "exposedModules" -> p{exposedModules = map mkModuleNameFS $3}
88 "hiddenModules" -> p{hiddenModules = map mkModuleNameFS $3}
89 "importDirs" -> p{importDirs = map unpackFS $3}
90 "libraryDirs" -> p{libraryDirs = map unpackFS $3}
91 "hsLibraries" -> p{hsLibraries = map unpackFS $3}
92 "extraLibraries" -> p{extraLibraries = map unpackFS $3}
93 "extraGHCiLibraries"-> p{extraGHCiLibraries= map unpackFS $3}
94 "includeDirs" -> p{includeDirs = map unpackFS $3}
95 "includes" -> p{includes = map unpackFS $3}
96 "hugsOptions" -> p{hugsOptions = map unpackFS $3}
97 "ccOptions" -> p{ccOptions = map unpackFS $3}
98 "ldOptions" -> p{ldOptions = map unpackFS $3}
99 "frameworkDirs" -> p{frameworkDirs = map unpackFS $3}
100 "frameworks" -> p{frameworks = map unpackFS $3}
101 "haddockInterfaces" -> p{haddockInterfaces = map unpackFS $3}
102 "haddockHTMLs" -> p{haddockHTMLs = map unpackFS $3}
103 "depends" -> p{depends = []}
104 -- empty list only, non-empty handled below
108 | VARID '=' pkgidlist
109 {% case unpackFS $1 of
110 "depends" -> return (\p -> p{depends = $3})
114 pkgid :: { PackageIdentifier }
115 : CONID '{' VARID '=' STRING ',' VARID '=' version '}'
116 { PackageIdentifier{ pkgName = unpackFS $5,
119 version :: { Version }
120 : CONID '{' VARID '=' intlist ',' VARID '=' strlist '}'
121 { Version{ versionBranch=$5,
122 versionTags=map unpackFS $9 } }
124 pkgidlist :: { [PackageIdentifier] }
125 : '[' pkgids ']' { $2 }
126 -- empty list case is covered by strlist, to avoid conflicts
128 pkgids :: { [PackageIdentifier] }
130 | pkgid ',' pkgids { $1 : $3 }
134 | '[' ints ']' { $2 }
137 : INT { [ fromIntegral $1 ] }
138 | INT ',' ints { fromIntegral $1 : $3 }
140 strlist :: { [FastString] }
142 | '[' strs ']' { $2 }
144 strs :: { [FastString] }
146 | STRING ',' strs { $1 : $3 }
150 happyError = srcParseFail
152 loadPackageConfig :: DynFlags -> FilePath -> IO [PackageConfig]
153 loadPackageConfig dflags conf_filename = do
154 buf <- hGetStringBuffer conf_filename
155 let loc = mkSrcLoc (mkFastString conf_filename) 1 0
156 case unP parse (mkPState buf loc dflags) of
158 throwDyn (InstallationError (showSDoc (mkLocMessage span err)))
160 POk _ pkg_details -> do