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