2 module ParsePkgConf( loadPackageConfig ) where
4 #include "HsVersions.h"
6 import Packages ( PackageConfig(..), defaultPackageConfig )
11 import ErrUtils ( mkLocMessage )
14 import Panic ( GhcException(..) )
15 import EXCEPTION ( throwDyn )
26 VARID { L _ (ITvarid $$) }
27 CONID { L _ (ITconid $$) }
28 STRING { L _ (ITstring $$) }
30 %monad { P } { >>= } { return }
31 %lexer { lexer } { L _ ITeof }
33 %tokentype { Located Token }
36 pkgconf :: { [ PackageConfig ] }
38 | '[' pkgs ']' { reverse $2 }
40 pkgs :: { [ PackageConfig ] }
42 | pkgs ',' pkg { $3 : $1 }
44 pkg :: { PackageConfig }
45 : CONID '{' fields '}' { $3 defaultPackageConfig }
47 fields :: { PackageConfig -> PackageConfig }
48 : field { \p -> $1 p }
49 | fields ',' field { \p -> $1 ($3 p) }
51 field :: { PackageConfig -> PackageConfig }
53 {% case unpackFS $1 of {
54 "name" -> return (\ p -> p{name = unpackFS $3});
58 {\p -> case unpackFS $1 of {
59 "auto" -> p{auto = $3};
63 {\p -> case unpackFS $1 of
64 "import_dirs" -> p{import_dirs = $3}
65 "library_dirs" -> p{library_dirs = $3}
66 "hs_libraries" -> p{hs_libraries = $3}
67 "extra_libraries" -> p{extra_libraries = $3}
68 "include_dirs" -> p{include_dirs = $3}
69 "c_includes" -> p{c_includes = $3}
70 "package_deps" -> p{package_deps = $3}
71 "extra_ghc_opts" -> p{extra_ghc_opts = $3}
72 "extra_cc_opts" -> p{extra_cc_opts = $3}
73 "extra_ld_opts" -> p{extra_ld_opts = $3}
74 "framework_dirs" -> p{framework_dirs = $3}
75 "extra_frameworks"-> p{extra_frameworks= $3}
79 strlist :: { [String] }
81 | '[' strs ']' { reverse $2 }
84 : STRING { [ unpackFS $1 ] }
85 | strs ',' STRING { unpackFS $3 : $1 }
88 : CONID {% case unpackFS $1 of {
89 "True" -> return True;
90 "False" -> return False;
95 happyError = srcParseFail
97 loadPackageConfig :: FilePath -> IO [PackageConfig]
98 loadPackageConfig conf_filename = do
99 buf <- hGetStringBuffer conf_filename
100 let loc = mkSrcLoc (mkFastString conf_filename) 1 0
101 case unP parse (mkPState buf loc defaultDynFlags) of
103 throwDyn (InstallationError (showSDoc (mkLocMessage span err)))
105 POk _ pkg_details -> do