
#10566: Move "package key" generation to GHC -------------------------------------+------------------------------------- Reporter: ezyang | Owner: ezyang Type: bug | Status: new Priority: normal | Milestone: 7.12.1 Component: Package system | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: None/Unknown | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by ezyang): Based on conversation with simonpj et al, we have a different plan to accomplish this: 1. We introduce a new concept, the *version hash*, a hash of package name, package version, and the version hashes of all textual dependencies (i.e. packages which were include.) A version hash is a coarse approximation of installed package IDs, which are suitable for inclusion in package keys (you don't want to put an IPID in a package key, since it means the key will change any time the source changes.) Version hashes are calculated by Cabal and passed to GHC, and they are recorded in the installed package database. 2. GHC now accepts a new flag `-version-hash` which Cabal can invoke in order to pass in a version hash. So now we get something like `-version- hash 8TmvWUcS1U1IKHT0levwg3 -hide-all-packages -package-id ...` when we call GHC. GHC takes `-version-hash` and then computes a package key based on it. 3. Cabal computes the version hash by looking at the recorded version hashes in the installed package database of all the external dependencies of the library portion of the package. It then calls GHC's `--package-key` major mode to get the package key that the package will end up having. Cabal tracking bug: https://github.com/haskell/cabal/pull/2685 One minor complication: sometimes, GHC needs to know what the package name of the package currently being built is to give a good error message. Since the version hash is just a hash, this isn't enough information. There are two ways we can get the information we need: 1. Just pass it to GHC. `-package-name` is not a bad flag name for this. 2. Put it into an (inplace) package database and have GHC query that database for the information. This requires some Cabal changes, see https://github.com/haskell/cabal/issues/2710 -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10566#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler