|Version 12 (modified by simonpj, 6 years ago) (diff)|
GHC Commentary: Libraries
All GHC build trees contain a set of libraries:
- The Boot Packages are the libraries that GHC's source code imports. Obviously you need the boot packages to build GHC at all (whether the stage-1 or stage-2 compiler).
- The Zero-boot Packages are a small subset of the boot packages. Since GHC's source code imports the boot packages, even the bootstrap compiler must have the boot packages available. But for certain fast-moving boot packages (eg Cabal), we don't want to rely on the user having installed a bang-up-to-date version of the package. So we begin the entire build process by installing the zero-boot packages in the bootstrap compiler. (This installation is purely local to the build tree.) The bootstrap compiler is expected to have all other (non-zero-) boot packages already installed.
As time goes on, a Zero-boot package may become an ordinary boot package, because the bootstrap compiler is expected to have (a sufficiently up to date) version of the package already.
The Boot Packages, along with the other subcomponents of the GHC build system, are in the file packages in a GHC tree. To get a list of them, you can run make show VALUE=PACKAGES in a configured GHC build tree. (This variable is set in $(TOP)/ghc.mk.)
Classifying the boot packages
A second important classification of the boot packages is as follows:
- INDEPENDENT: Independently maintained (e.g. time, haskeline)
- COUPLED: Tightly coupled to GHC, but used by others (base)
- SPECIFIC: Totally specific to GHC (e.g. template-haskell, DPH)
Most boot libraries are INDEPENDENT. INDEPENDENT libraries have a master repository somewhere separate from the GHC repositories.
Structure of the boot packages
- At the root of the hierarchy we have ghc-prim. As the name implies, this package contains the most primitive types and functions. It only contains a handful of modules, including GHC.Prim (which contains Int#, +#, etc) and GHC.Bool, containing the Bool datatype.
- Above ghc-prim is the integer-impl package, where impl is one of gmp and simple, which provides a definition of the Integer type (on top of the C gmp library, or in plain Haskell, respectively). Which functionality is provided in ghc-prim is mostly driven by what functionality the integer-impl packages need. By default integer-gmp is used; to use integer-simple define INTEGER_LIBRARY=integer-simple in mk/build.mk.
- Next is the base package. This contains a large number of modules, many of which are in one big cyclic import knot, mostly due to the Exception type.
- On top of base are a number of other, more specialised packages, whose purpose is generally clear from their name. If not, you can get more detail from the descriptions in their Cabal files. Currently these packages are are:
The haskell98, old-time and random packages are mostly only needed for Haskell 98 support, although dph currently uses random too.
The current classification of packages is:
- SPECIFIC: ghc-prim, template-haskell
- COUPLED: base
- INDEPENDENT and Zero-Boot: Cabal, filepath
- INDEPENDENT: all other packages