on e453fed help sign in
stackage/Stackage/Build.hs
101 lines 3.9 kB history raw
1module Stackage.Build
2 ( build
3 , defaultBuildSettings
4 , BuildSettings (..)
5 ) where
7import Distribution.Text (simpleParse)
8import Control.Monad (unless, when)
9import Stackage.Types
10import Stackage.CheckPlan
11import Stackage.InstallInfo
12import Stackage.Tarballs
13import Stackage.Test
14import Stackage.Util
15import Stackage.Config
16import System.Exit (ExitCode (ExitSuccess), exitWith)
17import System.IO (IOMode (WriteMode), withBinaryFile, hPutStrLn)
18import System.Process (runProcess, waitForProcess, rawSystem, readProcess)
19import System.Directory (createDirectoryIfMissing, canonicalizePath, doesDirectoryExist)
20import Distribution.Version (thisVersion, withinRange)
21import Control.Exception (assert)
22import Data.Set (empty)
24defaultBuildSettings :: BuildSettings
25defaultBuildSettings = BuildSettings
26 { sandboxRoot = "sandbox"
27 , extraBuildArgs = []
28 , extraCore = defaultExtraCore
29 , expectedFailures = defaultExpectedFailures
30 , stablePackages = defaultStablePackages
31 , extraArgs = ["-fnetwork23"]
32 , haskellPlatformCabal = "haskell-platform/haskell-platform.cabal"
33 , requireHaskellPlatform = True
34 , cleanBeforeBuild = True
35 , excludedPackages = empty
36 }
38build :: BuildSettings -> IO ()
39build settings' = do
40 putStrLn "Creating a build plan"
41 ii <- getInstallInfo settings'
43 let root' = sandboxRoot settings'
44 initPkgDb <- if cleanBeforeBuild settings'
45 then do
46 putStrLn "Wiping out old sandbox folder"
47 rm_r root'
48 rm_r "logs"
49 return True
50 else do
51 b <- doesDirectoryExist root'
52 when b (putStrLn "Re-using existing sandbox")
53 return (not b)
54 createDirectoryIfMissing True root'
55 root <- canonicalizePath root'
56 let settings = settings' { sandboxRoot = root }
58 when initPkgDb $ do
59 ec1 <- rawSystem "ghc-pkg" ["init", packageDir settings]
60 unless (ec1 == ExitSuccess) $ do
61 putStrLn "Unable to create package database via ghc-pkg init"
62 exitWith ec1
63 checkPlan settings ii
64 putStrLn "No mismatches, starting the sandboxed build."
66 versionString <- readProcess "cabal" ["--version"] ""
67 libVersion <-
68 case map words $ lines versionString of
69 [_,["using","version",libVersion,"of","the","Cabal","library"]] -> return libVersion
70 _ -> error "Did not understand cabal --version output"
72 case (simpleParse libVersion, simpleParse ">= 1.16") of
73 (Nothing, _) -> error $ "Invalid Cabal library version: " ++ libVersion
74 (_, Nothing) -> assert False $ return ()
75 (Just v, Just vr)
76 | v `withinRange` vr -> return ()
77 | otherwise -> error $ "Unsupported Cabal version: " ++ libVersion
79 ph <- withBinaryFile "build.log" WriteMode $ \handle ->
80 let args = addCabalArgs settings
81 $ "install"
82 : ("--cabal-lib-version=" ++ libVersion)
83 : "--build-log=logs/$pkg.log"
84 : "-j"
85 : concat
86 [ extraBuildArgs settings
87 , extraArgs settings
88 , iiPackageList ii
89 ]
90 in do hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
91 runProcess "cabal" args Nothing Nothing Nothing (Just handle) (Just handle)
92 ec <- waitForProcess ph
93 unless (ec == ExitSuccess) $ do
94 putStrLn "Build failed, please see build.log"
95 exitWith ec
97 putStrLn "Sandbox built, beginning individual test suites"
98 runTestSuites settings ii
100 putStrLn "All test suites that were expected to pass did pass, building tarballs."
101 makeTarballs ii