on master help sign in
Support for building "overlay" package databases
commit0a951f2601adeb967945e9bafc4d817d9798b30e authorEmanuel Borsboom <manny@fpcomplete.com> dateSun 20 Jul 2014, 15:21 (12 years ago) parent71cb0e3
8 files changed+44−18
Stackage/Build.hs+1 Stackage/CheckPlan.hs+1−1 Stackage/GhcPkg.hs+15−3 Stackage/InstallInfo.hs+6−5 Stackage/LoadDatabase.hs+8−2 Stackage/Select.hs+1 Stackage/Types.hs+4 Stackage/Util.hs+8−7
Stackage/Build.hs+1
@@ -39,6 +39,7 @@ defaultBuildSettings cores version = BuildSettings
3939 , buildDocs = True
4040 , tarballDir = "patching/tarballs"
4141 , cabalFileDir = Nothing
42+ , underlayPackageDirs = []
4243 }
4344
4445build :: BuildSettings -> BuildPlan -> IO ()
Stackage/CheckPlan.hs+1−1
@@ -24,7 +24,7 @@ checkPlan settings bp = do
2424 putStrLn "Checking build plan"
2525 packages <- mapM (replaceTarball $ tarballDir settings) (bpPackageList bp)
2626 (ec, dryRun', stderr) <- readProcessWithExitCode "cabal"
27− ( addCabalArgsOnlyGlobal
27+ ( addCabalArgsOnlyGlobal settings
2828 $ "install"
2929 : "--dry-run"
3030 : "--max-backjumps=-1"
Stackage/GhcPkg.hs+15−3
@@ -7,9 +7,9 @@ import Distribution.Version (Version (Version))
77import Data.Char (isSpace)
88import qualified Data.Set as Set
99
10−getGlobalPackages :: GhcMajorVersion -> IO (Set PackageIdentifier)
11−getGlobalPackages version = do
12− output <- readProcess "ghc-pkg" [arg, "list"] ""
10+getPackages :: [String] -> GhcMajorVersion -> IO (Set PackageIdentifier)
11+getPackages extraArgs version = do
12+ output <- readProcess "ghc-pkg" (extraArgs ++ [arg, "list"]) ""
1313 fmap Set.unions $ mapM parse $ drop 1 $ lines output
1414 where
1515 -- Account for a change in command line option name
@@ -28,6 +28,18 @@ getGlobalPackages version = do
2828 | last x == ')' = tail $ init $ x
2929 stripParens x = x
3030
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+
3143getGhcVersion :: IO GhcMajorVersion
3244getGhcVersion = do
3345 versionOutput <- readProcess "ghc-pkg" ["--version"] ""
Stackage/InstallInfo.hs+6−5
@@ -44,18 +44,19 @@ getInstallInfo settings = do
4444 _ -> do
4545 putStrLn "Loading core packages from global database"
4646 getGlobalPackages $ selectGhcVersion settings
47− let coreMap = Map.unions
47+ underlay <- getDBPackages (selectUnderlayPackageDirs settings) (selectGhcVersion settings)
48+ let underlaySet = Set.map pkgName underlay
49+ coreMap = Map.unions
4850 $ map (\(PackageIdentifier k v) -> Map.singleton k v)
4951 $ Set.toList core
50−
51− let allPackages' =
52+ allPackages' =
5253 case mhp of
5354 Just hp | requireHaskellPlatform settings ->
5455 Map.union (stablePackages settings $ requireHaskellPlatform settings)
5556 $ identsToRanges (hplibs hp)
5657 _ -> stablePackages settings $ requireHaskellPlatform settings
5758 allPackages = dropExcluded settings allPackages'
58− let totalCore
59+ totalCore
5960 | ignoreUpgradeableCore settings =
6061 Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
6162 | otherwise =
@@ -63,7 +64,7 @@ getInstallInfo settings = do
6364 `Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
6465
6566 putStrLn "Loading package database"
66− pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages
67+ pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages underlaySet
6768
6869 putStrLn "Narrowing package database"
6970 (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
6464 -> Map PackageName Version -- ^ core packages from HP file
6565 -> Set PackageName -- ^ all core packages, including extras
6666 -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
67+ -> Set PackageName -- ^ underlay packages to exclude
6768 -> IO PackageDB
68−loadPackageDB settings coreMap core deps = do
69+loadPackageDB settings coreMap core deps underlay = do
6970 tarName <- getTarballName
7071 lbs <- L.readFile tarName
7172 pdb <- addEntries mempty $ Tar.read lbs
7273 contents <- handle (\(_ :: IOException) -> return [])
7374 $ getDirectoryContents $ selectTarballDir settings
74− foldM addTarball pdb $ mapMaybe stripTarGz contents
75+ pdb' <- foldM addTarball pdb $ mapMaybe stripTarGz contents
76+ return $ excludeUnderlay pdb'
7577 where
7678 addEntries _ (Tar.Fail e) = error $ show e
7779 addEntries db Tar.Done = return db
@@ -117,6 +119,10 @@ loadPackageDB settings coreMap core deps = do
117119 where
118120 tarball = selectTarballDir settings </> tarball' <.> "tar.gz"
119121
122+ excludeUnderlay :: PackageDB -> PackageDB
123+ excludeUnderlay (PackageDB pdb) =
124+ PackageDB $ Map.filterWithKey (\k _ -> Set.notMember k underlay) pdb
125+
120126 skipTests p = p `Set.member` skippedTests settings
121127
122128 -- Find the relevant cabal file in the given entries and add its contents
Stackage/Select.hs+1
@@ -53,6 +53,7 @@ defaultSelectSettings version = SelectSettings
5353 else Set.empty
5454 , selectGhcVersion = version
5555 , selectTarballDir = "patching/tarballs"
56+ , selectUnderlayPackageDirs = []
5657 }
5758
5859select :: SelectSettings -> IO BuildPlan
Stackage/Types.hs+4
@@ -126,6 +126,8 @@ data SelectSettings = SelectSettings
126126 , selectGhcVersion :: GhcMajorVersion
127127 , selectTarballDir :: FilePath
128128 -- ^ Directory containing replacement tarballs.
129+ , selectUnderlayPackageDirs :: [FilePath]
130+ -- ^ Additional package directories to reference
129131 }
130132
131133data BuildStage = BSTools | BSBuild | BSTest
@@ -142,6 +144,8 @@ data BuildSettings = BuildSettings
142144 -- ^ Directory containing replacement tarballs.
143145 , cabalFileDir :: Maybe FilePath
144146 -- ^ Directory to place cabal files in
147+ , underlayPackageDirs :: [FilePath]
148+ -- ^ Additional package directories to reference
145149 }
146150
147151-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
Stackage/Util.hs+8−7
@@ -17,9 +17,9 @@ import Distribution.Text (display, simpleParse)
1717import Distribution.Version (thisVersion)
1818import Stackage.Types
1919import System.Directory (doesDirectoryExist,
20− removeDirectoryRecursive)
21−import System.Directory (getAppUserDataDirectory
22− ,canonicalizePath,
20+ removeDirectoryRecursive,
21+ getAppUserDataDirectory,
22+ canonicalizePath,
2323 createDirectoryIfMissing, doesFileExist)
2424import System.Environment (getEnvironment)
2525import System.FilePath ((</>), (<.>))
@@ -106,15 +106,16 @@ binDir = (</> "bin") . sandboxRoot
106106dataDir = (</> "share") . sandboxRoot
107107docDir x = sandboxRoot x </> "share" </> "doc" </> "$pkgid"
108108
109−addCabalArgsOnlyGlobal :: [String] -> [String]
110−addCabalArgsOnlyGlobal rest
109+addCabalArgsOnlyGlobal :: BuildSettings -> [String] -> [String]
110+addCabalArgsOnlyGlobal settings rest
111111 = "--package-db=clear"
112112 : "--package-db=global"
113− : rest
113+ : map ("--package-db=" ++) (underlayPackageDirs settings)
114+ ++ rest
114115
115116addCabalArgs :: BuildSettings -> BuildStage -> [String] -> [String]
116117addCabalArgs settings bs rest
117− = addCabalArgsOnlyGlobal
118+ = addCabalArgsOnlyGlobal settings
118119 $ ("--package-db=" ++ packageDir settings ++ toolsSuffix)
119120 : ("--libdir=" ++ libDir settings ++ toolsSuffix)
120121 : ("--bindir=" ++ binDir settings)