Skip to content
  • Matthew Pickering's avatar
    e61b658d
    Add support for loading multiple components into one repl session · e61b658d
    Matthew Pickering authored and Francesco Gazzetta's avatar Francesco Gazzetta committed
    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
    Add support for loading multiple components into one repl session
    Matthew Pickering authored and Francesco Gazzetta's avatar Francesco Gazzetta committed
    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
Loading