@@ -29,18 +29,33 @@ import Util.System
2929type PParser = StateT PkgDesc IdrisInnerParser
3030
3131data PkgDesc = PkgDesc {
32− pkgname :: String
33− , libdeps :: [String]
34− , objs :: [String]
35− , makefile :: Maybe String
36− , idris_opts :: [Opt]
37− , sourcedir :: String
38− , modules :: [Name]
39− , idris_main :: Name
40− , execout :: Maybe String
41− , idris_tests :: [Name]
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.
42+ , libdeps :: [String] -- ^ External dependencies.
43+ , objs :: [String] -- ^ Object files required by the package.
44+ , makefile :: Maybe String -- ^ Makefile used to build external code. Used as part of the FFI process.
45+ , idris_opts :: [Opt] -- ^ List of options to give the compiler.
46+ , sourcedir :: String -- ^ Source directory for Idris files.
47+ , modules :: [Name] -- ^ Modules provided by the package.
48+ , idris_main :: Name -- ^ If an executable in which module can the Main namespace and function be found.
49+ , execout :: Maybe String -- ^ What to call the executable.
50+ , idris_tests :: [Name] -- ^ Lists of tests to execute against the package.
4251 } deriving (Show)
4352
53+-- | Default settings for package descriptions.
54+defaultPkg :: PkgDesc
55+defaultPkg = PkgDesc "" Nothing Nothing Nothing Nothing
56+ Nothing Nothing Nothing Nothing
57+ Nothing [] [] Nothing [] "" [] (sUN "") Nothing []
58+
4459instance HasLastTokenSpan PParser where
4560 getLastTokenSpan = return Nothing
4661
@@ -51,8 +66,6 @@ instance TokenParsing PParser where
5166#endif
5267 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
5368
54−defaultPkg :: PkgDesc
55−defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
5669
5770parseDesc :: FilePath -> IO PkgDesc
5871parseDesc fp = do
@@ -121,41 +134,118 @@ pClause = do reserved "executable"; lchar '=';
121134 exec <- filename
122135 st <- get
123136 put (st { execout = Just exec })
137+
124138 <|> do reserved "main"; lchar '=';
125139 main <- fst <$> iName []
126140 st <- get
127141 put (st { idris_main = main })
142+
128143 <|> do reserved "sourcedir"; lchar '=';
129144 src <- fst <$> identifier
130145 st <- get
131146 put (st { sourcedir = src })
147+
132148 <|> do reserved "opts"; lchar '=';
133149 opts <- stringLiteral
134150 st <- get
135151 let args = pureArgParser (words opts)
136152 put (st { idris_opts = args ++ idris_opts st })
153+
137154 <|> do reserved "pkgs"; lchar '=';
138155 ps <- sepBy1 (fst <$> identifier) (lchar ',')
139156 st <- get
140157 let pkgs = pureArgParser $ concatMap (\x -> ["-p", x]) ps
141158 put (st {idris_opts = pkgs ++ idris_opts st})
159+
142160 <|> do reserved "modules"; lchar '=';
143161 ms <- sepBy1 (fst <$> iName []) (lchar ',')
144162 st <- get
145163 put (st { modules = modules st ++ ms })
164+
146165 <|> do reserved "libs"; lchar '=';
147166 ls <- sepBy1 (fst <$> identifier) (lchar ',')
148167 st <- get
149168 put (st { libdeps = libdeps st ++ ls })
169+
150170 <|> do reserved "objs"; lchar '=';
151171 ls <- sepBy1 (fst <$> identifier) (lchar ',')
152172 st <- get
153173 put (st { objs = libdeps st ++ ls })
174+
154175 <|> do reserved "makefile"; lchar '=';
155176 mk <- fst <$> iName []
156177 st <- get
157178 put (st { makefile = Just (show mk) })
179+
158180 <|> do reserved "tests"; lchar '=';
159181 ts <- sepBy1 (fst <$> iName []) (lchar ',')
160182 st <- get
161183 put st { idris_tests = idris_tests st ++ ts }
184+
185+ <|> do reserved "version"
186+ lchar '='
187+ vStr <- many (satisfy (not . isEol))
188+ eol
189+ someSpace
190+ st <- get
191+ put st {pkgversion = Just vStr}
192+
193+ <|> do reserved "readme"
194+ lchar '='
195+ rme <- many (satisfy (not . isEol))
196+ eol
197+ someSpace
198+ st <- get
199+ put (st { pkgreadme = Just rme })
200+
201+ <|> do reserved "license"
202+ lchar '='
203+ lStr <- many (satisfy (not . isEol))
204+ eol
205+ st <- get
206+ put st {pkglicense = Just lStr}
207+
208+ <|> do reserved "homepage"
209+ lchar '='
210+ www <- many (satisfy (not . isEol))
211+ eol
212+ someSpace
213+ st <- get
214+ put st {pkghomepage = Just www}
215+
216+ <|> do reserved "sourceloc"
217+ lchar '='
218+ srcpage <- many (satisfy (not . isEol))
219+ eol
220+ someSpace
221+ st <- get
222+ put st {pkgsourceloc = Just srcpage}
223+
224+ <|> do reserved "bugtracker"
225+ lchar '='
226+ src <- many (satisfy (not . isEol))
227+ eol
228+ someSpace
229+ st <- get
230+ put st {pkgbugtracker = Just src}
231+
232+ <|> do reserved "brief"
233+ lchar '='
234+ brief <- stringLiteral
235+ st <- get
236+ someSpace
237+ put st {pkgbrief = Just brief}
238+
239+ <|> do reserved "author"; lchar '=';
240+ author <- many (satisfy (not . isEol))
241+ eol
242+ someSpace
243+ st <- get
244+ put st {pkgauthor = Just author}
245+
246+ <|> do reserved "maintainer"; lchar '=';
247+ maintainer <- many (satisfy (not . isEol))
248+ eol
249+ someSpace
250+ st <- get
251+ put st {pkgmaintainer = Just maintainer}