mirror of
https://github.com/simplex-chat/haskell.nix.git
synced 2026-06-03 09:17:32 +00:00
204 lines
5.6 KiB
Markdown
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";
|
|
});
|
|
}
|
|
```
|
|
|
|
|