Skip to content
Snippets Groups Projects
Matthew Pickering's avatar
Matthew Pickering authored
There are several parts to this patch which are logically distinct but
work together to support the overal goal of starting a GHCi session with
multiple packages loaded at once.

1. When a user writes "cabal repl <target>" then if the user is using a
   compiler > ghc-9.4.* then we will attempt to start a multi-session
   which loads the selected targets into one multi-package session of
   GHC.
1a. The closure property states that in order to load components `p` and `q` into
    the same session that if `p` depends on `z` and `z` depends on `q`
    then `z` must also be loaded into the session.
1b. Only inplace packages are able to be loaded into a multi session (if a component
    `z` exists then it is already made into an inplace package by
    cabal). Therefore cabal has already engineered that there is source
    code locally available for all packages which we will want to load
    into a session.

2. The solver is unmodified, the solver is given the repl targets and
   creates a build plan as before. After the solver is completed then in
   `setRootTargets` and `pruneInstallPlan` we modify the install plan to
   enforce the closure property and mark which dependencies need to be
   promised.

   * Mark the current components as `BuildInPlaceOnly InMemory`, which
     indicates to the compiler that it is to be built in a GHC
     multi-session.
   * Augment the component repl targets to indicate that components
     required by the closure property (in addition to normal targets)
     will be loaded into the repl.
   * Modify the dependency edges in `compLibDependencies` to indicate
     which dependencies are the promised ones (which is precisely
     components which are `BuildInPlaceOnly InMemory` build styles).
     This is the field which is eventually used to populate the
     `--dependency` argument to `./Setup configure`.

Fixes #8491
e61b658d
History

Cabal

Hackage version Stackage version Documentation Status IRC chat Matrix chat

This Cabal Git repository contains the following main packages:

The canonical upstream repository is located at https://github.com/haskell/cabal.

Ways to get the cabal-install binary

  1. GHCup (preferred): get GHCup using the directions on its website and run:

    ghcup install --set cabal latest
  2. Download from official website: the cabal-install binary download for your platform should contain the cabal executable.

Getting unreleased versions of cabal-install: gives you a chance to try out yet-unreleased features. Currently, we only provide binaries for x86_64 platforms.

  1. GitHub preview release built from the tip of the master branch:

  2. Even more cutting-edge binaries built from pull requests are always available from the Validate worklow page on GitHub, at the very bottom of the page.

Ways to build cabal-install for everyday use

  1. With cabal-install: if you have a pre-existing version of cabal-install, run:

    cabal install cabal-install

    to get the latest version of cabal-install. (You may want to cabal update first.)

  2. From Git: again with a pre-existing version of cabal-install, you can install the latest version from the Git repository. Clone the Git repository, move to its root, and run:

    cabal install --project-file=cabal.project.release cabal-install
  3. Bootstrapping: if you don't have a pre-existing version of cabal-install, look into the bootstrap directory.

Build for hacking and contributing to cabal

Refer to CONTRIBUTING.md.