Nix is a package manager and build tool. It is used in cardano-wallet
for:
- Provisioning dependencies in Buildkite CI.
- Reproducible development environments (nix develop).
Nix is not required for cardano-wallet
development, but it can help you a lot if you try it.
Installing/Upgrading Nix
The minimum required version of Nix is 2.5.
Binary cache
To improve build speed, it is highly recommended (but not mandatory) to configure the binary cache maintained by IOG.
See iohk-nix/docs/nix.md or cardano-node/doc/getting-started/building-the-node-using-nix.md for instructions on how to configure the IOG binary cache on your system.
Building with Nix
See the Building page.
Reproducible Development Environment
Run nix develop
to get a build environment which includes all necessary compilers, libraries, and development tools.
This uses the devShell
attribute of flake.nix
.
Full instructions are on the Building page.
Development tips
Code generation
The Nix build depends on code which is generated from the Cabal files. If you change these files, then you will probably need to update the generated files.
To do this, run:
./nix/regenerate.sh
Then add and commit the files that it creates.
Alternatively, wait for Buildkite to run this same command. It will produce a patch, and also push a commit with updates back to your branch.
Haskell.nix pin
The Nix build also depends on the Haskell.nix build infrastructure. It may be necessary to update haskell.nix
when moving to a new Haskell LTS version or adding Hackage dependencies.
To update to the latest version, run the following command:
$ nix flake lock --update-input haskellNix
warning: updating lock file '/home/rodney/iohk/cw/flake/flake.lock':
• Updated input 'haskellNix':
'github:input-output-hk/haskell.nix/f05b4ce7337cfa833a377a4f7a889cdbc6581103' (2022-01-11)
→ 'github:input-output-hk/haskell.nix/a3c9d33f301715b162b12afe926b4968f2fe573d' (2022-01-17)
• Updated input 'haskellNix/hackage':
'github:input-output-hk/hackage.nix/d3e03042af2d0c71773965051d29b1e50fbb128e' (2022-01-11)
→ 'github:input-output-hk/hackage.nix/3e64c7f692490cb403a258209e90fd589f2434a0' (2022-01-17)
• Updated input 'haskellNix/stackage':
'github:input-output-hk/stackage.nix/308844000fafade0754e8c6641d0277768050413' (2022-01-11)
→ 'github:input-output-hk/stackage.nix/3c20ae33c6e59db9ba49b918d69caefb0187a2c5' (2022-01-15)
warning: Git tree '/home/rodney/iohk/cw/flake' is dirty
Then commit the updated flake.lock file.
When updating Haskell.nix, consult the ChangeLog file. There may have been API changes which need corresponding updates in cardano-wallet
.
iohk-nix pin
The procedure for updating the iohk-nix
library of common code is much the same as for Haskell.nix. Run this command and commit the updated flake.lock
file:
$ nix flake lock --update-input iohkNix
It is not often necessary to update iohk-nix
. Before updating, ask devops whether there may be changes which affect our build.
Common problems
Warning: dumping very large path
warning: dumping very large path (> 256 MiB); this may run out of memory
Make sure you don’t have large files or directories in your git worktree.
When building, Nix will copy the project sources into /nix/store
. Generated folders such as dist-newstyle
will be filtered out, but everything else will be copied.