mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-01-22 12:11:56 +01:00
Merge pull request #268 from fpco/overlay
Support for building "overlay" package databases
This commit is contained in:
commit
abca932bc4
@ -39,6 +39,7 @@ defaultBuildSettings cores version = BuildSettings
|
|||||||
, buildDocs = True
|
, buildDocs = True
|
||||||
, tarballDir = "patching/tarballs"
|
, tarballDir = "patching/tarballs"
|
||||||
, cabalFileDir = Nothing
|
, cabalFileDir = Nothing
|
||||||
|
, underlayPackageDirs = []
|
||||||
}
|
}
|
||||||
|
|
||||||
build :: BuildSettings -> BuildPlan -> IO ()
|
build :: BuildSettings -> BuildPlan -> IO ()
|
||||||
|
|||||||
@ -24,7 +24,7 @@ checkPlan settings bp = do
|
|||||||
putStrLn "Checking build plan"
|
putStrLn "Checking build plan"
|
||||||
packages <- mapM (replaceTarball $ tarballDir settings) (bpPackageList bp)
|
packages <- mapM (replaceTarball $ tarballDir settings) (bpPackageList bp)
|
||||||
(ec, dryRun', stderr) <- readProcessWithExitCode "cabal"
|
(ec, dryRun', stderr) <- readProcessWithExitCode "cabal"
|
||||||
( addCabalArgsOnlyGlobal
|
( addCabalArgsOnlyGlobal settings
|
||||||
$ "install"
|
$ "install"
|
||||||
: "--dry-run"
|
: "--dry-run"
|
||||||
: "--max-backjumps=-1"
|
: "--max-backjumps=-1"
|
||||||
|
|||||||
@ -7,9 +7,9 @@ import Distribution.Version (Version (Version))
|
|||||||
import Data.Char (isSpace)
|
import Data.Char (isSpace)
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
|
||||||
getGlobalPackages :: GhcMajorVersion -> IO (Set PackageIdentifier)
|
getPackages :: [String] -> GhcMajorVersion -> IO (Set PackageIdentifier)
|
||||||
getGlobalPackages version = do
|
getPackages extraArgs version = do
|
||||||
output <- readProcess "ghc-pkg" [arg, "list"] ""
|
output <- readProcess "ghc-pkg" (extraArgs ++ [arg, "list"]) ""
|
||||||
fmap Set.unions $ mapM parse $ drop 1 $ lines output
|
fmap Set.unions $ mapM parse $ drop 1 $ lines output
|
||||||
where
|
where
|
||||||
-- Account for a change in command line option name
|
-- Account for a change in command line option name
|
||||||
@ -28,6 +28,18 @@ getGlobalPackages version = do
|
|||||||
| last x == ')' = tail $ init $ x
|
| last x == ')' = tail $ init $ x
|
||||||
stripParens x = x
|
stripParens x = x
|
||||||
|
|
||||||
|
getGlobalPackages :: GhcMajorVersion -> IO (Set PackageIdentifier)
|
||||||
|
getGlobalPackages version = getPackages [] version
|
||||||
|
|
||||||
|
getDBPackages :: [FilePath] -> GhcMajorVersion -> IO (Set PackageIdentifier)
|
||||||
|
getDBPackages [] _ = return Set.empty
|
||||||
|
getDBPackages packageDirs version =
|
||||||
|
getPackages (map packageDbArg packageDirs) version
|
||||||
|
where
|
||||||
|
packageDbArg db
|
||||||
|
| version >= GhcMajorVersion 7 6 = "--package-db=" ++ db
|
||||||
|
| otherwise = "--package-conf" ++ db
|
||||||
|
|
||||||
getGhcVersion :: IO GhcMajorVersion
|
getGhcVersion :: IO GhcMajorVersion
|
||||||
getGhcVersion = do
|
getGhcVersion = do
|
||||||
versionOutput <- readProcess "ghc-pkg" ["--version"] ""
|
versionOutput <- readProcess "ghc-pkg" ["--version"] ""
|
||||||
|
|||||||
@ -44,18 +44,19 @@ getInstallInfo settings = do
|
|||||||
_ -> do
|
_ -> do
|
||||||
putStrLn "Loading core packages from global database"
|
putStrLn "Loading core packages from global database"
|
||||||
getGlobalPackages $ selectGhcVersion settings
|
getGlobalPackages $ selectGhcVersion settings
|
||||||
let coreMap = Map.unions
|
underlay <- getDBPackages (selectUnderlayPackageDirs settings) (selectGhcVersion settings)
|
||||||
|
let underlaySet = Set.map pkgName underlay
|
||||||
|
coreMap = Map.unions
|
||||||
$ map (\(PackageIdentifier k v) -> Map.singleton k v)
|
$ map (\(PackageIdentifier k v) -> Map.singleton k v)
|
||||||
$ Set.toList core
|
$ Set.toList core
|
||||||
|
allPackages' =
|
||||||
let allPackages' =
|
|
||||||
case mhp of
|
case mhp of
|
||||||
Just hp | requireHaskellPlatform settings ->
|
Just hp | requireHaskellPlatform settings ->
|
||||||
Map.union (stablePackages settings $ requireHaskellPlatform settings)
|
Map.union (stablePackages settings $ requireHaskellPlatform settings)
|
||||||
$ identsToRanges (hplibs hp)
|
$ identsToRanges (hplibs hp)
|
||||||
_ -> stablePackages settings $ requireHaskellPlatform settings
|
_ -> stablePackages settings $ requireHaskellPlatform settings
|
||||||
allPackages = dropExcluded settings allPackages'
|
allPackages = dropExcluded settings allPackages'
|
||||||
let totalCore
|
totalCore
|
||||||
| ignoreUpgradeableCore settings =
|
| ignoreUpgradeableCore settings =
|
||||||
Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
|
Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
|
||||||
| otherwise =
|
| otherwise =
|
||||||
@ -63,7 +64,7 @@ getInstallInfo settings = do
|
|||||||
`Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
|
`Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
|
||||||
|
|
||||||
putStrLn "Loading package database"
|
putStrLn "Loading package database"
|
||||||
pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages
|
pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages underlaySet
|
||||||
|
|
||||||
putStrLn "Narrowing package database"
|
putStrLn "Narrowing package database"
|
||||||
(final, errs) <- narrowPackageDB settings (Map.keysSet totalCore) pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
|
(final, errs) <- narrowPackageDB settings (Map.keysSet totalCore) pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
|
||||||
|
|||||||
@ -64,14 +64,16 @@ loadPackageDB :: SelectSettings
|
|||||||
-> Map PackageName Version -- ^ core packages from HP file
|
-> Map PackageName Version -- ^ core packages from HP file
|
||||||
-> Set PackageName -- ^ all core packages, including extras
|
-> Set PackageName -- ^ all core packages, including extras
|
||||||
-> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
|
-> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
|
||||||
|
-> Set PackageName -- ^ underlay packages to exclude
|
||||||
-> IO PackageDB
|
-> IO PackageDB
|
||||||
loadPackageDB settings coreMap core deps = do
|
loadPackageDB settings coreMap core deps underlay = do
|
||||||
tarName <- getTarballName
|
tarName <- getTarballName
|
||||||
lbs <- L.readFile tarName
|
lbs <- L.readFile tarName
|
||||||
pdb <- addEntries mempty $ Tar.read lbs
|
pdb <- addEntries mempty $ Tar.read lbs
|
||||||
contents <- handle (\(_ :: IOException) -> return [])
|
contents <- handle (\(_ :: IOException) -> return [])
|
||||||
$ getDirectoryContents $ selectTarballDir settings
|
$ getDirectoryContents $ selectTarballDir settings
|
||||||
foldM addTarball pdb $ mapMaybe stripTarGz contents
|
pdb' <- foldM addTarball pdb $ mapMaybe stripTarGz contents
|
||||||
|
return $ excludeUnderlay pdb'
|
||||||
where
|
where
|
||||||
addEntries _ (Tar.Fail e) = error $ show e
|
addEntries _ (Tar.Fail e) = error $ show e
|
||||||
addEntries db Tar.Done = return db
|
addEntries db Tar.Done = return db
|
||||||
@ -117,6 +119,10 @@ loadPackageDB settings coreMap core deps = do
|
|||||||
where
|
where
|
||||||
tarball = selectTarballDir settings </> tarball' <.> "tar.gz"
|
tarball = selectTarballDir settings </> tarball' <.> "tar.gz"
|
||||||
|
|
||||||
|
excludeUnderlay :: PackageDB -> PackageDB
|
||||||
|
excludeUnderlay (PackageDB pdb) =
|
||||||
|
PackageDB $ Map.filterWithKey (\k _ -> Set.notMember k underlay) pdb
|
||||||
|
|
||||||
skipTests p = p `Set.member` skippedTests settings
|
skipTests p = p `Set.member` skippedTests settings
|
||||||
|
|
||||||
-- Find the relevant cabal file in the given entries and add its contents
|
-- Find the relevant cabal file in the given entries and add its contents
|
||||||
|
|||||||
@ -53,6 +53,7 @@ defaultSelectSettings version = SelectSettings
|
|||||||
else Set.empty
|
else Set.empty
|
||||||
, selectGhcVersion = version
|
, selectGhcVersion = version
|
||||||
, selectTarballDir = "patching/tarballs"
|
, selectTarballDir = "patching/tarballs"
|
||||||
|
, selectUnderlayPackageDirs = []
|
||||||
}
|
}
|
||||||
|
|
||||||
select :: SelectSettings -> IO BuildPlan
|
select :: SelectSettings -> IO BuildPlan
|
||||||
|
|||||||
@ -126,6 +126,8 @@ data SelectSettings = SelectSettings
|
|||||||
, selectGhcVersion :: GhcMajorVersion
|
, selectGhcVersion :: GhcMajorVersion
|
||||||
, selectTarballDir :: FilePath
|
, selectTarballDir :: FilePath
|
||||||
-- ^ Directory containing replacement tarballs.
|
-- ^ Directory containing replacement tarballs.
|
||||||
|
, selectUnderlayPackageDirs :: [FilePath]
|
||||||
|
-- ^ Additional package directories to reference
|
||||||
}
|
}
|
||||||
|
|
||||||
data BuildStage = BSTools | BSBuild | BSTest
|
data BuildStage = BSTools | BSBuild | BSTest
|
||||||
@ -142,6 +144,8 @@ data BuildSettings = BuildSettings
|
|||||||
-- ^ Directory containing replacement tarballs.
|
-- ^ Directory containing replacement tarballs.
|
||||||
, cabalFileDir :: Maybe FilePath
|
, cabalFileDir :: Maybe FilePath
|
||||||
-- ^ Directory to place cabal files in
|
-- ^ Directory to place cabal files in
|
||||||
|
, underlayPackageDirs :: [FilePath]
|
||||||
|
-- ^ Additional package directories to reference
|
||||||
}
|
}
|
||||||
|
|
||||||
-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
|
-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
|
||||||
|
|||||||
@ -17,9 +17,9 @@ import Distribution.Text (display, simpleParse)
|
|||||||
import Distribution.Version (thisVersion)
|
import Distribution.Version (thisVersion)
|
||||||
import Stackage.Types
|
import Stackage.Types
|
||||||
import System.Directory (doesDirectoryExist,
|
import System.Directory (doesDirectoryExist,
|
||||||
removeDirectoryRecursive)
|
removeDirectoryRecursive,
|
||||||
import System.Directory (getAppUserDataDirectory
|
getAppUserDataDirectory,
|
||||||
,canonicalizePath,
|
canonicalizePath,
|
||||||
createDirectoryIfMissing, doesFileExist)
|
createDirectoryIfMissing, doesFileExist)
|
||||||
import System.Environment (getEnvironment)
|
import System.Environment (getEnvironment)
|
||||||
import System.FilePath ((</>), (<.>))
|
import System.FilePath ((</>), (<.>))
|
||||||
@ -106,15 +106,16 @@ binDir = (</> "bin") . sandboxRoot
|
|||||||
dataDir = (</> "share") . sandboxRoot
|
dataDir = (</> "share") . sandboxRoot
|
||||||
docDir x = sandboxRoot x </> "share" </> "doc" </> "$pkgid"
|
docDir x = sandboxRoot x </> "share" </> "doc" </> "$pkgid"
|
||||||
|
|
||||||
addCabalArgsOnlyGlobal :: [String] -> [String]
|
addCabalArgsOnlyGlobal :: BuildSettings -> [String] -> [String]
|
||||||
addCabalArgsOnlyGlobal rest
|
addCabalArgsOnlyGlobal settings rest
|
||||||
= "--package-db=clear"
|
= "--package-db=clear"
|
||||||
: "--package-db=global"
|
: "--package-db=global"
|
||||||
: rest
|
: map ("--package-db=" ++) (underlayPackageDirs settings)
|
||||||
|
++ rest
|
||||||
|
|
||||||
addCabalArgs :: BuildSettings -> BuildStage -> [String] -> [String]
|
addCabalArgs :: BuildSettings -> BuildStage -> [String] -> [String]
|
||||||
addCabalArgs settings bs rest
|
addCabalArgs settings bs rest
|
||||||
= addCabalArgsOnlyGlobal
|
= addCabalArgsOnlyGlobal settings
|
||||||
$ ("--package-db=" ++ packageDir settings ++ toolsSuffix)
|
$ ("--package-db=" ++ packageDir settings ++ toolsSuffix)
|
||||||
: ("--libdir=" ++ libDir settings ++ toolsSuffix)
|
: ("--libdir=" ++ libDir settings ++ toolsSuffix)
|
||||||
: ("--bindir=" ++ binDir settings)
|
: ("--bindir=" ++ binDir settings)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user