Cabal woe

Oleg Grenrus oleg.grenrus at iki.fi
Wed Jul 10 09:53:34 UTC 2024


On 10.7.2024 11.27, Simon Peyton Jones wrote:
> I wonder if there is an articulate writeup of Cabal's mental model.

Sadly, i'm not aware of any. I'm also afraid, that Duncan's (who made 
initial v2-setup), Herbert's (who pushed v2 over the line) and mine 
models differ at least slightly.

The 
https://well-typed.com/blog/2015/01/how-we-might-abolish-cabal-hell-part-2/ 
is Duncan's view from 2015.

A side comment, we really should rename either the Cabal-the-library or 
cabal-install. Because I'm sure you are asking about mental model behind 
cabal-install v2-build, as "nothing" has changed in Cabal-the-library 
for a decade.

The idea is that cabal-install v2-build installs everything into single 
global store, and gives consistent views to that store. In practice the 
global store is unusable directly, as a whole it may not be consistent 
nor unambiguous (see e.g. 
https://gitlab.haskell.org/ghc/ghc/-/issues/24823 for funny side-effects 
of that, you may have dozens of installed units in the package db with 
the same package name and version).

> e.g.  What is an environment file?

Essentially it's a set of `-package-db` and `-package-id` flags.
In other words, environment files are (specialized) response-files which 
ghc (tool, or lib) may pick up automatically.
They are a way to encode a view into cabal's store (but technically 
there is no reason they cannot be used to give a view into stack's 
snapshot package databases too)

> Why can't my GHC find Prelude?
Probably because there is -hide-all-packages, -clear-package-db (or 
both); without -package-db and -package-id for base (a package with 
module Prelude).

> If you invoke plain ghc, what packages does it "see"?

It depends on the state you have. This is complicated (use 
cabal-install). If you have a default or local environment file, ghc 
will use those. If there aren't it will use a global package db.

To be honest, I'm not so sure what GHC does by default. I'm mostly 
familiar with programmatic execution, which often starts with 
`-clear-package-db`, `-hide-all-packages` etc to clear all the implicit 
stuff GHC may do.

- Oleg



More information about the ghc-devs mailing list