on 39cc820 help sign in
stackage/Stackage/Select.hs
83 lines 3.3 kB history raw
1module Stackage.Select
2 ( select
3 , defaultSelectSettings
4 ) where
6import Control.Exception (assert)
7import Control.Monad (unless, when)
8import qualified Data.Map as Map
9import Data.Maybe (mapMaybe)
10import Data.Set (empty)
11import qualified Data.Set as Set
12import Distribution.Text (simpleParse)
13import Distribution.Version (withinRange)
14import Prelude hiding (pi)
15import Stackage.CheckPlan
16import Stackage.Config
17import Stackage.InstallInfo
18import Stackage.Tarballs
19import Stackage.Test
20import Stackage.Types
21import Stackage.Util
22import System.Directory (canonicalizePath,
23 createDirectoryIfMissing,
24 doesDirectoryExist)
25import System.Exit (ExitCode (ExitSuccess), exitWith)
26import System.IO (IOMode (WriteMode), hPutStrLn,
27 withBinaryFile)
28import System.Process (rawSystem, readProcess, runProcess,
29 waitForProcess)
30import Stackage.BuildPlan
32defaultSelectSettings :: SelectSettings
33defaultSelectSettings = SelectSettings
34 { extraCore = defaultExtraCore
35 , expectedFailuresSelect = defaultExpectedFailures
36 , stablePackages = defaultStablePackages
37 , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
38 , requireHaskellPlatform = True
39 , excludedPackages = empty
40 , flags = Set.fromList $ words "blaze_html_0_5"
41 , allowedPackage = const $ Right ()
42 }
44select :: SelectSettings -> IO BuildPlan
45select settings' = do
46 ii <- getInstallInfo settings'
48 return BuildPlan
49 { bpTools = iiBuildTools ii
50 , bpPackages = iiPackages ii
51 , bpOptionalCore = iiOptionalCore ii
52 , bpCore = iiCore ii
53 }
55-- | Get all of the build tools required.
56iiBuildTools :: InstallInfo -> [String]
57iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
58 -- FIXME possible improvement: track the dependencies between the build
59 -- tools themselves, and install them in the correct order.
60 map packageVersionString
61 $ filter (flip Set.notMember coreTools . fst)
62 $ mapMaybe (flip Map.lookup buildToolMap)
63 $ Set.toList
64 $ Set.unions
65 $ map piBuildTools
66 $ Map.elems
67 $ Map.filterWithKey isSelected m
68 where
69 unPackageName (PackageName pn) = pn
70 isSelected name _ = name `Set.member` selected
71 selected = Set.fromList $ Map.keys packages
73 -- Build tools shipped with GHC which we should not attempt to build
74 -- ourselves.
75 coreTools = Set.fromList $ map PackageName $ words "hsc2hs"
77 -- The map from build tool name to the package it comes from.
78 buildToolMap = Map.unions $ map toBuildToolMap $ Map.toList m
79 toBuildToolMap :: (PackageName, PackageInfo) -> Map Executable (PackageName, Version)
80 toBuildToolMap (pn, pi) = Map.unions
81 $ map (flip Map.singleton (pn, piVersion pi))
82 $ Set.toList
83 $ piExecs pi