1{-# LANGUAGE PatternGuards #-}
5 , defaultSelectSettings
8import Data.Either (partitionEithers)
9import qualified Data.Map as Map
10import Data.Maybe (mapMaybe)
11import Data.Set (empty)
12import qualified Data.Set as Set
13import Distribution.Text (simpleParse)
14import Distribution.Version (withinRange)
15import Prelude hiding (pi)
17import Stackage.InstallInfo
21defaultSelectSettings :: GhcMajorVersion -> SelectSettings
22defaultSelectSettings version = SelectSettings
23 { extraCore = defaultExtraCore version
24 , expectedFailuresSelect = defaultExpectedFailures version
25 , stablePackages = defaultStablePackages version
26 , haskellPlatformDir = "hp"
27 , requireHaskellPlatform = True
28 , ignoreUpgradeableCore = False
29 , excludedPackages = empty
31 Set.fromList (words "blaze_html_0_5 small_base") `Set.union`
33#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
34 -- Needed on Windows to get unix-compat to compile
35 (if version >= GhcMajorVersion 7 6 then Set.empty else Set.fromList (words "old-time"))
38 -- Support for containers-unicode-symbols
39 (case Map.lookup (PackageName "containers") coreMap of
40 Just v | Just range <- simpleParse "< 0.5", v `withinRange` range
41 -> Set.singleton "containers-old"
43 , disabledFlags = Set.fromList (words "bytestring-in-base test-hlint")
45 (if version <= GhcMajorVersion 7 4
46 then Set.singleton "bytestring-builder"
48 , allowedPackage = const $ Right ()
49 , useGlobalDatabase = False
51 if version >= GhcMajorVersion 7 8
52 then Set.singleton (PackageName "punycode") -- pulls in encoding
54 , selectGhcVersion = version
55 , selectTarballDir = "patching/tarballs"
56 , selectUnderlayPackageDirs = []
59select :: SelectSettings -> IO BuildPlan
61 ii <- getInstallInfo settings'
64 case iiBuildTools ii of
65 Left s -> error $ "Could not topologically sort build tools: " ++ s
70 , bpPackages = iiPackages ii
71 , bpOptionalCore = iiOptionalCore ii
73 , bpSkippedTests = skippedTests settings'
76-- | Get all of the build tools required.
77iiBuildTools :: InstallInfo -> Either String [String]
78iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
79 fmap (map packageVersionString)
82 $ filter (flip Set.notMember coreTools . fst)
85 $ mapMaybe (flip Map.lookup buildToolMap)
90 $ Map.filterWithKey isSelected m
92 isSelected name _ = name `Set.member` selected
93 selected = Set.fromList $ Map.keys packages
95 -- Build tools shipped with GHC which we should not attempt to build
97 coreTools = Set.fromList $ map PackageName $ words "hsc2hs"
99 -- The map from build tool name to the package it comes from.
100 buildToolMap :: Map Executable (PackageName, Version)
101 buildToolMap = Map.unions $ map toBuildToolMap $ Map.toList m
103 toBuildToolMap :: (PackageName, PackageInfo) -> Map Executable (PackageName, Version)
104 toBuildToolMap (pn, pi) = Map.unions
105 $ map (flip Map.singleton (pn, piVersion pi))
109 addDependencies :: (PackageName, Version) -> ((PackageName, Version), Set (PackageName, Version))
110 addDependencies (pn, pv) =
114 case Map.lookup pn m of
116 Just pi -> Set.fromList
117 $ mapMaybe (flip Map.lookup buildToolMap)
121topSort :: (Show a, Ord a) => [(a, Set a)] -> Either String [a]
123 uncurry go . partitionEithers . map (splitter . limitDeps) $ orig
126 | Set.null y = Left x
127 | otherwise = Right (x, y)
130 go [] y = Left $ "The following form a cycle: " ++ show (map fst y)
132 let (xs', ys') = partitionEithers $ map (splitter . dropDep x) ys
133 rest <- go (xs ++ xs') ys'
136 dropDep x (y, z) = (y, Set.delete x z)
138 allVertices = Set.fromList $ map fst orig
139 limitDeps (x, y) = (x, Set.intersection allVertices y)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list