diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2022-08-21 19:34:36 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-09-14 17:17:04 -0400 |
commit | b42cedbefb296437014d0768348b740b960943c0 (patch) | |
tree | eb015b50669c6f4c778ae16a71b28522392e36dd /hadrian/src/Base.hs | |
parent | 98b62871581d09fd7f910f011b8309a342af9886 (diff) | |
download | haskell-b42cedbefb296437014d0768348b740b960943c0.tar.gz |
hadrian: Inplace/Final package databases
There are now two different package databases per stage. An inplace
package database contains .conf files which point directly into the
build directories. The final package database contains .conf files which
point into the installed locations. The inplace .conf files are created
before any building happens and have fake ABI hash values. The final
.conf files are created after a package finished building and contains
the proper ABI has.
The motivation for this is to make the dependency structure more
fine-grained when building modules. Now a module depends just depends
directly on M.o from package p rather than the .conf file depend on the
.conf file for package p. So when all of a modules direct dependencies
have finished building we can start building it rather than waiting for
the whole package to finish.
The secondary motivation is that the multi-repl doesn't need to build
everything before starting the multi-repl session. We can just configure
the inplace package-db and use that in order to start the repl.
Diffstat (limited to 'hadrian/src/Base.hs')
-rw-r--r-- | hadrian/src/Base.hs | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/hadrian/src/Base.hs b/hadrian/src/Base.hs index b88e2e4df8..3fcc3bb3c6 100644 --- a/hadrian/src/Base.hs +++ b/hadrian/src/Base.hs @@ -29,6 +29,8 @@ module Base ( ghcBinDeps, ghcLibDeps, haddockDeps, relativePackageDbPath, packageDbPath, packageDbStamp, mingwStamp, systemCxxStdLibConf, systemCxxStdLibConfPath + , PackageDbLoc(..), Inplace(..) + ) where import Control.Applicative @@ -82,13 +84,17 @@ shakeFilesDir = "hadrian" -- | Path to the package database for a given build stage, relative to the build -- root. -relativePackageDbPath :: Stage -> FilePath -relativePackageDbPath stage = stageString stage -/- "lib/package.conf.d" +relativePackageDbPath :: PackageDbLoc -> FilePath +relativePackageDbPath (PackageDbLoc stage Final) = stageString stage-/- "lib/package.conf.d" +relativePackageDbPath (PackageDbLoc stage Inplace) = stageString stage -/- "inplace/package.conf.d" + +-- See Note [Inplace vs Final package databases] +data PackageDbLoc = PackageDbLoc { db_stage :: Stage, db_inplace :: Inplace } -- | Path to the package database used in a given 'Stage', including -- the build root. -packageDbPath :: Stage -> Action FilePath -packageDbPath stage = buildRoot <&> (-/- relativePackageDbPath stage) +packageDbPath :: PackageDbLoc -> Action FilePath +packageDbPath db_loc = buildRoot <&> (-/- relativePackageDbPath db_loc) -- | We use a stamp file to track the existence of a package database. packageDbStamp :: FilePath @@ -99,7 +105,7 @@ systemCxxStdLibConf = "system-cxx-std-lib-1.0.conf" -- | The name of the generated @system-cxx-std-lib-1.0.conf@ package database -- entry. -systemCxxStdLibConfPath :: Stage -> Action FilePath +systemCxxStdLibConfPath :: PackageDbLoc -> Action FilePath systemCxxStdLibConfPath stage = packageDbPath stage <&> (-/- systemCxxStdLibConf) @@ -112,14 +118,14 @@ stageLibPath :: Stage -> Action FilePath stageLibPath stage = buildRoot <&> (-/- stageString stage -/- "lib") -- | Files the GHC library depends on -ghcLibDeps :: Stage -> Action [FilePath] -ghcLibDeps stage = do +ghcLibDeps :: Stage -> Inplace -> Action [FilePath] +ghcLibDeps stage iplace = do ps <- mapM (\f -> stageLibPath stage <&> (-/- f)) [ "llvm-targets" , "llvm-passes" , "settings" ] - cxxStdLib <- systemCxxStdLibConfPath stage + cxxStdLib <- systemCxxStdLibConfPath (PackageDbLoc stage iplace) return (cxxStdLib : ps) -- | Files the GHC binary depends on. |