Skip to content
Snippets Groups Projects
Forked from Glasgow Haskell Compiler / GHC
Source project has a limited visibility.
  • Ben Gamari's avatar
    44f6557a
    Move `base` to `ghc-internal` · 44f6557a
    Ben Gamari authored and Marge Bot's avatar Marge Bot committed
    Here we move a good deal of the implementation of `base` into a new
    package, `ghc-internal` such that it can be evolved independently
    from the user-visible interfaces of `base`.
    
    While we want to isolate implementation from interfaces, naturally, we
    would like to avoid turning `base` into a mere set of module re-exports.
    However, this is a non-trivial undertaking for a variety of reasons:
    
     * `base` contains numerous known-key and wired-in things, requiring
       corresponding changes in the compiler
    
     * `base` contains a significant amount of C code and corresponding
       autoconf logic, which is very fragile and difficult to break apart
    
     * `base` has numerous import cycles, which are currently dealt with via
       carefully balanced `hs-boot` files
    
     * We must not break existing users
    
    To accomplish this migration, I tried the following approaches:
    
    * [Split-GHC.Base]: Break apart the GHC.Base knot to allow incremental
      migration of modules into ghc-internal: this knot is simply too
      intertwined to be easily pulled apart, especially given the rather
      tricky import cycles that it contains)
    
    * [Move-Core]: Moving the "core" connected component of base (roughly
      150 modules) into ghc-internal. While the Haskell side of this seems
      tractable, the C dependencies are very subtle to break apart.
    
    * [Move-Incrementally]:
    
      1. Move all of base into ghc-internal
      2. Examine the module structure and begin moving obvious modules (e.g.
         leaves of the import graph) back into base
      3. Examine the modules remaining in ghc-internal, refactor as necessary
         to facilitate further moves
      4. Go to (2) iterate until the cost/benefit of further moves is
         insufficient to justify continuing
      5. Rename the modules moved into ghc-internal to ensure that they don't
         overlap with those in base
      6. For each module moved into ghc-internal, add a shim module to base
         with the declarations which should be exposed and any requisite
         Haddocks (thus guaranteeing that base will be insulated from changes
         in the export lists of modules in ghc-internal
    
    Here I am using the [Move-Incrementally] approach, which is empirically
    the least painful of the unpleasant options above
    
    Bumps haddock submodule.
    
    Metric Decrease:
        haddock.Cabal
        haddock.base
    Metric Increase:
        MultiComponentModulesRecomp
        T16875
        size_hello_artifact
    44f6557a
    History
    Move `base` to `ghc-internal`
    Ben Gamari authored and Marge Bot's avatar Marge Bot committed
    Here we move a good deal of the implementation of `base` into a new
    package, `ghc-internal` such that it can be evolved independently
    from the user-visible interfaces of `base`.
    
    While we want to isolate implementation from interfaces, naturally, we
    would like to avoid turning `base` into a mere set of module re-exports.
    However, this is a non-trivial undertaking for a variety of reasons:
    
     * `base` contains numerous known-key and wired-in things, requiring
       corresponding changes in the compiler
    
     * `base` contains a significant amount of C code and corresponding
       autoconf logic, which is very fragile and difficult to break apart
    
     * `base` has numerous import cycles, which are currently dealt with via
       carefully balanced `hs-boot` files
    
     * We must not break existing users
    
    To accomplish this migration, I tried the following approaches:
    
    * [Split-GHC.Base]: Break apart the GHC.Base knot to allow incremental
      migration of modules into ghc-internal: this knot is simply too
      intertwined to be easily pulled apart, especially given the rather
      tricky import cycles that it contains)
    
    * [Move-Core]: Moving the "core" connected component of base (roughly
      150 modules) into ghc-internal. While the Haskell side of this seems
      tractable, the C dependencies are very subtle to break apart.
    
    * [Move-Incrementally]:
    
      1. Move all of base into ghc-internal
      2. Examine the module structure and begin moving obvious modules (e.g.
         leaves of the import graph) back into base
      3. Examine the modules remaining in ghc-internal, refactor as necessary
         to facilitate further moves
      4. Go to (2) iterate until the cost/benefit of further moves is
         insufficient to justify continuing
      5. Rename the modules moved into ghc-internal to ensure that they don't
         overlap with those in base
      6. For each module moved into ghc-internal, add a shim module to base
         with the declarations which should be exposed and any requisite
         Haddocks (thus guaranteeing that base will be insulated from changes
         in the export lists of modules in ghc-internal
    
    Here I am using the [Move-Incrementally] approach, which is empirically
    the least painful of the unpleasant options above
    
    Bumps haddock submodule.
    
    Metric Decrease:
        haddock.Cabal
        haddock.base
    Metric Increase:
        MultiComponentModulesRecomp
        T16875
        size_hello_artifact
Code owners
Assign users and groups as approvers for specific file changes. Learn more.