@@ -18,6 +18,7 @@ import Stackage.BuildPlan
18import Stackage.Prelude hiding (pi)
18import Stackage.Prelude hiding (pi)
19import qualified Data.Map as Map
19import qualified Data.Map as Map
20import Control.Concurrent.STM.TSem
20import Control.Concurrent.STM.TSem
21+import Control.Monad.Writer.Strict (execWriter, tell)
21import Data.NonNull (fromNullable)
22import Data.NonNull (fromNullable)
22import Control.Concurrent.Async (async)
23import Control.Concurrent.Async (async)
23import System.IO.Temp (withSystemTempDirectory)
24import System.IO.Temp (withSystemTempDirectory)
@@ -55,6 +56,8 @@ data PerformBuild = PerformBuild
55 , pbLog :: ByteString -> IO ()
56 , pbLog :: ByteString -> IO ()
56 , pbLogDir :: FilePath
57 , pbLogDir :: FilePath
57 , pbJobs :: Int
58 , pbJobs :: Int
59+ , pbGlobalInstall :: Bool
60+ -- ^ Register packages in the global database
60data PackageInfo = PackageInfo
63data PackageInfo = PackageInfo
@@ -106,7 +109,9 @@ withCounter counter = bracket_
107withTSem sem = bracket_ (atomically $ waitTSem sem) (atomically $ signalTSem sem)
110withTSem sem = bracket_ (atomically $ waitTSem sem) (atomically $ signalTSem sem)
113+ | pbGlobalInstall pb = Nothing
109−pbDatabase pb = pbInstallDest pb </> "pkgdb"
114+ | otherwise = Just $ pbInstallDest pb </> "pkgdb"
110pbBinDir pb = pbInstallDest pb </> "bin"
115pbBinDir pb = pbInstallDest pb </> "bin"
111pbLibDir pb = pbInstallDest pb </> "lib"
116pbLibDir pb = pbInstallDest pb </> "lib"
112pbDataDir pb = pbInstallDest pb </> "share"
117pbDataDir pb = pbInstallDest pb </> "share"
@@ -125,9 +130,10 @@ performBuild' pb@PerformBuild {..} = withBuildDir $ \builddir -> do
125 let removeTree' fp = whenM (isDirectory fp) (removeTree fp)
130 let removeTree' fp = whenM (isDirectory fp) (removeTree fp)
126 mapM_ removeTree' [pbInstallDest, pbLogDir]
131 mapM_ removeTree' [pbInstallDest, pbLogDir]
133+ forM_ (pbDatabase pb) $ \db -> do
128− createTree $ parent $ pbDatabase pb
134+ createTree $ parent db
129− withCheckedProcess (proc "ghc-pkg" ["init", fpToString (pbDatabase pb)])
135+ withCheckedProcess (proc "ghc-pkg" ["init", fpToString db])
130− $ \ClosedStream Inherited Inherited -> return ()
136+ $ \ClosedStream Inherited Inherited -> return ()
131 pbLog $ encodeUtf8 "Copying built-in Haddocks\n"
137 pbLog $ encodeUtf8 "Copying built-in Haddocks\n"
132 copyBuiltInHaddocks (pbDocDir pb)
138 copyBuiltInHaddocks (pbDocDir pb)
@@ -157,8 +163,11 @@ performBuild' pb@PerformBuild {..} = withBuildDir $ \builddir -> do
157 , sbBuildDir = builddir
163 , sbBuildDir = builddir
158 , sbPackageInfo = pi
164 , sbPackageInfo = pi
159 , sbRegisterMutex = mutex
165 , sbRegisterMutex = mutex
166+ , sbModifiedEnv = maybe
160− , sbModifiedEnv = ("HASKELL_PACKAGE_SANDBOX", fpToString $ pbDatabase pb)
168+ (\db -> (("HASKELL_PACKAGE_SANDBOX", fpToString db):))
161− : map fixEnv env
170+ (map fixEnv env)
162 , sbHaddockFiles = haddockFiles
171 , sbHaddockFiles = haddockFiles
@@ -255,16 +264,17 @@ singleBuild pb@PerformBuild {..} SingleBuild {..} =
255 createTree $ parent fp
264 createTree $ parent fp
256 withBinaryFile (fpToString fp) WriteMode inner
265 withBinaryFile (fpToString fp) WriteMode inner
258− configArgs =
267+ configArgs = ($ []) $ execWriter $ do
259− [ "--package-db=clear"
268+ tell' "--package-db=clear"
260− , "--package-db=global"
269+ tell' "--package-db=global"
261− , "--package-db=" ++ fpToText (pbDatabase pb)
270+ forM_ (pbDatabase pb) $ \db -> tell' $ "--package-db=" ++ fpToText db
262− , "--libdir=" ++ fpToText (pbLibDir pb)
271+ tell' $ "--libdir=" ++ fpToText (pbLibDir pb)
263− , "--bindir=" ++ fpToText (pbBinDir pb)
272+ tell' $ "--bindir=" ++ fpToText (pbBinDir pb)
264− , "--datadir=" ++ fpToText (pbDataDir pb)
273+ tell' $ "--datadir=" ++ fpToText (pbDataDir pb)
265− , "--docdir=" ++ fpToText (pbDocDir pb)
274+ tell' $ "--docdir=" ++ fpToText (pbDocDir pb)
266− , "--flags=" ++ flags
275+ tell' $ "--flags=" ++ flags
269 flags :: Text
279 flags :: Text
270 flags = unwords $ map go $ mapToList pcFlagOverrides
280 flags = unwords $ map go $ mapToList pcFlagOverrides