+-- Returns exitcode 0 if the given package is buildable or is a boot package,
+-- and 1 otherwise.
module Main (main) where
import Control.Monad
-import System.Cmd
import System.Directory
import System.Environment
import System.Exit
main :: IO ()
main = do args <- getArgs
case args of
- [] ->
- error "No package or command given"
- [_] ->
- error "No command given"
- package : prog : progArgs ->
- doit package prog progArgs
+ [packagesFile, package] ->
+ doit packagesFile package
+ _ ->
+ error "Syntax: ifBuildable <packages-file> <package>"
-doit :: String -> String -> [String] -> IO ()
-doit package prog progArgs
+doit :: FilePath -> String -> IO ()
+doit packagesFile package
= do setCurrentDirectory package
unbuildable <- doesFileExist "unbuildable"
- if unbuildable
- then do mustBeBuildables <- getMustBeBuildablePackages
+ if not unbuildable
+ then exitWith ExitSuccess
+ else do mustBeBuildables <- getMustBeBuildables packagesFile
if package `elem` mustBeBuildables
- then error (package ++ " is unbuildable")
- else hPutStrLn stderr "Warning: Package is unbuildable"
- else do ec <- rawSystem prog progArgs
- exitWith ec
+ then exitWith ExitSuccess
+ else do hPutStrLn stderr "Warning: Package is unbuildable"
+ exitWith (ExitFailure 1)
-getMustBeBuildablePackages :: IO [String]
-getMustBeBuildablePackages
- = do xs <- readFile "../core-packages"
- return $ filter ("readline" /=) $ lines xs
+getMustBeBuildables :: FilePath -> IO [String]
+getMustBeBuildables packagesFile
+ = do xs <- readFile packagesFile
+ let nonCommentLines = filter (("#" /=) . take 1) $ lines xs
+ requiredLines = filter ((3 == ) . length) $ map words nonCommentLines
+ requiredLibraries = [ x | 'l':'i':'b':'r':'a':'r':'i':'e':'s':'/':x
+ <- map head requiredLines ]
+ return $ filter ("editline" /=) requiredLibraries