
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