# Horizon Haskell Platform Core

[horizon-haskell.net](https://horizon-haskell.net).

Horizon is a haskell package set targetting new builds of GHC.

This is the core subset required to bootstrap horizon-gen-nix.

## Package Set Policy

This package set has the following policy:

* GHC will advance as often as possible.

* Nonversioned locations (git, unversioned tarballs) are permitted to allow
  GHC to advance.

* The following applications must always build:
  * cabal-install
  * cabal2nix
  * dhall
  * dhall-docs
  * dhall-nixpkgs
  * foliage
  * horizon-gen-nix
  * hpack
  * jailbreak-cabal
  * sydtest

* The following applications are scheduled to be added as requirements to this set.
  * flake-to-gitlab-ci
  * feedback

## Updating the Package Set

Generating the nix expressions for the package set is a two step process.

1. Edit the `horizon.dhall` file.
2. Generate the nix expressions with `nix run develop/#horizon-gen-nix`.

You can edit the `horizon.dhall` file in one of two ways: manually using a text
editor, or programatically using `horizon-shell`.

### Using horizon-shell.

To use `horizon-shell`.

```
nix run develop/#horizon-shell
```

This is a haskell interpreter with a few shortcut functions available. Running
`tryToUpgradeEverything` will poll hackage for any potential updates and add
them to the dhall file. This will only modify the dhall, not the nix
expressions. You must remember to run `nix run develop/#horizon-gen-nix`
afterwards.

To quickly add a new package to the dhall, use the `addHackage` function. For example
`addHackage "optics"`.

### GHC

```
nix-prefetch-git https://gitlab.haskell.org/ghc/ghc --fetch-submodules > ghc.json
```

## Tweaking & Hacking

If you need to do additional manual overrides to the nix code, such as
`addPkgconfigDepends`, edit the `configuration/common.nix` overlay, which is
applied over the generated derivations.

If you need to nullify libraries, use the `configuration/hacking.nix` overlay.
Try to leave a note as to why this library has been nullified.

## Feedback

To build all packages, run

```
nix run develop/#feedback -- build
```

## Hoogle

To run a hoogle server containing the entire package set. Do

```
nix run .#run-hoogle
```