on master help sign in
Separate version selection and building #25
commit3682ad56127f7714f097cd607bb7723eb52760f4 authorMichael Snoyman <michael@snoyman.com> dateThu 24 Jan 2013, 19:59 (14 years ago) parentfb2385d
12 files changed+104−81
.gitignore+1 Stackage/Build.hs+5−27 Stackage/CheckPlan.hs+2 Stackage/HaskellPlatform.hs+1−1 Stackage/InstallInfo.hs+4−4 Stackage/LoadDatabase.hs+1−1 Stackage/NarrowDatabase.hs+1−1 Stackage/Select.hs+20−11 Stackage/Tarballs.hs+1 Stackage/Test.hs+5−3 Stackage/Types.hs+18−15 app/stackage.hs+45−18
.gitignore+1
@@ -13,3 +13,4 @@ cabal-dev
1313/sandbox/
1414/build-tools.log
1515/logs-tools/
16+build-plan.txt
Stackage/Build.hs+5−27
@@ -34,30 +34,16 @@ import Stackage.CheckCabalVersion (checkCabalVersion)
3434defaultBuildSettings :: BuildSettings
3535defaultBuildSettings = BuildSettings
3636 { sandboxRoot = "sandbox"
37− , extraBuildArgs = []
38− , extraCore = defaultExtraCore
39− , expectedFailures = defaultExpectedFailures
40− , stablePackages = defaultStablePackages
37+ , expectedFailuresBuild = defaultExpectedFailures
4138 , extraArgs = ["-fnetwork23"]
42− , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
43− , requireHaskellPlatform = True
44− , excludedPackages = empty
4539 , testWorkerThreads = 4
46− , flags = Set.fromList $ words "blaze_html_0_5"
47− , allowedPackage = const $ Right ()
4840 }
4941
50−build :: BuildSettings -> IO ()
51−build settings' = do
42+build :: BuildSettings -> BuildPlan -> IO ()
43+build settings' bp = do
5244 putStrLn "Checking Cabal version"
5345 libVersion <- checkCabalVersion
5446
55− bp <- select settings'
56−
57− putStrLn "Checking build plan"
58− checkPlan bp
59− putStrLn "No mismatches, starting the sandboxed build."
60−
6147 putStrLn "Wiping out old sandbox folder"
6248 rm_r $ sandboxRoot settings'
6349 rm_r "logs"
@@ -84,8 +70,7 @@ build settings' = do
8470 : "--build-log=logs-tools/$pkg.log"
8571 : "-j"
8672 : concat
87− [ extraBuildArgs settings
88− , extraArgs settings
73+ [ extraArgs settings
8974 , tools
9075 ]
9176 hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
@@ -103,8 +88,7 @@ build settings' = do
10388 : "--build-log=logs/$pkg.log"
10489 : "-j"
10590 : concat
106− [ extraBuildArgs settings
107− , extraArgs settings
91+ [ extraArgs settings
10892 , bpPackageList bp
10993 ]
11094 hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
@@ -114,12 +98,6 @@ build settings' = do
11498 putStrLn "Build failed, please see build.log"
11599 exitWith ec
116100
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−
123101-- | Get all of the build tools required.
124102iiBuildTools :: InstallInfo -> [String]
125103iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
Stackage/CheckPlan.hs+2
@@ -18,6 +18,7 @@ data Mismatch = OnlyDryRun String | OnlySimpleList String
1818
1919checkPlan :: BuildPlan -> IO ()
2020checkPlan bp = do
21+ putStrLn "Checking build plan"
2122 (ec, dryRun', stderr) <- readProcessWithExitCode "cabal" (addCabalArgsOnlyGlobal $ "install":"--dry-run":bpPackageList bp) ""
2223 when (ec /= ExitSuccess || "Warning:" `isPrefixOf` stderr) $ do
2324 putStr stderr
@@ -30,6 +31,7 @@ checkPlan bp = do
3031 putStrLn "Found the following mismatches"
3132 mapM_ print mismatches
3233 exitWith $ ExitFailure 1
34+ putStrLn "Build plan checked, no mismatches"
3335 where
3436 optionalCore = Set.fromList $ map packageVersionString $ Map.toList $ bpOptionalCore bp
3537 notOptionalCore s = not $ s `Set.member` optionalCore
Stackage/HaskellPlatform.hs+1−1
@@ -11,7 +11,7 @@ import Data.Set (singleton)
1111import Distribution.Text (simpleParse)
1212import Stackage.Types
1313
14−loadHaskellPlatform :: BuildSettings -> IO HaskellPlatform
14+loadHaskellPlatform :: SelectSettings -> IO HaskellPlatform
1515loadHaskellPlatform = fmap parseHP . readFile . haskellPlatformCabal
1616
1717data HPLine = HPLPackage PackageIdentifier
Stackage/InstallInfo.hs+4−4
@@ -17,13 +17,13 @@ import Stackage.NarrowDatabase
1717import Stackage.Types
1818import Stackage.Util
1919
20−dropExcluded :: BuildSettings
20+dropExcluded :: SelectSettings
2121 -> Map PackageName (VersionRange, Maintainer)
2222 -> Map PackageName (VersionRange, Maintainer)
2323dropExcluded bs m0 =
2424 Set.foldl' (flip Map.delete) m0 (excludedPackages bs)
2525
26−getInstallInfo :: BuildSettings -> IO InstallInfo
26+getInstallInfo :: SelectSettings -> IO InstallInfo
2727getInstallInfo settings = do
2828 putStrLn "Loading Haskell Platform"
2929 hp <- loadHaskellPlatform settings
@@ -96,14 +96,14 @@ bpPackageList :: BuildPlan -> [String]
9696bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
9797
9898-- | Check for internal mismatches in required and actual package versions.
99−checkBadVersions :: BuildSettings
99+checkBadVersions :: SelectSettings
100100 -> PackageDB
101101 -> Map PackageName BuildInfo
102102 -> Map String (Map PackageName (Version, VersionRange))
103103checkBadVersions settings (PackageDB pdb) buildPlan =
104104 Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
105105 where
106− unexpectedFailure name _ = name `Set.notMember` expectedFailures settings
106+ unexpectedFailure name _ = name `Set.notMember` expectedFailuresSelect settings
107107
108108 getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
109109 getBadVersions (name, bi)
Stackage/LoadDatabase.hs+1−1
@@ -53,7 +53,7 @@ import Stackage.Util
5353-- version.
5454--
5555-- * For other packages, select the maximum version number.
56−loadPackageDB :: BuildSettings
56+loadPackageDB :: SelectSettings
5757 -> Set PackageName -- ^ core packages
5858 -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
5959 -> IO PackageDB
Stackage/NarrowDatabase.hs+1−1
@@ -10,7 +10,7 @@ import System.Exit (exitFailure)
1010
1111-- | Narrow down the database to only the specified packages and all of
1212-- their dependencies.
13−narrowPackageDB :: BuildSettings
13+narrowPackageDB :: SelectSettings
1414 -> PackageDB
1515 -> Set (PackageName, Maintainer)
1616 -> IO (Map PackageName BuildInfo)
Stackage/Select.hs+20−11
@@ -1,5 +1,6 @@
11module Stackage.Select
22 ( select
3+ , defaultSelectSettings
34 ) where
45
56import Control.Exception (assert)
@@ -28,20 +29,28 @@ import System.Process (rawSystem, readProcess, runProcess,
2829 waitForProcess)
2930import Stackage.BuildPlan
3031
31−select :: BuildSettings -> IO BuildPlan
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+
44+select :: SelectSettings -> IO BuildPlan
3245select settings' = do
3346 ii <- getInstallInfo settings'
3447
35− let bp = BuildPlan
36− { bpTools = iiBuildTools ii
37− , bpPackages = iiPackages ii
38− , bpOptionalCore = iiOptionalCore ii
39− , bpCore = iiCore ii
40− }
41−
42− writeBuildPlan "build-plan.txt" bp -- FIXME
43− readBuildPlan "build-plan.txt"
44− --return bp
48+ return BuildPlan
49+ { bpTools = iiBuildTools ii
50+ , bpPackages = iiPackages ii
51+ , bpOptionalCore = iiOptionalCore ii
52+ , bpCore = iiCore ii
53+ }
4554
4655-- | Get all of the build tools required.
4756iiBuildTools :: InstallInfo -> [String]
Stackage/Tarballs.hs+1
@@ -13,6 +13,7 @@ import System.FilePath (takeDirectory)
1313
1414makeTarballs :: BuildPlan -> IO ()
1515makeTarballs bp = do
16+ putStrLn "Building tarballs"
1617 tarName <- getTarballName
1718 origEntries <- fmap Tar.read $ L.readFile tarName
1819 (stableEntries, extraEntries) <- loop id id origEntries
Stackage/Test.hs+5−3
@@ -19,8 +19,10 @@ import System.IO (IOMode (WriteMode, AppendMode),
1919 withBinaryFile)
2020import System.Process (runProcess, waitForProcess)
2121
22−runTestSuites :: BuildSettings -> Map PackageName SelectedPackageInfo -> IO ()
23−runTestSuites settings selected = do
22+runTestSuites :: BuildSettings -> BuildPlan -> IO ()
23+runTestSuites settings bp = do
24+ let selected = bpPackages bp
25+ putStrLn "Running test suites"
2426 let testdir = "runtests"
2527 rm_r testdir
2628 createDirectory testdir
@@ -99,7 +101,7 @@ runTestSuite settings testdir (packageName, SelectedPackageInfo {..}) = do
99101 getHandle AppendMode $ runGhcPackagePath "cabal" ["test"] dir
100102 getHandle AppendMode $ run "cabal" ["haddock"] dir
101103 return True
102− let expectedFailure = packageName `Set.member` expectedFailures settings
104+ let expectedFailure = packageName `Set.member` expectedFailuresBuild settings
103105 if passed
104106 then do
105107 removeFile logfile
Stackage/Types.hs+18−15
@@ -89,23 +89,12 @@ data BuildPlan = BuildPlan
8989newtype Maintainer = Maintainer { unMaintainer :: String }
9090 deriving (Show, Eq, Ord, Read)
9191
92−data BuildSettings = BuildSettings
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
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.
92+data SelectSettings = SelectSettings
93+ { haskellPlatformCabal :: FilePath
10794 , flags :: Set String
10895 -- ^ Compile flags which should be turned on.
96+ , extraCore :: Set PackageName
97+ , requireHaskellPlatform :: Bool
10998 , allowedPackage :: GenericPackageDescription -> Either String ()
11099 -- ^ Checks if a package is allowed into the distribution. By default, we
111100 -- allow all packages in, though this could be used to filter out certain
@@ -113,6 +102,20 @@ data BuildSettings = BuildSettings
113102 --
114103 -- Returns a reason for stripping in Left, or Right if the package is
115104 -- 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.
116119 }
117120
118121-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
app/stackage.hs+45−18
@@ -3,24 +3,31 @@ import Stackage.Types
33import Stackage.Build (build, defaultBuildSettings)
44import Stackage.Init (stackageInit)
55import Stackage.Util (allowPermissive)
6+import Stackage.Select (defaultSelectSettings, select)
7+import Stackage.CheckPlan (checkPlan)
68import System.Environment (getArgs, getProgName)
79import Data.Set (fromList)
810import System.IO (hFlush, stdout)
11+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan)
12+import Stackage.Test (runTestSuites)
13+import Stackage.Tarballs (makeTarballs)
914
10−data BuildArgs = BuildArgs
15+data SelectArgs = SelectArgs
1116 { excluded :: [String]
1217 , noPlatform :: Bool
1318 , onlyPermissive :: Bool
1419 , allowed :: [String]
20+ , buildPlanDest :: FilePath
1521 }
1622
17−parseBuildArgs :: [String] -> IO BuildArgs
18−parseBuildArgs =
19− loop BuildArgs
23+parseSelectArgs :: [String] -> IO SelectArgs
24+parseSelectArgs =
25+ loop SelectArgs
2026 { excluded = []
2127 , noPlatform = False
2228 , onlyPermissive = False
2329 , allowed = []
30+ , buildPlanDest = defaultBuildPlan
2431 }
2532 where
2633 loop x [] = return x
@@ -28,22 +35,35 @@ parseBuildArgs =
2835 loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
2936 loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
3037 loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
38+ loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
3139 loop _ (y:_) = error $ "Did not understand argument: " ++ y
3240
41+defaultBuildPlan :: FilePath
42+defaultBuildPlan = "build-plan.txt"
43+
3344main :: IO ()
3445main = do
3546 args <- getArgs
3647 case args of
37− "build":rest -> do
38− BuildArgs {..} <- parseBuildArgs rest
39− build defaultBuildSettings
40− { excludedPackages = fromList $ map PackageName excluded
41− , requireHaskellPlatform = not noPlatform
42− , allowedPackage =
43− if onlyPermissive
44− then allowPermissive allowed
45− else const $ Right ()
46− }
48+ "select":rest -> do
49+ SelectArgs {..} <- parseSelectArgs rest
50+ bp <- select
51+ defaultSelectSettings
52+ { excludedPackages = fromList $ map PackageName excluded
53+ , requireHaskellPlatform = not noPlatform
54+ , allowedPackage =
55+ if onlyPermissive
56+ then allowPermissive allowed
57+ else const $ Right ()
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
4767 ["init"] -> do
4868 putStrLn "Note: init isn't really ready for prime time use."
4969 putStrLn "Using it may make it impossible to build stackage."
@@ -58,7 +78,14 @@ main = do
5878 pn <- getProgName
5979 putStrLn $ "Usage: " ++ pn ++ " <command>"
6080 putStrLn "Available commands:"
61− putStrLn " update Download updated Stackage databases. Automatically calls init."
62− putStrLn " init Initialize your cabal file to use Stackage"
63− putStrLn " build [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package]"
64− putStrLn " Build the package databases (maintainers only)"
81+ --putStrLn " update Download updated Stackage databases. Automatically calls init."
82+ --putStrLn " init Initialize your cabal file to use Stackage"
83+ putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
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