Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/srid/haskell-multi-nix
A simple demo of Nixifying a multi-package Haskell project
https://github.com/srid/haskell-multi-nix
cabal haskell nix
Last synced: 10 days ago
JSON representation
A simple demo of Nixifying a multi-package Haskell project
- Host: GitHub
- URL: https://github.com/srid/haskell-multi-nix
- Owner: srid
- License: mit
- Created: 2022-10-06T14:28:19.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2024-04-22T09:56:31.000Z (7 months ago)
- Last Synced: 2024-10-11T23:49:28.547Z (26 days ago)
- Topics: cabal, haskell, nix
- Language: Nix
- Homepage:
- Size: 20.5 KB
- Stars: 11
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# haskell-multi-nix
Just a simple demo of Nixifying a *multi-package* Haskell project.
## Packages
This project has two local Haskell packages:
1. `foo`: a Haskell library exporting `Foo.fooFunc`.
2. `bar`: a Haskell executable that depends on `foo`To build the `foo` library:
```sh
nix build .#foo
```To build the `bar` executable:
```sh
nix build
```To run the executable:
```sh
nix run
```## Dev Shell
The Nix development shell (`nix develop`) allows you to run the various `cabal` commands on the local packages.
For example, this will compile and run the main executable:
```sh
nix develop -c cabal -- run bar
```## How it works
### The `nixpkgs` tree
The [`nixpkgs`](https://github.com/srid/haskell-multi-nix/tree/nixpkgs) release tag uses raw functions from nixpkgs.
The Haskell infrastructure in nixpkgs provides a package set (an attrset) called `pkgs.haskellPackages`[^ver]. We add two more packages -- `foo` and `bar` (the local packages) -- to this package set. We do this by using the standard nixpkgs overlay API (specifically `extend`, which was created by the implicit `makeExtensible`) defined in [fixed-points.nix](https://github.com/NixOS/nixpkgs/blob/master/lib/fixed-points.nix). After having added the local packages, the result is a *new* package set, which is no different *in essense* to the original package set (we can also put our dependency overrides in the same, or different, overlay). Note that any package in a package set can depend on any other packages; thus, it becomes possible to make `bar` depend on `foo` (see "build-depends" in `./bar/bar.cabal`) even though they come from the same overlay.
[^ver]: The package set `pkgs.haskellPackages` corresponds to the default GHC version. Non-default GHC versions have their own package sets, for e.g.: `pkgs.haskell.packages.ghc924` is the package set for GHC 9.2.4.
### The `master` tree
The `master` branch uses [haskell-flake](https://github.com/srid/haskell-flake) which abstracts much of what we explained above, such that your flake.nix is as small as possible.