on master help sign in
Merge pull request #268 from fpco/overlay
abca932Michael Snoyman
Stackage/Build.hs+1
@@ -39,6 +39,7 @@ defaultBuildSettings cores version = BuildSettings
39 , buildDocs = True
39 , buildDocs = True
40 , tarballDir = "patching/tarballs"
40 , tarballDir = "patching/tarballs"
41 , cabalFileDir = Nothing
41 , cabalFileDir = Nothing
42+ , underlayPackageDirs = []
42 }
43 }
43
44
44build :: BuildSettings -> BuildPlan -> IO ()
45build :: BuildSettings -> BuildPlan -> IO ()
Stackage/CheckPlan.hs+1−1
@@ -24,7 +24,7 @@ checkPlan settings bp = do
24 putStrLn "Checking build plan"
24 putStrLn "Checking build plan"
25 packages <- mapM (replaceTarball $ tarballDir settings) (bpPackageList bp)
25 packages <- mapM (replaceTarball $ tarballDir settings) (bpPackageList bp)
26 (ec, dryRun', stderr) <- readProcessWithExitCode "cabal"
26 (ec, dryRun', stderr) <- readProcessWithExitCode "cabal"
27− ( addCabalArgsOnlyGlobal
27+ ( addCabalArgsOnlyGlobal settings
28 $ "install"
28 $ "install"
29 : "--dry-run"
29 : "--dry-run"
30 : "--max-backjumps=-1"
30 : "--max-backjumps=-1"
Stackage/GhcPkg.hs+15−3
@@ -7,9 +7,9 @@ import Distribution.Version (Version (Version))
7import Data.Char (isSpace)
7import Data.Char (isSpace)
8import qualified Data.Set as Set
8import qualified Data.Set as Set
9
9
10−getGlobalPackages :: GhcMajorVersion -> IO (Set PackageIdentifier)
10+getPackages :: [String] -> GhcMajorVersion -> IO (Set PackageIdentifier)
11−getGlobalPackages version = do
11+getPackages extraArgs version = do
12− output <- readProcess "ghc-pkg" [arg, "list"] ""
12+ output <- readProcess "ghc-pkg" (extraArgs ++ [arg, "list"]) ""
13 fmap Set.unions $ mapM parse $ drop 1 $ lines output
13 fmap Set.unions $ mapM parse $ drop 1 $ lines output
14 where
14 where
15 -- Account for a change in command line option name
15 -- Account for a change in command line option name
@@ -28,6 +28,18 @@ getGlobalPackages version = do
28 | last x == ')' = tail $ init $ x
28 | last x == ')' = tail $ init $ x
29 stripParens x = x
29 stripParens x = x
30
30
31+getGlobalPackages :: GhcMajorVersion -> IO (Set PackageIdentifier)
32+getGlobalPackages version = getPackages [] version
33+
34+getDBPackages :: [FilePath] -> GhcMajorVersion -> IO (Set PackageIdentifier)
35+getDBPackages [] _ = return Set.empty
36+getDBPackages packageDirs version =
37+ getPackages (map packageDbArg packageDirs) version
38+ where
39+ packageDbArg db
40+ | version >= GhcMajorVersion 7 6 = "--package-db=" ++ db
41+ | otherwise = "--package-conf" ++ db
42+
31getGhcVersion :: IO GhcMajorVersion
43getGhcVersion :: IO GhcMajorVersion
32getGhcVersion = do
44getGhcVersion = do
33 versionOutput <- readProcess "ghc-pkg" ["--version"] ""
45 versionOutput <- readProcess "ghc-pkg" ["--version"] ""
Stackage/InstallInfo.hs+6−5
@@ -44,18 +44,19 @@ getInstallInfo settings = do
44 _ -> do
44 _ -> do
45 putStrLn "Loading core packages from global database"
45 putStrLn "Loading core packages from global database"
46 getGlobalPackages $ selectGhcVersion settings
46 getGlobalPackages $ selectGhcVersion settings
47+ underlay <- getDBPackages (selectUnderlayPackageDirs settings) (selectGhcVersion settings)
48+ let underlaySet = Set.map pkgName underlay
47− let coreMap = Map.unions
49+ coreMap = Map.unions
48 $ map (\(PackageIdentifier k v) -> Map.singleton k v)
50 $ map (\(PackageIdentifier k v) -> Map.singleton k v)
49 $ Set.toList core
51 $ Set.toList core
50−
51− let allPackages' =
52+ allPackages' =
52 case mhp of
53 case mhp of
53 Just hp | requireHaskellPlatform settings ->
54 Just hp | requireHaskellPlatform settings ->
54 Map.union (stablePackages settings $ requireHaskellPlatform settings)
55 Map.union (stablePackages settings $ requireHaskellPlatform settings)
55 $ identsToRanges (hplibs hp)
56 $ identsToRanges (hplibs hp)
56 _ -> stablePackages settings $ requireHaskellPlatform settings
57 _ -> stablePackages settings $ requireHaskellPlatform settings
57 allPackages = dropExcluded settings allPackages'
58 allPackages = dropExcluded settings allPackages'
58− let totalCore
59+ totalCore
59 | ignoreUpgradeableCore settings =
60 | ignoreUpgradeableCore settings =
60 Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
61 Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
61 | otherwise =
62 | otherwise =
@@ -63,7 +64,7 @@ getInstallInfo settings = do
63 `Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
64 `Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
64
65
65 putStrLn "Loading package database"
66 putStrLn "Loading package database"
66− pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages
67+ pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages underlaySet
67
68
68 putStrLn "Narrowing package database"
69 putStrLn "Narrowing package database"
69 (final, errs) <- narrowPackageDB settings (Map.keysSet totalCore) pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
70 (final, errs) <- narrowPackageDB settings (Map.keysSet totalCore) pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
Stackage/LoadDatabase.hs+8−2
@@ -64,14 +64,16 @@ loadPackageDB :: SelectSettings
64 -> Map PackageName Version -- ^ core packages from HP file
64 -> Map PackageName Version -- ^ core packages from HP file
65 -> Set PackageName -- ^ all core packages, including extras
65 -> Set PackageName -- ^ all core packages, including extras
66 -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
66 -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
67+ -> Set PackageName -- ^ underlay packages to exclude
67 -> IO PackageDB
68 -> IO PackageDB
68−loadPackageDB settings coreMap core deps = do
69+loadPackageDB settings coreMap core deps underlay = do
69 tarName <- getTarballName
70 tarName <- getTarballName
70 lbs <- L.readFile tarName
71 lbs <- L.readFile tarName
71 pdb <- addEntries mempty $ Tar.read lbs
72 pdb <- addEntries mempty $ Tar.read lbs
72 contents <- handle (\(_ :: IOException) -> return [])
73 contents <- handle (\(_ :: IOException) -> return [])
73 $ getDirectoryContents $ selectTarballDir settings
74 $ getDirectoryContents $ selectTarballDir settings
74− foldM addTarball pdb $ mapMaybe stripTarGz contents
75+ pdb' <- foldM addTarball pdb $ mapMaybe stripTarGz contents
76+ return $ excludeUnderlay pdb'
75 where
77 where
76 addEntries _ (Tar.Fail e) = error $ show e
78 addEntries _ (Tar.Fail e) = error $ show e
77 addEntries db Tar.Done = return db
79 addEntries db Tar.Done = return db
@@ -117,6 +119,10 @@ loadPackageDB settings coreMap core deps = do
117 where
119 where
118 tarball = selectTarballDir settings </> tarball' <.> "tar.gz"
120 tarball = selectTarballDir settings </> tarball' <.> "tar.gz"
119
121
122+ excludeUnderlay :: PackageDB -> PackageDB
123+ excludeUnderlay (PackageDB pdb) =
124+ PackageDB $ Map.filterWithKey (\k _ -> Set.notMember k underlay) pdb
125+
120 skipTests p = p `Set.member` skippedTests settings
126 skipTests p = p `Set.member` skippedTests settings
121
127
122 -- Find the relevant cabal file in the given entries and add its contents
128 -- Find the relevant cabal file in the given entries and add its contents
Stackage/Select.hs+1
@@ -53,6 +53,7 @@ defaultSelectSettings version = SelectSettings
53 else Set.empty
53 else Set.empty
54 , selectGhcVersion = version
54 , selectGhcVersion = version
55 , selectTarballDir = "patching/tarballs"
55 , selectTarballDir = "patching/tarballs"
56+ , selectUnderlayPackageDirs = []
56 }
57 }
57
58
58select :: SelectSettings -> IO BuildPlan
59select :: SelectSettings -> IO BuildPlan
Stackage/Types.hs+4
@@ -126,6 +126,8 @@ data SelectSettings = SelectSettings
126 , selectGhcVersion :: GhcMajorVersion
126 , selectGhcVersion :: GhcMajorVersion
127 , selectTarballDir :: FilePath
127 , selectTarballDir :: FilePath
128 -- ^ Directory containing replacement tarballs.
128 -- ^ Directory containing replacement tarballs.
129+ , selectUnderlayPackageDirs :: [FilePath]
130+ -- ^ Additional package directories to reference
129 }
131 }
130
132
131data BuildStage = BSTools | BSBuild | BSTest
133data BuildStage = BSTools | BSBuild | BSTest
@@ -142,6 +144,8 @@ data BuildSettings = BuildSettings
142 -- ^ Directory containing replacement tarballs.
144 -- ^ Directory containing replacement tarballs.
143 , cabalFileDir :: Maybe FilePath
145 , cabalFileDir :: Maybe FilePath
144 -- ^ Directory to place cabal files in
146 -- ^ Directory to place cabal files in
147+ , underlayPackageDirs :: [FilePath]
148+ -- ^ Additional package directories to reference
145 }
149 }
146
150
147-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
151-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
Stackage/Util.hs+8−7
@@ -17,9 +17,9 @@ import Distribution.Text (display, simpleParse)
17import Distribution.Version (thisVersion)
17import Distribution.Version (thisVersion)
18import Stackage.Types
18import Stackage.Types
19import System.Directory (doesDirectoryExist,
19import System.Directory (doesDirectoryExist,
20− removeDirectoryRecursive)
20+ removeDirectoryRecursive,
21−import System.Directory (getAppUserDataDirectory
21+ getAppUserDataDirectory,
22− ,canonicalizePath,
22+ canonicalizePath,
23 createDirectoryIfMissing, doesFileExist)
23 createDirectoryIfMissing, doesFileExist)
24import System.Environment (getEnvironment)
24import System.Environment (getEnvironment)
25import System.FilePath ((</>), (<.>))
25import System.FilePath ((</>), (<.>))
@@ -106,15 +106,16 @@ binDir = (</> "bin") . sandboxRoot
106dataDir = (</> "share") . sandboxRoot
106dataDir = (</> "share") . sandboxRoot
107docDir x = sandboxRoot x </> "share" </> "doc" </> "$pkgid"
107docDir x = sandboxRoot x </> "share" </> "doc" </> "$pkgid"
108
108
109−addCabalArgsOnlyGlobal :: [String] -> [String]
109+addCabalArgsOnlyGlobal :: BuildSettings -> [String] -> [String]
110−addCabalArgsOnlyGlobal rest
110+addCabalArgsOnlyGlobal settings rest
111 = "--package-db=clear"
111 = "--package-db=clear"
112 : "--package-db=global"
112 : "--package-db=global"
113+ : map ("--package-db=" ++) (underlayPackageDirs settings)
113− : rest
114+ ++ rest
114
115
115addCabalArgs :: BuildSettings -> BuildStage -> [String] -> [String]
116addCabalArgs :: BuildSettings -> BuildStage -> [String] -> [String]
116addCabalArgs settings bs rest
117addCabalArgs settings bs rest
117− = addCabalArgsOnlyGlobal
118+ = addCabalArgsOnlyGlobal settings
118 $ ("--package-db=" ++ packageDir settings ++ toolsSuffix)
119 $ ("--package-db=" ++ packageDir settings ++ toolsSuffix)
119 : ("--libdir=" ++ libDir settings ++ toolsSuffix)
120 : ("--libdir=" ++ libDir settings ++ toolsSuffix)
120 : ("--bindir=" ++ binDir settings)
121 : ("--bindir=" ++ binDir settings)