+-- 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 Data.Maybe
-import Distribution.PackageDescription
-import Distribution.Simple
-import Distribution.Simple.Utils
-import System.Cmd
+import System.Directory
import System.Environment
import System.Exit
+import System.IO
main :: IO ()
-main = do let verbosity = 0
- mustBeBuildables <- getMustBeBuildablePackages
- dfd <- defaultPackageDesc verbosity
- pkgDescr <- readPackageDescription verbosity dfd
- mInfolFile <- defaultHookedPackageDesc
- info <- case mInfolFile of
- Nothing -> return emptyHookedBuildInfo
- Just infoFile -> readHookedBuildInfo verbosity infoFile
- let pkgDescr' = updatePackageDescription info pkgDescr
- pkg = pkgName (package pkgDescr')
- mustBeBuildable = pkg `elem` mustBeBuildables
- buildInfos = map libBuildInfo (maybeToList (library pkgDescr'))
- ++ map buildInfo (executables pkgDescr')
- isBuildable = any buildable buildInfos
- when (mustBeBuildable || isBuildable) $ do
- args <- getArgs
- case args of
- prog : progArgs ->
- do ec <- rawSystem prog progArgs
- exitWith ec
- [] ->
- error "ifBuildable: No command given"
+main = do args <- getArgs
+ case args of
+ [bootPackagesFile, package] ->
+ doit bootPackagesFile package
+ _ ->
+ error "Syntax: ifBuildable <boot-packages-file> <package>"
-getMustBeBuildablePackages :: IO [String]
-getMustBeBuildablePackages
- = do xs <- readFile "../core-packages"
- return $ filter ("readline" /=) $ lines xs
+doit :: FilePath -> String -> IO ()
+doit bootPackagesFile package
+ = do setCurrentDirectory package
+ unbuildable <- doesFileExist "unbuildable"
+ if not unbuildable
+ then exitWith ExitSuccess
+ else do mustBeBuildables <- getMustBeBuildables bootPackagesFile
+ if package `elem` mustBeBuildables
+ then exitWith ExitSuccess
+ else do hPutStrLn stderr "Warning: Package is unbuildable"
+ exitWith (ExitFailure 1)
+
+getMustBeBuildables :: FilePath -> IO [String]
+getMustBeBuildables bootPackagesFile
+ = do xs <- readFile bootPackagesFile
+ return $ filter ("editline" /=) $ lines xs