@@ -18,6 +18,7 @@ import Stackage.BuildPlan
1818import Stackage.Prelude hiding (pi)
1919import qualified Data.Map as Map
2020import Control.Concurrent.STM.TSem
21+import Control.Monad.Writer.Strict (execWriter, tell)
2122import Data.NonNull (fromNullable)
2223import Control.Concurrent.Async (async)
2324import System.IO.Temp (withSystemTempDirectory)
@@ -55,6 +56,8 @@ data PerformBuild = PerformBuild
5556 , pbLog :: ByteString -> IO ()
5657 , pbLogDir :: FilePath
5758 , pbJobs :: Int
59+ , pbGlobalInstall :: Bool
60+ -- ^ Register packages in the global database
5861 }
5962
6063data PackageInfo = PackageInfo
@@ -106,7 +109,9 @@ withCounter counter = bracket_
106109
107110withTSem sem = bracket_ (atomically $ waitTSem sem) (atomically $ signalTSem sem)
108111
109−pbDatabase pb = pbInstallDest pb </> "pkgdb"
112+pbDatabase pb
113+ | pbGlobalInstall pb = Nothing
114+ | otherwise = Just $ pbInstallDest pb </> "pkgdb"
110115pbBinDir pb = pbInstallDest pb </> "bin"
111116pbLibDir pb = pbInstallDest pb </> "lib"
112117pbDataDir pb = pbInstallDest pb </> "share"
@@ -125,9 +130,10 @@ performBuild' pb@PerformBuild {..} = withBuildDir $ \builddir -> do
125130 let removeTree' fp = whenM (isDirectory fp) (removeTree fp)
126131 mapM_ removeTree' [pbInstallDest, pbLogDir]
127132
128− createTree $ parent $ pbDatabase pb
129− withCheckedProcess (proc "ghc-pkg" ["init", fpToString (pbDatabase pb)])
130− $ \ClosedStream Inherited Inherited -> return ()
133+ forM_ (pbDatabase pb) $ \db -> do
134+ createTree $ parent db
135+ withCheckedProcess (proc "ghc-pkg" ["init", fpToString db])
136+ $ \ClosedStream Inherited Inherited -> return ()
131137 pbLog $ encodeUtf8 "Copying built-in Haddocks\n"
132138 copyBuiltInHaddocks (pbDocDir pb)
133139
@@ -157,8 +163,11 @@ performBuild' pb@PerformBuild {..} = withBuildDir $ \builddir -> do
157163 , sbBuildDir = builddir
158164 , sbPackageInfo = pi
159165 , sbRegisterMutex = mutex
160− , sbModifiedEnv = ("HASKELL_PACKAGE_SANDBOX", fpToString $ pbDatabase pb)
161− : map fixEnv env
166+ , sbModifiedEnv = maybe
167+ id
168+ (\db -> (("HASKELL_PACKAGE_SANDBOX", fpToString db):))
169+ (pbDatabase pb)
170+ (map fixEnv env)
162171 , sbHaddockFiles = haddockFiles
163172 }
164173
@@ -255,16 +264,17 @@ singleBuild pb@PerformBuild {..} SingleBuild {..} =
255264 createTree $ parent fp
256265 withBinaryFile (fpToString fp) WriteMode inner
257266
258− configArgs =
259− [ "--package-db=clear"
260− , "--package-db=global"
261− , "--package-db=" ++ fpToText (pbDatabase pb)
262− , "--libdir=" ++ fpToText (pbLibDir pb)
263− , "--bindir=" ++ fpToText (pbBinDir pb)
264− , "--datadir=" ++ fpToText (pbDataDir pb)
265− , "--docdir=" ++ fpToText (pbDocDir pb)
266− , "--flags=" ++ flags
267− ]
267+ configArgs = ($ []) $ execWriter $ do
268+ tell' "--package-db=clear"
269+ tell' "--package-db=global"
270+ forM_ (pbDatabase pb) $ \db -> tell' $ "--package-db=" ++ fpToText db
271+ tell' $ "--libdir=" ++ fpToText (pbLibDir pb)
272+ tell' $ "--bindir=" ++ fpToText (pbBinDir pb)
273+ tell' $ "--datadir=" ++ fpToText (pbDataDir pb)
274+ tell' $ "--docdir=" ++ fpToText (pbDocDir pb)
275+ tell' $ "--flags=" ++ flags
276+ where
277+ tell' x = tell (x:)
268278
269279 flags :: Text
270280 flags = unwords $ map go $ mapToList pcFlagOverrides