cae45bc84d4b6d9333193886a3e13e7fb057499c
[ghc-hetmet.git] / ghc / compiler / main / ParsePkgConf.y
1 {
2 module ParsePkgConf( loadPackageConfig ) where
3
4 import Packages  ( PackageConfig(..), defaultPackageConfig )
5 import Lex
6 import FastString
7 import StringBuffer
8 import SrcLoc
9 import Outputable
10 import Panic     ( GhcException(..) )
11 import Exception ( throwDyn )
12
13 #include "HsVersions.h"
14
15 }
16
17 %token
18  '{'            { ITocurly }
19  '}'            { ITccurly }
20  '['            { ITobrack }
21  ']'            { ITcbrack }
22  ','            { ITcomma }
23  '='            { ITequal }
24  VARID          { ITvarid    $$ }
25  CONID          { ITconid    $$ }
26  STRING         { ITstring   $$ }
27
28 %monad { P } { thenP } { returnP }
29 %lexer { lexer } { ITeof }
30 %name parse
31 %tokentype { Token }
32 %%
33
34 pkgconf :: { [ PackageConfig ] }
35         : '[' pkgs ']'                  { reverse $2 }
36
37 pkgs    :: { [ PackageConfig ] }
38         : pkg                           { [ $1 ] }
39         | pkgs ',' pkg                  { $3 : $1 }
40
41 pkg     :: { PackageConfig }
42         : CONID '{' fields '}'          { $3 defaultPackageConfig }
43
44 fields  :: { PackageConfig -> PackageConfig }
45         : field                         { \p -> $1 p }
46         | fields ',' field              { \p -> $1 ($3 p) }
47
48 field   :: { PackageConfig -> PackageConfig }
49         : VARID '=' STRING              
50                  {% case unpackFS $1 of { 
51                    "name" -> returnP (\ p -> p{name = unpackFS $3});
52                    _      -> happyError } }
53                         
54         | VARID '=' strlist             
55                 {\p -> case unpackFS $1 of
56                         "import_dirs"     -> p{import_dirs     = $3}
57                         "library_dirs"    -> p{library_dirs    = $3}
58                         "hs_libraries"    -> p{hs_libraries    = $3}
59                         "extra_libraries" -> p{extra_libraries = $3}
60                         "include_dirs"    -> p{include_dirs    = $3}
61                         "c_includes"      -> p{c_includes      = $3}
62                         "package_deps"    -> p{package_deps    = $3}
63                         "extra_ghc_opts"  -> p{extra_ghc_opts  = $3}
64                         "extra_cc_opts"   -> p{extra_cc_opts   = $3}
65                         "extra_ld_opts"   -> p{extra_ld_opts   = $3}
66                         _other            -> p
67                 }
68
69 strlist :: { [String] }
70         : '[' ']'                       { [] }
71         | '[' strs ']'                  { reverse $2 }
72
73 strs    :: { [String] }
74         : STRING                        { [ unpackFS $1 ] }
75         | strs ',' STRING               { unpackFS $3 : $1 }
76
77 {
78 happyError :: P a
79 happyError buf PState{ loc = loc } = PFailed (srcParseErr buf loc)
80
81 loadPackageConfig :: FilePath -> IO [PackageConfig]
82 loadPackageConfig conf_filename = do
83    buf <- hGetStringBuffer False conf_filename
84    case parse buf PState{ bol = 0#, atbol = 1#,
85                           context = [], glasgow_exts = 0#,
86                           loc = mkSrcLoc (_PK_ conf_filename) 1 } of
87         PFailed err -> do
88             freeStringBuffer buf
89             throwDyn (InstallationError (showSDoc err))
90
91         POk _ pkg_details -> do
92             freeStringBuffer buf
93             return pkg_details
94 }