[GHC] #11025: Per-database shadowing

GHC ghc-devs at haskell.org
Tue Oct 27 18:30:48 UTC 2015


#11025: Per-database shadowing
-------------------------------------+-------------------------------------
           Reporter:  ezyang         |             Owner:  ezyang
               Type:  bug            |            Status:  new
           Priority:  high           |         Milestone:  8.0.1
          Component:  Package        |           Version:  7.11
  system                             |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 In `5b0191f74ab05b187f81ea037623338a615b1619`, I eliminated shadowing, on
 the justification that we should never pick the same component ID
 (previously installed package ID) for two distinct packages unless the
 ABIs of the packages were the same, so we could just globally assume that
 component IDs are unique.

 However, I've recently come across some cases where we can't easily
 actually make this be the case. Here are a few of them:

 1. GHC's build system assumes that the ghc package will always be a
 library name of the form HSghc-7.11.a (i.e. that its component ID is
 ghc-7.11). It's a bit nontrivial to change this assumption, because there
 are stage1 shenanigans which are rewriting the version number to one
 without the date. But obviously if you are bootstrapping GHC with itself,
 the component ID of the GHC you are building will conflict with the
 component ID of the host GHC.

 2. A similar situation exist for bootstrapping packages. When compiling
 GHC, we want to pick fairly deterministic component IDs for it in order to
 avoid needless rebuilding. But then if you turn around and use one of
 these builds to bootstrap GHC, if you use the same deterministic scheme
 you will end up with conflicting component IDs.

 3. More generally, if you are building a package which is already in the
 global database (and thus not easily removable), it is sometimes VERY
 CONVENIENT to be able to pick whatever component ID you want, even if it's
 in the global database. (1) and (2) are cases of this.

 So I think what we want to do is bring back shadowing, but have it operate
 on a PER-DATABASE basis. For example, if we have the following databases:

 {{{
 pkg.conf.1
   foo-0.1-XXX
   bar-0.2-YYY (depends on foo-0.1-XXX)
 pkg.conf.2
   foo-0.1-XXX
   baz-0.3-ZZZ (depends on foo-0.1-XXX)
 }}}

 If we stack pkg.conf.2 on top of pkg.conf.1, we invalidate foo-0.1-XXX
 FROM pkg.conf.1 (which simply means any packages from pkg.conf.1 which
 refer to it.)

 It also occurs to me that we should also be recording the ABIs of packages
 we depend on, to ensure consistency. Consider:

 {{{
 pkg.conf.1
   foo-0.1-XXX (abi is AAA)
 pkg.conf.2
   foo-0.1-XXX (abi is BBB)
 pkg.conf.3
   bar-0.1-YYY (depends on foo-0.1-XXX)
 }}}

 Which is the correct database to use `pkg.conf.3` with? We have no way of
 telling today! Sure, `pkg.conf.3` is incomplete, but this is a supported
 mode of operation.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11025>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list