diff --git a/Stackage/Build.hs b/Stackage/Build.hs index a0d92145..cb912003 100644 --- a/Stackage/Build.hs +++ b/Stackage/Build.hs @@ -19,6 +19,7 @@ import System.Process (runProcess, waitForProcess, rawSystem, re import System.Directory (createDirectoryIfMissing, canonicalizePath, doesDirectoryExist) import Distribution.Version (thisVersion, withinRange) import Control.Exception (assert) +import Data.Set (empty) defaultBuildSettings :: BuildSettings defaultBuildSettings = BuildSettings @@ -31,6 +32,7 @@ defaultBuildSettings = BuildSettings , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal" , requireHaskellPlatform = True , cleanBeforeBuild = True + , excludedPackages = empty } build :: BuildSettings -> IO () diff --git a/Stackage/InstallInfo.hs b/Stackage/InstallInfo.hs index f7ccd9dd..da8d6102 100644 --- a/Stackage/InstallInfo.hs +++ b/Stackage/InstallInfo.hs @@ -13,12 +13,19 @@ import Stackage.Types import Stackage.Util import Data.Version (showVersion) +dropExcluded :: BuildSettings + -> Map PackageName (VersionRange, Maintainer) + -> Map PackageName (VersionRange, Maintainer) +dropExcluded bs m0 = + Set.foldl' (flip Map.delete) m0 (excludedPackages bs) + getInstallInfo :: BuildSettings -> IO InstallInfo getInstallInfo settings = do hp <- loadHaskellPlatform settings - let allPackages + let allPackages' | requireHaskellPlatform settings = Map.union (stablePackages settings) $ identsToRanges (hplibs hp) | otherwise = stablePackages settings + allPackages = dropExcluded settings allPackages' let totalCore = extraCore settings `Set.union` Set.map (\(PackageIdentifier p _) -> p) (hpcore hp) pdb <- loadPackageDB totalCore allPackages final <- narrowPackageDB pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages diff --git a/Stackage/Types.hs b/Stackage/Types.hs index b1766fe9..e8e3f236 100644 --- a/Stackage/Types.hs +++ b/Stackage/Types.hs @@ -64,4 +64,8 @@ data BuildSettings = BuildSettings , haskellPlatformCabal :: FilePath , requireHaskellPlatform :: Bool , cleanBeforeBuild :: Bool + , excludedPackages :: Set PackageName + -- ^ Packages which should be dropped from the list of stable packages, + -- even if present via the Haskell Platform or @stablePackages@. If these + -- packages are dependencies of others, they will still be included. } diff --git a/app/stackage.hs b/app/stackage.hs index 247c7a34..7f1ebbf9 100644 --- a/app/stackage.hs +++ b/app/stackage.hs @@ -1,14 +1,34 @@ -import Stackage.Types (BuildSettings(..)) +{-# LANGUAGE RecordWildCards #-} +import Stackage.Types import Stackage.Build (build, defaultBuildSettings) import Stackage.Init (stackageInit) import System.Environment (getArgs, getProgName) +import Data.Set (fromList) + +data BuildArgs = BuildArgs + { noClean :: Bool + , excluded :: [String] + } + +parseBuildArgs :: [String] -> IO BuildArgs +parseBuildArgs = + loop $ BuildArgs False [] + where + loop x [] = return x + loop x ("--no-clean":rest) = loop x { noClean = True } rest + loop x ("--exclude":y:rest) = loop x { excluded = y : excluded x } rest + loop _ (y:_) = error $ "Did not understand argument: " ++ y main :: IO () main = do args <- getArgs case args of - ["build"] -> build defaultBuildSettings - ["build", "--no-clean"] -> build (defaultBuildSettings { cleanBeforeBuild = False }) + "build":rest -> do + BuildArgs {..} <- parseBuildArgs rest + build defaultBuildSettings + { cleanBeforeBuild = not noClean + , excludedPackages = fromList $ map PackageName excluded + } ["init"] -> stackageInit ["update"] -> stackageInit >> error "FIXME update" _ -> do @@ -17,4 +37,5 @@ main = do putStrLn "Available commands:" putStrLn " update Download updated Stackage databases. Automatically calls init." putStrLn " init Initialize your cabal file to use Stackage" - putStrLn " build [--no-clean] Build the package databases (maintainers only)" + putStrLn " build [--no-clean] [--exclude package...]" + putStrLn " Build the package databases (maintainers only)" diff --git a/stackage.cabal b/stackage.cabal index 77266233..4964ff8b 100644 --- a/stackage.cabal +++ b/stackage.cabal @@ -39,6 +39,7 @@ executable stackage main-is: stackage.hs build-depends: base , stackage + , containers source-repository head type: git