@@ -29,18 +29,33 @@ import Util.System
29type PParser = StateT PkgDesc IdrisInnerParser
29type PParser = StateT PkgDesc IdrisInnerParser
31data PkgDesc = PkgDesc {
31data PkgDesc = PkgDesc {
32− pkgname :: String
32+ pkgname :: String -- ^ Name associated with a package.
33+ , pkgbrief :: Maybe String -- ^ Brief description of the package.
34+ , pkgversion :: Maybe String -- ^ Version string to associate with the package.
35+ , pkgreadme :: Maybe String -- ^ Location of the README file.
36+ , pkglicense :: Maybe String -- ^ Description of the licensing information.
37+ , pkgauthor :: Maybe String -- ^ Author information.
38+ , pkgmaintainer :: Maybe String -- ^ Maintainer information.
39+ , pkghomepage :: Maybe String -- ^ Website associated with the package.
40+ , pkgsourceloc :: Maybe String -- ^ Location of the source files.
41+ , pkgbugtracker :: Maybe String -- ^ Location of the project's bug tracker.
33− , libdeps :: [String]
42+ , libdeps :: [String] -- ^ External dependencies.
34− , objs :: [String]
43+ , objs :: [String] -- ^ Object files required by the package.
35− , makefile :: Maybe String
44+ , makefile :: Maybe String -- ^ Makefile used to build external code. Used as part of the FFI process.
36− , idris_opts :: [Opt]
45+ , idris_opts :: [Opt] -- ^ List of options to give the compiler.
37− , sourcedir :: String
46+ , sourcedir :: String -- ^ Source directory for Idris files.
38− , modules :: [Name]
47+ , modules :: [Name] -- ^ Modules provided by the package.
39− , idris_main :: Name
48+ , idris_main :: Name -- ^ If an executable in which module can the Main namespace and function be found.
40− , execout :: Maybe String
49+ , execout :: Maybe String -- ^ What to call the executable.
41− , idris_tests :: [Name]
50+ , idris_tests :: [Name] -- ^ Lists of tests to execute against the package.
42 } deriving (Show)
51 } deriving (Show)
53+-- | Default settings for package descriptions.
55+defaultPkg = PkgDesc "" Nothing Nothing Nothing Nothing
56+ Nothing Nothing Nothing Nothing
57+ Nothing [] [] Nothing [] "" [] (sUN "") Nothing []
44instance HasLastTokenSpan PParser where
59instance HasLastTokenSpan PParser where
45 getLastTokenSpan = return Nothing
60 getLastTokenSpan = return Nothing
@@ -51,8 +66,6 @@ instance TokenParsing PParser where
52 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
67 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
55−defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
57parseDesc :: FilePath -> IO PkgDesc
70parseDesc :: FilePath -> IO PkgDesc
58parseDesc fp = do
71parseDesc fp = do
@@ -121,41 +134,118 @@ pClause = do reserved "executable"; lchar '=';
121 exec <- filename
134 exec <- filename
122 st <- get
135 st <- get
123 put (st { execout = Just exec })
136 put (st { execout = Just exec })
124 <|> do reserved "main"; lchar '=';
138 <|> do reserved "main"; lchar '=';
125 main <- fst <$> iName []
139 main <- fst <$> iName []
126 st <- get
140 st <- get
127 put (st { idris_main = main })
141 put (st { idris_main = main })
128 <|> do reserved "sourcedir"; lchar '=';
143 <|> do reserved "sourcedir"; lchar '=';
129 src <- fst <$> identifier
144 src <- fst <$> identifier
130 st <- get
145 st <- get
131 put (st { sourcedir = src })
146 put (st { sourcedir = src })
132 <|> do reserved "opts"; lchar '=';
148 <|> do reserved "opts"; lchar '=';
133 opts <- stringLiteral
149 opts <- stringLiteral
134 st <- get
150 st <- get
135 let args = pureArgParser (words opts)
151 let args = pureArgParser (words opts)
136 put (st { idris_opts = args ++ idris_opts st })
152 put (st { idris_opts = args ++ idris_opts st })
137 <|> do reserved "pkgs"; lchar '=';
154 <|> do reserved "pkgs"; lchar '=';
138 ps <- sepBy1 (fst <$> identifier) (lchar ',')
155 ps <- sepBy1 (fst <$> identifier) (lchar ',')
139 st <- get
156 st <- get
140 let pkgs = pureArgParser $ concatMap (\x -> ["-p", x]) ps
157 let pkgs = pureArgParser $ concatMap (\x -> ["-p", x]) ps
141 put (st {idris_opts = pkgs ++ idris_opts st})
158 put (st {idris_opts = pkgs ++ idris_opts st})
142 <|> do reserved "modules"; lchar '=';
160 <|> do reserved "modules"; lchar '=';
143 ms <- sepBy1 (fst <$> iName []) (lchar ',')
161 ms <- sepBy1 (fst <$> iName []) (lchar ',')
144 st <- get
162 st <- get
145 put (st { modules = modules st ++ ms })
163 put (st { modules = modules st ++ ms })
146 <|> do reserved "libs"; lchar '=';
165 <|> do reserved "libs"; lchar '=';
147 ls <- sepBy1 (fst <$> identifier) (lchar ',')
166 ls <- sepBy1 (fst <$> identifier) (lchar ',')
148 st <- get
167 st <- get
149 put (st { libdeps = libdeps st ++ ls })
168 put (st { libdeps = libdeps st ++ ls })
150 <|> do reserved "objs"; lchar '=';
170 <|> do reserved "objs"; lchar '=';
151 ls <- sepBy1 (fst <$> identifier) (lchar ',')
171 ls <- sepBy1 (fst <$> identifier) (lchar ',')
152 st <- get
172 st <- get
153 put (st { objs = libdeps st ++ ls })
173 put (st { objs = libdeps st ++ ls })
154 <|> do reserved "makefile"; lchar '=';
175 <|> do reserved "makefile"; lchar '=';
155 mk <- fst <$> iName []
176 mk <- fst <$> iName []
156 st <- get
177 st <- get
157 put (st { makefile = Just (show mk) })
178 put (st { makefile = Just (show mk) })
158 <|> do reserved "tests"; lchar '=';
180 <|> do reserved "tests"; lchar '=';
159 ts <- sepBy1 (fst <$> iName []) (lchar ',')
181 ts <- sepBy1 (fst <$> iName []) (lchar ',')
160 st <- get
182 st <- get
161 put st { idris_tests = idris_tests st ++ ts }
183 put st { idris_tests = idris_tests st ++ ts }
185+ <|> do reserved "version"
187+ vStr <- many (satisfy (not . isEol))
191+ put st {pkgversion = Just vStr}
193+ <|> do reserved "readme"
195+ rme <- many (satisfy (not . isEol))
199+ put (st { pkgreadme = Just rme })
201+ <|> do reserved "license"
203+ lStr <- many (satisfy (not . isEol))
206+ put st {pkglicense = Just lStr}
208+ <|> do reserved "homepage"
210+ www <- many (satisfy (not . isEol))
214+ put st {pkghomepage = Just www}
216+ <|> do reserved "sourceloc"
218+ srcpage <- many (satisfy (not . isEol))
222+ put st {pkgsourceloc = Just srcpage}
224+ <|> do reserved "bugtracker"
226+ src <- many (satisfy (not . isEol))
230+ put st {pkgbugtracker = Just src}
232+ <|> do reserved "brief"
234+ brief <- stringLiteral
237+ put st {pkgbrief = Just brief}
239+ <|> do reserved "author"; lchar '=';
240+ author <- many (satisfy (not . isEol))
244+ put st {pkgauthor = Just author}
246+ <|> do reserved "maintainer"; lchar '=';
247+ maintainer <- many (satisfy (not . isEol))
251+ put st {pkgmaintainer = Just maintainer}