@@ -2,6 +2,7 @@ module Stackage.Build
22 ( build
33 ) where
44
5+import Distribution.Text (simpleParse)
56import Control.Monad (unless)
67import Stackage.CheckPlan
78import Stackage.InstallInfo
@@ -10,28 +11,63 @@ import Stackage.Test
1011import Stackage.Util
1112import System.Exit (ExitCode (ExitSuccess), exitWith)
1213import System.IO (IOMode (WriteMode), withBinaryFile)
13−import System.Process (runProcess, waitForProcess)
14+import System.Process (runProcess, waitForProcess, rawSystem, readProcess)
15+import System.Directory (createDirectoryIfMissing, canonicalizePath)
16+import Distribution.Version (thisVersion, withinRange)
17+import Control.Exception (assert)
1418
15−build :: IO ()
16−build = do
19+build :: FilePath
20+ -> ([String] -> [String]) -- ^ extra build rgs
21+ -> IO ()
22+build root' extraBuildArgs = do
1723 putStrLn "Creating a build plan"
1824 ii <- getInstallInfo
1925
20− putStrLn "Wiping out old cabal-dev folder"
21− rm_r "cabal-dev"
26+ putStrLn "Wiping out old sandbox folder"
27+ rm_r root'
28+ rm_r "logs"
29+ createDirectoryIfMissing True root'
30+ root <- canonicalizePath root'
2231
23− checkPlan ii
32+ ec1 <- rawSystem "ghc-pkg" ["init", packageDir root]
33+ unless (ec1 == ExitSuccess) $ do
34+ putStrLn "Unable to create package database via ghc-pkg init"
35+ exitWith ec1
36+
37+ let extraArgs = ("-fnetwork23":)
38+
39+ checkPlan (addCabalArgs root . extraArgs) ii
2440 putStrLn "No mismatches, starting the sandboxed build."
2541
42+ versionString <- readProcess "cabal" ["--version"] ""
43+ libVersion <-
44+ case map words $ lines versionString of
45+ [_,["using","version",libVersion,"of","the","Cabal","library"]] -> return libVersion
46+ _ -> error "Did not understand cabal --version output"
47+
48+ case (simpleParse libVersion, simpleParse ">= 1.16") of
49+ (Nothing, _) -> error $ "Invalid Cabal library version: " ++ libVersion
50+ (_, Nothing) -> assert False $ return ()
51+ (Just v, Just vr)
52+ | v `withinRange` vr -> return ()
53+ | otherwise -> error $ "Unsupported Cabal version: " ++ libVersion
54+
2655 ph <- withBinaryFile "build.log" WriteMode $ \handle ->
27− runProcess "cabal-dev" ("install":"-fnetwork23":iiPackageList ii) Nothing Nothing Nothing (Just handle) (Just handle)
56+ let args = addCabalArgs root
57+ $ "install"
58+ : ("--cabal-lib-version=" ++ libVersion)
59+ : "--build-log=logs/$pkg.log"
60+ : "--enable-shared"
61+ : "-j"
62+ : (extraBuildArgs . extraArgs) (iiPackageList ii)
63+ in runProcess "cabal" args Nothing Nothing Nothing (Just handle) (Just handle)
2864 ec <- waitForProcess ph
2965 unless (ec == ExitSuccess) $ do
3066 putStrLn "Build failed, please see build.log"
3167 exitWith ec
3268
3369 putStrLn "Sandbox built, beginning individual test suites"
34− runTestSuites ii
70+ runTestSuites root ii
3571
3672 putStrLn "All test suites that were expected to pass did pass, building tarballs."
3773 makeTarballs ii