on master help sign in
Separate version selection and building #25
3682ad5Michael Snoyman
.gitignore+1
@@ -13,3 +13,4 @@ cabal-dev
13/sandbox/
13/sandbox/
14/build-tools.log
14/build-tools.log
15/logs-tools/
15/logs-tools/
16+build-plan.txt
Stackage/Build.hs+5−27
@@ -34,30 +34,16 @@ import Stackage.CheckCabalVersion (checkCabalVersion)
34defaultBuildSettings :: BuildSettings
34defaultBuildSettings :: BuildSettings
35defaultBuildSettings = BuildSettings
35defaultBuildSettings = BuildSettings
36 { sandboxRoot = "sandbox"
36 { sandboxRoot = "sandbox"
37− , extraBuildArgs = []
38− , extraCore = defaultExtraCore
39− , expectedFailures = defaultExpectedFailures
37+ , expectedFailuresBuild = defaultExpectedFailures
40− , stablePackages = defaultStablePackages
41 , extraArgs = ["-fnetwork23"]
38 , extraArgs = ["-fnetwork23"]
42− , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
43− , requireHaskellPlatform = True
44− , excludedPackages = empty
45 , testWorkerThreads = 4
39 , testWorkerThreads = 4
46− , flags = Set.fromList $ words "blaze_html_0_5"
47− , allowedPackage = const $ Right ()
48 }
40 }
49
41
50−build :: BuildSettings -> IO ()
42+build :: BuildSettings -> BuildPlan -> IO ()
51−build settings' = do
43+build settings' bp = do
52 putStrLn "Checking Cabal version"
44 putStrLn "Checking Cabal version"
53 libVersion <- checkCabalVersion
45 libVersion <- checkCabalVersion
54
46
55− bp <- select settings'
56−
57− putStrLn "Checking build plan"
58− checkPlan bp
59− putStrLn "No mismatches, starting the sandboxed build."
60−
61 putStrLn "Wiping out old sandbox folder"
47 putStrLn "Wiping out old sandbox folder"
62 rm_r $ sandboxRoot settings'
48 rm_r $ sandboxRoot settings'
63 rm_r "logs"
49 rm_r "logs"
@@ -84,8 +70,7 @@ build settings' = do
84 : "--build-log=logs-tools/$pkg.log"
70 : "--build-log=logs-tools/$pkg.log"
85 : "-j"
71 : "-j"
86 : concat
72 : concat
87− [ extraBuildArgs settings
88− , extraArgs settings
73+ [ extraArgs settings
89 , tools
74 , tools
90 ]
75 ]
91 hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
76 hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
@@ -103,8 +88,7 @@ build settings' = do
103 : "--build-log=logs/$pkg.log"
88 : "--build-log=logs/$pkg.log"
104 : "-j"
89 : "-j"
105 : concat
90 : concat
106− [ extraBuildArgs settings
107− , extraArgs settings
91+ [ extraArgs settings
108 , bpPackageList bp
92 , bpPackageList bp
109 ]
93 ]
110 hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
94 hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
@@ -114,12 +98,6 @@ build settings' = do
114 putStrLn "Build failed, please see build.log"
98 putStrLn "Build failed, please see build.log"
115 exitWith ec
99 exitWith ec
116
100
117− putStrLn "Sandbox built, beginning individual test suites"
118− runTestSuites settings $ bpPackages bp
119−
120− putStrLn "All test suites that were expected to pass did pass, building tarballs."
121− makeTarballs bp
122−
123-- | Get all of the build tools required.
101-- | Get all of the build tools required.
124iiBuildTools :: InstallInfo -> [String]
102iiBuildTools :: InstallInfo -> [String]
125iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
103iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
Stackage/CheckPlan.hs+2
@@ -18,6 +18,7 @@ data Mismatch = OnlyDryRun String | OnlySimpleList String
18
18
19checkPlan :: BuildPlan -> IO ()
19checkPlan :: BuildPlan -> IO ()
20checkPlan bp = do
20checkPlan bp = do
21+ putStrLn "Checking build plan"
21 (ec, dryRun', stderr) <- readProcessWithExitCode "cabal" (addCabalArgsOnlyGlobal $ "install":"--dry-run":bpPackageList bp) ""
22 (ec, dryRun', stderr) <- readProcessWithExitCode "cabal" (addCabalArgsOnlyGlobal $ "install":"--dry-run":bpPackageList bp) ""
22 when (ec /= ExitSuccess || "Warning:" `isPrefixOf` stderr) $ do
23 when (ec /= ExitSuccess || "Warning:" `isPrefixOf` stderr) $ do
23 putStr stderr
24 putStr stderr
@@ -30,6 +31,7 @@ checkPlan bp = do
30 putStrLn "Found the following mismatches"
31 putStrLn "Found the following mismatches"
31 mapM_ print mismatches
32 mapM_ print mismatches
32 exitWith $ ExitFailure 1
33 exitWith $ ExitFailure 1
34+ putStrLn "Build plan checked, no mismatches"
33 where
35 where
34 optionalCore = Set.fromList $ map packageVersionString $ Map.toList $ bpOptionalCore bp
36 optionalCore = Set.fromList $ map packageVersionString $ Map.toList $ bpOptionalCore bp
35 notOptionalCore s = not $ s `Set.member` optionalCore
37 notOptionalCore s = not $ s `Set.member` optionalCore
Stackage/HaskellPlatform.hs+1−1
@@ -11,7 +11,7 @@ import Data.Set (singleton)
11import Distribution.Text (simpleParse)
11import Distribution.Text (simpleParse)
12import Stackage.Types
12import Stackage.Types
13
13
14−loadHaskellPlatform :: BuildSettings -> IO HaskellPlatform
14+loadHaskellPlatform :: SelectSettings -> IO HaskellPlatform
15loadHaskellPlatform = fmap parseHP . readFile . haskellPlatformCabal
15loadHaskellPlatform = fmap parseHP . readFile . haskellPlatformCabal
16
16
17data HPLine = HPLPackage PackageIdentifier
17data HPLine = HPLPackage PackageIdentifier
Stackage/InstallInfo.hs+4−4
@@ -17,13 +17,13 @@ import Stackage.NarrowDatabase
17import Stackage.Types
17import Stackage.Types
18import Stackage.Util
18import Stackage.Util
19
19
20−dropExcluded :: BuildSettings
20+dropExcluded :: SelectSettings
21 -> Map PackageName (VersionRange, Maintainer)
21 -> Map PackageName (VersionRange, Maintainer)
22 -> Map PackageName (VersionRange, Maintainer)
22 -> Map PackageName (VersionRange, Maintainer)
23dropExcluded bs m0 =
23dropExcluded bs m0 =
24 Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
24 Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
25
25
26−getInstallInfo :: BuildSettings -> IO InstallInfo
26+getInstallInfo :: SelectSettings -> IO InstallInfo
27getInstallInfo settings = do
27getInstallInfo settings = do
28 putStrLn "Loading Haskell Platform"
28 putStrLn "Loading Haskell Platform"
29 hp <- loadHaskellPlatform settings
29 hp <- loadHaskellPlatform settings
@@ -96,14 +96,14 @@ bpPackageList :: BuildPlan -> [String]
96bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
96bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
97
97
98-- | Check for internal mismatches in required and actual package versions.
98-- | Check for internal mismatches in required and actual package versions.
99−checkBadVersions :: BuildSettings
99+checkBadVersions :: SelectSettings
100 -> PackageDB
100 -> PackageDB
101 -> Map PackageName BuildInfo
101 -> Map PackageName BuildInfo
102 -> Map String (Map PackageName (Version, VersionRange))
102 -> Map String (Map PackageName (Version, VersionRange))
103checkBadVersions settings (PackageDB pdb) buildPlan =
103checkBadVersions settings (PackageDB pdb) buildPlan =
104 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
104 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
105 where
105 where
106− unexpectedFailure name _ = name `Set.notMember` expectedFailures settings
106+ unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
107
107
108 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
108 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
109 getBadVersions (name, bi)
109 getBadVersions (name, bi)
Stackage/LoadDatabase.hs+1−1
@@ -53,7 +53,7 @@ import Stackage.Util
53-- version.
53-- version.
54--
54--
55-- * For other packages, select the maximum version number.
55-- * For other packages, select the maximum version number.
56−loadPackageDB :: BuildSettings
56+loadPackageDB :: SelectSettings
57 -> Set PackageName -- ^ core packages
57 -> Set PackageName -- ^ core packages
58 -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
58 -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
59 -> IO PackageDB
59 -> IO PackageDB
Stackage/NarrowDatabase.hs+1−1
@@ -10,7 +10,7 @@ import System.Exit (exitFailure)
10
10
11-- | Narrow down the database to only the specified packages and all of
11-- | Narrow down the database to only the specified packages and all of
12-- their dependencies.
12-- their dependencies.
13−narrowPackageDB :: BuildSettings
13+narrowPackageDB :: SelectSettings
14 -> PackageDB
14 -> PackageDB
15 -> Set (PackageName, Maintainer)
15 -> Set (PackageName, Maintainer)
16 -> IO (Map PackageName BuildInfo)
16 -> IO (Map PackageName BuildInfo)
Stackage/Select.hs+20−11
@@ -1,5 +1,6 @@
1module Stackage.Select
1module Stackage.Select
2 ( select
2 ( select
3+ , defaultSelectSettings
3 ) where
4 ) where
4
5
5import Control.Exception (assert)
6import Control.Exception (assert)
@@ -28,20 +29,28 @@ import System.Process (rawSystem, readProcess, runProcess,
28 waitForProcess)
29 waitForProcess)
29import Stackage.BuildPlan
30import Stackage.BuildPlan
30
31
32+defaultSelectSettings :: SelectSettings
33+defaultSelectSettings = 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+ }
43+
31−select :: BuildSettings -> IO BuildPlan
44+select :: SelectSettings -> IO BuildPlan
32select settings' = do
45select settings' = do
33 ii <- getInstallInfo settings'
46 ii <- getInstallInfo settings'
34
47
35− let bp = BuildPlan
48+ return BuildPlan
36− { bpTools = iiBuildTools ii
49+ { bpTools = iiBuildTools ii
37− , bpPackages = iiPackages ii
50+ , bpPackages = iiPackages ii
38− , bpOptionalCore = iiOptionalCore ii
51+ , bpOptionalCore = iiOptionalCore ii
39− , bpCore = iiCore ii
52+ , bpCore = iiCore ii
40− }
53+ }
41−
42− writeBuildPlan "build-plan.txt" bp -- FIXME
43− readBuildPlan "build-plan.txt"
44− --return bp
45
54
46-- | Get all of the build tools required.
55-- | Get all of the build tools required.
47iiBuildTools :: InstallInfo -> [String]
56iiBuildTools :: InstallInfo -> [String]
Stackage/Tarballs.hs+1
@@ -13,6 +13,7 @@ import System.FilePath (takeDirectory)
13
13
14makeTarballs :: BuildPlan -> IO ()
14makeTarballs :: BuildPlan -> IO ()
15makeTarballs bp = do
15makeTarballs bp = do
16+ putStrLn "Building tarballs"
16 tarName <- getTarballName
17 tarName <- getTarballName
17 origEntries <- fmap Tar.read $ L.readFile tarName
18 origEntries <- fmap Tar.read $ L.readFile tarName
18 (stableEntries, extraEntries) <- loop id id origEntries
19 (stableEntries, extraEntries) <- loop id id origEntries
Stackage/Test.hs+5−3
@@ -19,8 +19,10 @@ import System.IO (IOMode (WriteMode, AppendMode),
19 withBinaryFile)
19 withBinaryFile)
20import System.Process (runProcess, waitForProcess)
20import System.Process (runProcess, waitForProcess)
21
21
22−runTestSuites :: BuildSettings -> Map PackageName SelectedPackageInfo -> IO ()
22+runTestSuites :: BuildSettings -> BuildPlan -> IO ()
23−runTestSuites settings selected = do
23+runTestSuites settings bp = do
24+ let selected = bpPackages bp
25+ putStrLn "Running test suites"
24 let testdir = "runtests"
26 let testdir = "runtests"
25 rm_r testdir
27 rm_r testdir
26 createDirectory testdir
28 createDirectory testdir
@@ -99,7 +101,7 @@ runTestSuite settings testdir (packageName, SelectedPackageInfo {..}) = do
99 getHandle AppendMode $ runGhcPackagePath "cabal" ["test"] dir
101 getHandle AppendMode $ runGhcPackagePath "cabal" ["test"] dir
100 getHandle AppendMode $ run "cabal" ["haddock"] dir
102 getHandle AppendMode $ run "cabal" ["haddock"] dir
101 return True
103 return True
102− let expectedFailure = packageName `Set.member` expectedFailures settings
104+ let expectedFailure = packageName `Set.member` expectedFailuresBuild settings
103 if passed
105 if passed
104 then do
106 then do
105 removeFile logfile
107 removeFile logfile
Stackage/Types.hs+18−15
@@ -89,23 +89,12 @@ data BuildPlan = BuildPlan
89newtype Maintainer = Maintainer { unMaintainer :: String }
89newtype Maintainer = Maintainer { unMaintainer :: String }
90 deriving (Show, Eq, Ord, Read)
90 deriving (Show, Eq, Ord, Read)
91
91
92−data BuildSettings = BuildSettings
92+data SelectSettings = SelectSettings
93− { sandboxRoot :: FilePath
94− , extraBuildArgs :: [String]
95− , extraCore :: Set PackageName
96− , expectedFailures :: Set PackageName
97− , stablePackages :: Map PackageName (VersionRange, Maintainer)
98− , extraArgs :: [String]
99− , haskellPlatformCabal :: FilePath
93+ { haskellPlatformCabal :: FilePath
100− , requireHaskellPlatform :: Bool
101− , excludedPackages :: Set PackageName
102− -- ^ Packages which should be dropped from the list of stable packages,
103− -- even if present via the Haskell Platform or @stablePackages@. If these
104− -- packages are dependencies of others, they will still be included.
105− , testWorkerThreads :: Int
106− -- ^ How many threads to spawn for running test suites.
107 , flags :: Set String
94 , flags :: Set String
108 -- ^ Compile flags which should be turned on.
95 -- ^ Compile flags which should be turned on.
96+ , extraCore :: Set PackageName
97+ , requireHaskellPlatform :: Bool
109 , allowedPackage :: GenericPackageDescription -> Either String ()
98 , allowedPackage :: GenericPackageDescription -> Either String ()
110 -- ^ Checks if a package is allowed into the distribution. By default, we
99 -- ^ Checks if a package is allowed into the distribution. By default, we
111 -- allow all packages in, though this could be used to filter out certain
100 -- allow all packages in, though this could be used to filter out certain
@@ -113,6 +102,20 @@ data BuildSettings = BuildSettings
113 --
102 --
114 -- Returns a reason for stripping in Left, or Right if the package is
103 -- Returns a reason for stripping in Left, or Right if the package is
115 -- allowed.
104 -- allowed.
105+ , expectedFailuresSelect :: Set PackageName
106+ , excludedPackages :: Set PackageName
107+ -- ^ Packages which should be dropped from the list of stable packages,
108+ -- even if present via the Haskell Platform or @stablePackages@. If these
109+ -- packages are dependencies of others, they will still be included.
110+ , stablePackages :: Map PackageName (VersionRange, Maintainer)
111+ }
112+
113+data BuildSettings = BuildSettings
114+ { sandboxRoot :: FilePath
115+ , extraArgs :: [String]
116+ , expectedFailuresBuild :: Set PackageName
117+ , testWorkerThreads :: Int
118+ -- ^ How many threads to spawn for running test suites.
116 }
119 }
117
120
118-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
121-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
app/stackage.hs+45−18
@@ -3,24 +3,31 @@ import Stackage.Types
3import Stackage.Build (build, defaultBuildSettings)
3import Stackage.Build (build, defaultBuildSettings)
4import Stackage.Init (stackageInit)
4import Stackage.Init (stackageInit)
5import Stackage.Util (allowPermissive)
5import Stackage.Util (allowPermissive)
6+import Stackage.Select (defaultSelectSettings, select)
7+import Stackage.CheckPlan (checkPlan)
6import System.Environment (getArgs, getProgName)
8import System.Environment (getArgs, getProgName)
7import Data.Set (fromList)
9import Data.Set (fromList)
8import System.IO (hFlush, stdout)
10import System.IO (hFlush, stdout)
11+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
12+import Stackage.Test (runTestSuites)
13+import Stackage.Tarballs (makeTarballs)
9
14
10−data BuildArgs = BuildArgs
15+data SelectArgs = SelectArgs
11 { excluded :: [String]
16 { excluded :: [String]
12 , noPlatform :: Bool
17 , noPlatform :: Bool
13 , onlyPermissive :: Bool
18 , onlyPermissive :: Bool
14 , allowed :: [String]
19 , allowed :: [String]
20+ , buildPlanDest :: FilePath
15 }
21 }
16
22
17−parseBuildArgs :: [String] -> IO BuildArgs
23+parseSelectArgs :: [String] -> IO SelectArgs
18−parseBuildArgs =
24+parseSelectArgs =
19− loop BuildArgs
25+ loop SelectArgs
20 { excluded = []
26 { excluded = []
21 , noPlatform = False
27 , noPlatform = False
22 , onlyPermissive = False
28 , onlyPermissive = False
23 , allowed = []
29 , allowed = []
30+ , buildPlanDest = defaultBuildPlan
24 }
31 }
25 where
32 where
26 loop x [] = return x
33 loop x [] = return x
@@ -28,22 +35,35 @@ parseBuildArgs =
28 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
35 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
29 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
36 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
30 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
37 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
38+ loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
31 loop _ (y:_) = error $ "Did not understand argument: " ++ y
39 loop _ (y:_) = error $ "Did not understand argument: " ++ y
32
40
41+defaultBuildPlan :: FilePath
42+defaultBuildPlan = "build-plan.txt"
43+
33main :: IO ()
44main :: IO ()
34main = do
45main = do
35 args <- getArgs
46 args <- getArgs
36 case args of
47 case args of
37− "build":rest -> do
48+ "select":rest -> do
38− BuildArgs {..} <- parseBuildArgs rest
49+ SelectArgs {..} <- parseSelectArgs rest
39− build defaultBuildSettings
50+ bp <- select
51+ defaultSelectSettings
40− { excludedPackages = fromList $ map PackageName excluded
52+ { excludedPackages = fromList $ map PackageName excluded
41− , requireHaskellPlatform = not noPlatform
53+ , requireHaskellPlatform = not noPlatform
42− , allowedPackage =
54+ , allowedPackage =
43− if onlyPermissive
55+ if onlyPermissive
44− then allowPermissive allowed
56+ then allowPermissive allowed
45− else const $ Right ()
57+ else const $ Right ()
46− }
58+ }
59+ writeBuildPlan buildPlanDest bp
60+ ["check"] -> checkHelper defaultBuildPlan
61+ ["check", fp] -> checkHelper fp
62+ ["build"] -> buildHelper defaultBuildPlan
63+ ["build", fp] -> buildHelper fp
64+ ["test"] -> testHelper defaultBuildPlan
65+ ["test", fp] -> testHelper fp
66+ ["tarballs"] -> tbHelper defaultBuildPlan
47 ["init"] -> do
67 ["init"] -> do
48 putStrLn "Note: init isn't really ready for prime time use."
68 putStrLn "Note: init isn't really ready for prime time use."
49 putStrLn "Using it may make it impossible to build stackage."
69 putStrLn "Using it may make it impossible to build stackage."
@@ -58,7 +78,14 @@ main = do
58 pn <- getProgName
78 pn <- getProgName
59 putStrLn $ "Usage: " ++ pn ++ " <command>"
79 putStrLn $ "Usage: " ++ pn ++ " <command>"
60 putStrLn "Available commands:"
80 putStrLn "Available commands:"
61− putStrLn " update Download updated Stackage databases. Automatically calls init."
81+ --putStrLn " update Download updated Stackage databases. Automatically calls init."
62− putStrLn " init Initialize your cabal file to use Stackage"
82+ --putStrLn " init Initialize your cabal file to use Stackage"
63− putStrLn " build [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package]"
83+ putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
64− putStrLn " Build the package databases (maintainers only)"
84+ putStrLn " check [build plan file]"
85+ putStrLn " build [build plan file]"
86+ putStrLn " test [build plan file]"
87+ where
88+ checkHelper fp = readBuildPlan fp >>= checkPlan
89+ buildHelper fp = readBuildPlan fp >>= build defaultBuildSettings
90+ testHelper fp = readBuildPlan fp >>= runTestSuites defaultBuildSettings
91+ tbHelper fp = readBuildPlan fp >>= makeTarballs