Skip to content

Commit 05c0555

Browse files
authored
Add flake support to hix (#1572)
This adds support for using nix flakes commands with hix. This is done by creating a hidden `.hix-flake` directory and passing the source in using `--override-input`. It also includes a `hix init` command to add a `flake.nix` and `nix/hix.nix` configuration file.
1 parent 5a1adea commit 05c0555

File tree

12 files changed

+346
-226
lines changed

12 files changed

+346
-226
lines changed

docs/tutorials/getting-started-hix.md

Lines changed: 44 additions & 184 deletions
Original file line numberDiff line numberDiff line change
@@ -1,227 +1,87 @@
11
# Getting started with Hix
22

3-
The `hix` tools are wrappers for the various `nix` tools that
4-
use `haskell.nix` without the need to add any `.nix` files.
3+
Hix is a command line tool that provides an easy way to add haskell.nix
4+
support to existing haskell projects.
55

6-
This is useful for:
6+
You will need `nix` installed and in you `PATH` with nix in PATH with
7+
`experimental-features = [ "nix-command" "flakes" ];` configured.
8+
See https://nixos.wiki/wiki/Flakes for details.
79

8-
* A quick way to try out haskell.nix for new users.
10+
## Using `hix init` and `nix`
911

10-
* Using haskell.nix to work on projects that do not have
11-
`.nix` files.
12+
The `hix init` command adds a `flake.nix` and `nix/hix.nix` file.
13+
After that the project can be used with regular `nix` tools.
1214

13-
* Testing to see if `haskell.nix` can build a project.
15+
For instance to run `cabal build` on the `hello` package from hackage:
1416

15-
* Making `flake` and `non flake` configurations to check `haskell.nix`
16-
treats them the same.
17-
18-
## Installing Nix
19-
20-
To use Hix you will need to install [Nix](https://nixos.org/download.html).
21-
22-
## Setting up the binary cache
23-
24-
IMPORTANT: you *must* do this or you *will* build several copies of GHC!
25-
26-
You can configure Nix to use our binary cache, which is pushed to by CI, so should contain the artifacts that you need.
17+
```bash
18+
cabal unpack hello
19+
cd hello-1.0.0.2
20+
nix run "github:input-output-hk/haskell.nix#hix" -- init
21+
nix develop
22+
cabal build
23+
```
2724

28-
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).
25+
To view the contents of the flake run:
2926

3027
```
31-
trusted-public-keys = [...] hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ= [...]
32-
substituters = [...] https://cache.iog.io [...]
28+
nix flake show
3329
```
3430

35-
If you're running NixOS, you need to add/update the following in your `/etc/nixos/configuration.nix` files instead.
31+
To build a component with nix:
3632

3733
```
38-
# Binary Cache for Haskell.nix
39-
nix.settings.trusted-public-keys = [
40-
"hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ="
41-
];
42-
nix.settings.substituters = [
43-
"https://cache.iog.io"
44-
];
34+
nix build .#hello:exe:hello
4535
```
4636

47-
NixOS-21.11 and older use slightly different settings.
37+
To build and run a component:
4838

4939
```
50-
# Binary Cache for Haskell.nix
51-
nix.binaryCachePublicKeys = [
52-
"hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ="
53-
];
54-
nix.binaryCaches = [
55-
"https://cache.iog.io"
56-
];
40+
nix run .#hello:exe:hello
5741
```
5842

59-
This can be tricky to get setup properly. If you're still having trouble getting cache hits, consult the corresponding [troubleshooting section](../troubleshooting.md#why-am-i-building-ghc).
60-
6143
## Installing Hix
6244

45+
To use the other Hix features first install Hix with:
46+
6347
```
6448
nix-env -iA hix -f https://github.com/input-output-hk/haskell.nix/tarball/master
6549
```
6650

67-
## Updating Hix (also updates hackage)
51+
To update run to the latest version run:
6852

6953
```
7054
hix update
7155
```
7256

73-
This is also necessary to make the latest nightly snapshot of hackage
74-
avaiable to nix.
75-
76-
## Building with Hix
77-
78-
To run `cabal build` in a nix-shell with all the dependencies required:
79-
80-
```
81-
cabal unpack hello
82-
cd hello-1.0.0.2
83-
hix-shell --run 'cabal build'
84-
```
85-
86-
Build with nix:
87-
88-
```
89-
hix-build -A hsPkgs.hello.components.exes.hello
90-
```
91-
92-
Cross compile to JavaScript:
93-
94-
```
95-
hix-build -A projectCross.ghcjs.hsPkgs.hello.components.exes.hello
96-
```
97-
98-
## Configuring Hix
99-
100-
The configuration arguments for `Hix` can be (from highest precedence to lowest):
101-
102-
* Passed on the command line with `--arg` (or `--argstr` for string args).
103-
104-
* Placed in `nix/hix.nix` file in the project dir.
105-
106-
* Placed in `~/.config/hix/hix.conf`
107-
108-
For example to build with GHC 8.10.7:
109-
110-
```
111-
hix-shell --argstr compiler-nix-name ghc8107 --run 'cabal build'
112-
```
113-
114-
or add a `nix/hix.nix` or `~/.config/hix/hix.conf` file:
115-
116-
```nix
117-
{ compiler-nix-name = "ghc8107"; }
118-
```
119-
120-
Here are just a few of the other configuration arguments you could use
121-
in the files or on the command line (they are all optional):
122-
123-
```nix
124-
{ name = "hello"; # for better error messages and derivation names
125-
nixpkgsPin = "nixpkgs-unstable"; # or nixpkgs-2111 or nixpkgs-2105
126-
nixpkgs = <nixpkgs>; # use this instead of nixpkgsPin
127-
subDir = "some/sub/dir"; # sub dir containing the haskell project
128-
projectFileName = "stack.yaml"; # use this project file
129-
tools.haskell-language-server = "latest";
130-
tools.hlint = "latest"; # Include the latest hls and hlint in the shell
131-
index-state = "2021-02-22T00:00:00Z"; # It is normally best to put this in `cabal.project` (not here)
132-
133-
# PLUS MANY MORE! Almost any argument you can pass to the project functions
134-
# or to `shellFor` can be used in as a Hix configuration argument.
135-
136-
}
137-
```
138-
139-
## Adding Nix Support with Niv
57+
## Using `hix develop`, `hix flake`, `hix build` and `hix run`
14058

141-
If you have a `nix/hix.nix` file with suitable configuration that
142-
you want to make available to users with Nix (without having to
143-
install Hix).
59+
These commands work the same as the `nix` versions
60+
without using the `flake.nix`. Instead a boiler
61+
plate haskell.nix flake.nix file is added to
62+
`.hix-flake/flake.nix` and used from there.
14463

145-
[Niv](https://github.com/nmattia/niv) is a command line tool for keeping track of Nix project dependencies.
64+
The is can be useful if the project already includes a
65+
`flake.nix` or if you do not intend to maintain one.
14666

147-
After installing niv you can initialize niv and pin the latest haskell.nix
148-
commit by running the following in the root directory of the project:
14967

150-
```
151-
niv init
152-
niv add input-output-hk/haskell.nix -n haskellNix
153-
```
68+
Then all of these should work without the need to
69+
run `hix init`:
15470

155-
Add `default.nix`:
156-
157-
```nix
158-
(import (import nix/sources.nix).haskellNix {}).hix.project { src = ./.; }
15971
```
160-
161-
If you want to also pin `nixpkgs` with Niv use:
162-
163-
```nix
164-
let
165-
sources = import nix/sources.nix;
166-
in
167-
(import sources.haskellNix {}).hix.project {
168-
inherit (sources) nixpkgs;
169-
src = ./.;
170-
}
72+
hix develop
73+
hix flake show
74+
hix build .#hello:exe:hello
75+
hix run .#hello:exe:hello
17176
```
17277

173-
Add `shell.nix`:
78+
## Using `hix-shell` and `hix-build`
17479

175-
```nix
176-
(import ./.).shell
177-
```
178-
179-
When you want to update to the latest version of haskell.nix use:
80+
These commands behave like `nix-build` and `hix-shell`
81+
would if a boiler plate `default.nix` and `shell.nix`
82+
we present.
18083

18184
```
182-
niv update haskellNix
183-
```
184-
185-
## Adding Nix Flake Support
186-
187-
To add flake support that uses the `nix/hix.nix` configuration in your
188-
follow the [Getting started with flakes](getting-started.md) guide, but
189-
use `haskell-nix.hix.project` instead of `haskell-nix.project'`
190-
191-
The `nixpkgs` used will need to be selected as a flake input (any selection
192-
made in `nix/hix.nix` will be ignored).
193-
194-
Example `flake.nix` file:
195-
196-
```nix
197-
{
198-
description = "A very basic flake";
199-
inputs.haskellNix.url = "github:input-output-hk/haskell.nix";
200-
inputs.nixpkgs.follows = "haskellNix/nixpkgs-unstable";
201-
inputs.flake-utils.url = "github:numtide/flake-utils";
202-
outputs = { self, nixpkgs, flake-utils, haskellNix }:
203-
flake-utils.lib.eachSystem [ "x86_64-linux" "x86_64-darwin" ] (system:
204-
let
205-
overlays = [ haskellNix.overlay
206-
(final: prev: {
207-
# This overlay adds our project to pkgs
208-
helloProject =
209-
final.haskell-nix.hix.project {
210-
src = ./.;
211-
# Other project options can be put in `nix/hix.nix`
212-
};
213-
})
214-
];
215-
pkgs = import nixpkgs { inherit system overlays; inherit (haskellNix) config; };
216-
flake = pkgs.helloProject.flake {
217-
# This adds support for `nix build .#js-unknown-ghcjs:hello:exe:hello`
218-
crossPlatforms = p: [p.ghcjs];
219-
};
220-
in flake // {
221-
# Built by `nix build .`
222-
defaultPackage = flake.packages."hello:exe:hello";
223-
});
224-
}
85+
hix-shell --run 'cabal build all'
86+
hix-build -A hsPkgs.hello.components.exes.hello
22587
```
226-
227-

flake.nix

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@
135135
# Exposed so that buildkite can check that `allow-import-from-derivation=false` works for core of haskell.nix
136136
roots = legacyPackagesUnstable.haskell-nix.roots compiler;
137137

138+
packages = ((self.internal.compat { inherit system; }).hix).apps;
139+
138140
devShell = with self.legacyPackages.${system};
139141
mkShell {
140142
buildInputs = [

0 commit comments

Comments
 (0)