{
-module ParsePkgConf (parsePkgConf) where
-import CmStaticInfo
-import Lex
+module ParsePkgConf( loadPackageConfig ) where
+
+#include "HsVersions.h"
+
+import Packages ( PackageConfig(..), defaultPackageConfig )
+import Lexer
+import CmdLineOpts
import FastString
import StringBuffer
import SrcLoc
import Outputable
-#include "HsVersions.h"
+import Panic ( GhcException(..) )
+import EXCEPTION ( throwDyn )
+
}
%token
- '{' { ITocurly }
- '}' { ITccurly }
- '[' { ITobrack }
- ']' { ITcbrack }
- ',' { ITcomma }
- '=' { ITequal }
- VARID { ITvarid $$ }
- CONID { ITconid $$ }
- STRING { ITstring $$ }
-
-%monad { P } { thenP } { returnP }
-%lexer { lexer } { ITeof }
+ '{' { T _ _ ITocurly }
+ '}' { T _ _ ITccurly }
+ '[' { T _ _ ITobrack }
+ ']' { T _ _ ITcbrack }
+ ',' { T _ _ ITcomma }
+ '=' { T _ _ ITequal }
+ VARID { T _ _ (ITvarid $$) }
+ CONID { T _ _ (ITconid $$) }
+ STRING { T _ _ (ITstring $$) }
+
+%monad { P } { >>= } { return }
+%lexer { lexer } { T _ _ ITeof }
%name parse
%tokentype { Token }
%%
pkgconf :: { [ PackageConfig ] }
- : '[' pkgs ']' { reverse $2 }
+ : '[' ']' { [] }
+ | '[' pkgs ']' { reverse $2 }
pkgs :: { [ PackageConfig ] }
: pkg { [ $1 ] }
field :: { PackageConfig -> PackageConfig }
: VARID '=' STRING
- {\p -> case unpackFS $1 of
- "name" -> p{name = unpackFS $3} }
+ {% case unpackFS $1 of {
+ "name" -> return (\ p -> p{name = unpackFS $3});
+ _ -> happyError } }
+ | VARID '=' bool
+ {\p -> case unpackFS $1 of {
+ "auto" -> p{auto = $3};
+ _ -> p } }
+
| VARID '=' strlist
{\p -> case unpackFS $1 of
"import_dirs" -> p{import_dirs = $3}
"extra_ghc_opts" -> p{extra_ghc_opts = $3}
"extra_cc_opts" -> p{extra_cc_opts = $3}
"extra_ld_opts" -> p{extra_ld_opts = $3}
+ "framework_dirs" -> p{framework_dirs = $3}
+ "extra_frameworks"-> p{extra_frameworks= $3}
_other -> p
}
: STRING { [ unpackFS $1 ] }
| strs ',' STRING { unpackFS $3 : $1 }
+bool :: { Bool }
+ : CONID {% case unpackFS $1 of {
+ "True" -> return True;
+ "False" -> return False;
+ _ -> happyError } }
+
{
happyError :: P a
-happyError buf PState{ loc = loc } = PFailed (srcParseErr buf loc)
-
-parsePkgConf :: FilePath -> IO (Either SDoc [PackageConfig])
-parsePkgConf conf_filename = do
- buf <- hGetStringBuffer False conf_filename
- case parse buf PState{ bol = 0#, atbol = 1#,
- context = [], glasgow_exts = 0#,
- loc = mkSrcLoc (_PK_ conf_filename) 1 } of
- PFailed err -> do
- freeStringBuffer buf
- return (Left err)
+happyError = srcParseFail
+
+loadPackageConfig :: FilePath -> IO [PackageConfig]
+loadPackageConfig conf_filename = do
+ buf <- hGetStringBuffer conf_filename
+ let loc = mkSrcLoc (mkFastString conf_filename) 1 0
+ case unP parse (mkPState buf loc defaultDynFlags) of
+ PFailed l1 l2 err ->
+ throwDyn (InstallationError (showSDoc (showPFailed l1 l2 err)))
POk _ pkg_details -> do
- freeStringBuffer buf
- return (Right pkg_details)
+ return pkg_details
}