Files
haskell.nix/docs/tutorials/getting-started-hix.md
T
2022-02-04 10:08:10 +00:00

204 lines
5.6 KiB
Markdown

# Getting started with Hix
The `hix` tools are wrappers for the various `nix` tools that
use `haskell.nix` without the need to add any `.nix` files.
This is useful for:
* A quick way to try out haskell.nix for new users.
* Using haskell.nix to work on projects that do not have
`.nix` files.
* Testing to see if `haskell.nix` can build a project.
* Making `flake` and `non flake` configurations to check `haskell.nix`
treats them the same.
## Installing Nix
To use Hix you will need to install [Nix](https://nixos.org/download.html).
## Setting up the binary cache
IMPORTANT: you *must* do this or you *will* build several copies of GHC!
You can configure Nix to use our binary cache, which is pushed to by CI, so should contain the artifacts that you need.
You need to add the following sections to `/etc/nix/nix.conf` or, if you are a trusted user, `~/.config/nix/nix.conf` (if you don't know what a "trusted user" is, you probably want to do the former).
```
trusted-public-keys = [...] hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ= [...]
substituters = [...] https://hydra.iohk.io [...]
```
This can be tricky to get setup properly. If you're still having trouble getting cache hits, consult the corresponding [troubleshooting section](../reference/troubleshooting#why-am-i-building-ghc).
## Installing Hix
```
nix-env -iA hix -f https://github.com/input-output-hk/haskell.nix/tarball/master
```
## Updating Hix (also updates hackage)
```
hix update
```
This is also necessary to make the latest nightly snapshot of hackage
avaiable to nix.
## Building with Hix
To run `cabal build` in a nix-shell with all the dependencies required:
```
cabal unpack hello
cd hello-1.0.0.2
hix-shell --run 'cabal build'
```
Build with nix:
```
hix-build -A hsPkgs.hello.components.exes.hello
```
Cross compile to JavaScript:
```
hix-build -A projectCross.ghcjs.hsPkgs.hello.components.exes.hello
```
## Configuring Hix
The configuration arguments for `Hix` can be (from highest precedence to lowest):
* Passed on the command line with `--arg` (or `--argstr` for string args).
* Placed in `nix/hix.nix` file in the project dir.
* Placed in `~/.config/hix/hix.conf`
For example to build with GHC 8.10.7:
```
hix-shell --argstr compiler-nix-name ghc8107 --run 'cabal build'
```
or add a `nix/hix.nix` or `~/.config/hix/hix.conf` file:
```nix
{ compiler-nix-name = "ghc8107"; }
```
Here are just a few of the other configuration arguments you could use
in the files or on the command line (they are all optional):
```nix
{ name = "hello"; # for better error messages and derivation names
nixpkgsPin = "nixpkgs-unstable"; # or nixpkgs-2111 or nixpkgs-2105
nixpkgs = <nixpkgs>; # use this instead of nixpkgsPin
subDir = "some/sub/dir"; # sub dir containing the haskell project
projectFileName = "stack.yaml"; # use this project file
tools.haskell-language-server = "latest";
tools.hlint = "latest"; # Include the latest hls and hlint in the shell
index-state = "2021-02-22T00:00:00Z"; # It is normally best to put this in `cabal.project` (not here)
# PLUS MANY MORE! Almost any argument you can pass to the project functions
# or to `shellFor` can be used in as a Hix configuration argument.
}
```
## Adding Nix Support with Niv
If you have a `nix/hix.nix` file with suitable configuration that
you want to make available to users with Nix (without having to
install Hix).
[Niv](https://github.com/nmattia/niv) is a command line tool for keeping track of Nix project dependencies.
After installing niv you can initialize niv and pin the latest haskell.nix
commit by running the following in the root directory of the project:
```
niv init
niv add input-output-hk/haskell.nix -n haskellNix
```
Add `default.nix`:
```nix
(import (import nix/sources.nix).haskellNix {}).hix.project { src = ./.; }
```
If you want to also pin `nixpkgs` with Niv use:
```nix
let
sources = import nix/sources.nix;
in
(import sources.haskellNix {}).hix.project {
inherit (sources) nixpkgs;
src = ./.;
}
```
Add `shell.nix`:
```nix
(import ./.).shell
```
When you want to update to the latest version of haskell.nix use:
```
niv update haskellNix
```
## Adding Nix Flake Support
To add flake support that uses the `nix/hix.nix` configuration in your
follow the [Getting started with flakes](getting-started.md) guide, but
use `haskell-nix.hix.project` instead of `haskell-nix.project'`
The `nixpkgs` used will need to be selected as a flake input (any selection
made in `nix/hix.nix` will be ignored).
Example `flake.nix` file:
```nix
{
description = "A very basic flake";
inputs.haskellNix.url = "github:input-output-hk/haskell.nix";
inputs.nixpkgs.follows = "haskellNix/nixpkgs-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils, haskellNix }:
flake-utils.lib.eachSystem [ "x86_64-linux" "x86_64-darwin" ] (system:
let
overlays = [ haskellNix.overlay
(final: prev: {
# This overlay adds our project to pkgs
helloProject =
final.haskell-nix.hix.project {
src = ./.;
# Other project options can be put in `nix/hix.nix`
};
})
];
pkgs = import nixpkgs { inherit system overlays; inherit (haskellNix) config; };
flake = pkgs.helloProject.flake {
# This adds support for `nix build .#js-unknown-ghcjs:hello:exe:hello`
crossPlatforms = p: [p.ghcjs];
};
in flake // {
# Built by `nix build .`
defaultPackage = flake.packages."hello:exe:hello";
});
}
```