A fork of haskell.nix with a more efficient GHCJS 8.10 compiler
#+STARTUP: showall hidestars
** :warning: Please use [[https://iohk.cachix.org][iohk.cachix.org]] instead of [[https://nix-tools.cachix.org][nix-tools.cachix.org]] :warning:
* Alternative Haskell Infrastructure for Nixpkgs
[[https://buildkite.com/input-output-hk/haskell-dot-nix][https://badge.buildkite.com/d453edcd29bd2f8f3f3b32c9b7d6777a33773d9671c37a6ccc.svg?branch=master]]
[[https://buildkite.com/input-output-hk/haskell-dot-nix-nightly-updates][https://img.shields.io/buildkite/c8d5a20d3ff0f440f82adb9190b43c16c91e5e47e8adfa867a/master.svg?label=nightly%20updates]]
=haskell.nix= is an experimental new builder for Haskell packages.
It works by automatically translating your Cabal or Stack project and
its dependencies into Nix code. It provides IFD (import from derivation)
functions that can minimize the amount of Nix code you need to add.
For the documentation, see https://input-output-hk.github.io/haskell.nix/.
** Quickstart
For =cabal.project= project add a =default.nix=:
#+begin_src sh
let
# Fetch the latest haskell.nix and import its default.nix
haskellNix = import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/master.tar.gz) {};
# haskell.nix provides access to the nixpkgs pins which are used by our CI, hence
# you will be more likely to get cache hits when using these.
# But you can also just use your own, e.g. '<nixpkgs>'
nixpkgsSrc = haskellNix.sources.nixpkgs-1909;
# haskell.nix provides some arguments to be passed to nixpkgs, including some patches
# and also the haskell.nix functionality itself as an overlay.
nixpkgsArgs = haskellNix.nixpkgsArgs;
in
{ pkgs ? import nixpkgsSrc nixpkgsArgs
, haskellCompiler ? "ghc865"
}:
# 'cabalProject' generates a package set based on a cabal.project (and the corresponding .cabal files)
pkgs.haskell-nix.cabalProject {
# 'cleanGit' cleans a source directory based on the files known by git
src = pkgs.haskell-nix.haskellLib.cleanGit { src = ./.; };
ghc = pkgs.buildPackages.pkgs.haskell-nix.compiler.${haskellCompiler};
}
#+end_src
Note that you'll need to add a comment specifying the expected sha256
output for your =source-repository-packages= in your =cabal.project=
file:
#+begin_src sh
source-repository-package
type: git
location: https://github.com/input-output-hk/iohk-monitoring-framework
subdir: plugins/backend-editor
tag: 4956b32f039579a0e7e4fd10793f65b4c77d9044
--sha256: 03lyb2m4i6p7rpjqarnhsx21nx48fwk6rzsrx15k6274a4bv0pix
#+end_src
For a =stack.yaml= project add a =default.nix=:
#+begin_src sh
let
haskellNix = import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/master.tar.gz) {};
nixpkgsSrc = haskellNix.sources.nixpkgs-1909;
nixpkgsArgs = haskellNix.nixpkgsArgs;
in
{ pkgs ? import nixpkgsSrc nixpkgsArgs
}:
pkgs.haskell-nix.stackProject {
src = pkgs.haskell-nix.haskellLib.cleanGit { src = ./.; };
}
#+end_src
To build the library component of a package in the project run:
#+begin_src sh
nix build -f . your-package-name.components.library
#+end_src
To build an executable:
#+begin_src sh
nix build -f . your-package-name.components.exes.your-exe-name
#+end_src
To open a shell for use with `cabal` run:
#+begin_src sh
nix-shell -A shellFor
cabal new-build your-package-name
cabal new-repl your-package-name:library:your-package-name
#+end_src
** Cache
CI pushes to [[https://cachix.org][cachix]] so you can benefit from the cache
if you pin a combination of =haskell.nix= and =nixpkgs= built by CI.
You'll need to configure the [[https://iohk.cachix.org][iohk cachix]]
as a =substituter= for =nix= and add the public key found at the url to
=trusted-public-keys=.
** Related repos
The =haskell.nix= repository contains the runtime system for building
Haskell packages in Nix. It depends on other repos, which are:
- [[https://github.com/input-output-hk/nix-tools][nix-tools]] โ provides the programs for generating Nix expressions from
Haskell projects.
- [[https://github.com/input-output-hk/hackage.nix][hackage.nix]] โ the latest contents of the [[https://hackage.haskell.org/][Hackage]] databases,
converted to Nix expressions.
- [[https://github.com/input-output-hk/stackage.nix][stackage.nix]] โ all of the [[https://www.stackage.org/][Stackage]] snapshots, converted to Nix
expressions.
** IRC Channel
Join the [[https://www.irccloud.com/invite?channel=%23haskell.nix&hostname=irc.freenode.net&port=6697&ssl=1][#haskell.nix]] channel on [[https://freenode.net/][irc.freenode.net]] to get help or discuss
the development of =haskell.nix= and =nix-tools=.