cabal2nix: Convert Cabal files into Nix build instructions.

[ bsd3, distribution, library, nix, program ] [ Propose Tags ] [ Report a vulnerability ]
Versions [RSS] 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.20, 1.21, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.30, 1.31, 1.32, 1.33, 1.34, 1.35, 1.37, 1.38, 1.39, 1.40, 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.50, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.60, 1.61, 1.63, 1.64, 1.65, 1.66, 1.67, 1.68, 1.69, 1.70, 1.71, 1.72, 1.73, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.1, 2.1.1, 2.2, 2.2.1, 2.3, 2.3.1, 2.4, 2.4.1, 2.5, 2.6, 2.7, 2.7.1, 2.7.2, 2.8, 2.8.1, 2.8.2, 2.9, 2.9.1, 2.9.2, 2.9.3, 2.10.0, 2.10.1, 2.10.2, 2.11, 2.11.1, 2.12, 2.13, 2.14, 2.14.1, 2.14.2, 2.14.3, 2.14.4, 2.15.0, 2.15.1, 2.15.2, 2.15.3, 2.15.4, 2.15.5, 2.15.6, 2.16.0, 2.17.0, 2.18.0, 2.19.0, 2.19.1 (info)
Change log CHANGELOG.md
Dependencies aeson (>1), ansi-wl-pprint, base (>4.11 && <5), bytestring, Cabal (>=3.0), cabal2nix, containers (>=0.5.9), deepseq (>=1.4), directory, distribution-nixpkgs (>=1.6 && <1.7.0), filepath, hackage-db (>=2.0.1), hopenssl (>=2), hpack (>=0.29.6), language-nix, lens, monad-par, monad-par-extras, mtl, optparse-applicative, pretty (>=1.1.2), process, split, text, time, transformers, yaml [details]
Tested with ghc ==8.10.4 || ==9.0.1
License BSD-3-Clause
Author Peter Simons <simons@cryp.to>
Maintainer sternenseemann <sternenseemann@systemli.org>
Revised Revision 1 made by sternenseemann at 2022-05-28T13:10:42Z
Category Distribution, Nix
Home page https://github.com/nixos/cabal2nix#readme
Bug tracker https://github.com/nixos/cabal2nix/issues
Source repo head: git clone https://github.com/nixos/cabal2nix
Uploaded by sternenseemann at 2021-07-29T12:58:54Z
Distributions LTSHaskell:2.19.1, NixOS:2.19.1, Stackage:2.19.1
Reverse Dependencies 4 direct, 0 indirect [details]
Executables hackage2nix, cabal2nix
Downloads 98377 total (532 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2021-07-29 [all 1 reports]

Readme for cabal2nix-2.18.0

[back to package description]

Cabal2nix

hackage release stackage LTS package stackage Nightly package Continous Integration

cabal2nix converts a single Cabal file into a single Nix build expression. For example:

$ cabal2nix cabal://mtl
{ mkDerivation, base, lib, transformers }:
mkDerivation {
  pname = "mtl";
  version = "2.2.1";
  sha256 = "1icdbj2rshzn0m1zz5wa7v3xvkf6qw811p4s7jgqwvx1ydwrvrfa";
  libraryHaskellDepends = [ base transformers ];
  homepage = "http://github.com/ekmett/mtl";
  description = "Monad classes, using functional dependencies";
  license = lib.licenses.bsd3;
}

Cabal files can be referred to using the magic URL cabal://NAME-VERSION, which will automatically download the file from Hackage. Alternatively, a direct http://host/path/pkg.cabal URL can be provided, as well as a file:///local/path/pkg.cabal URI that doesn't depend on network access. However, if the source hash is not already in cabal2nix's cache or provided using the --sha256 option, cabal2nix still needs to download the source code to compute the hash, which still causes network traffic. Run the utility with --help to see the complete list of supported command-line flags.

Detailed instructions on how to use those generated files with Nix can be found at https://haskell4nix.readthedocs.io/nixpkgs-users-guide.html#how-to-create-nix-builds-for-your-own-private-haskell-packages.

cabal2nix can also build derivations for projects from other sources than Hackage. You only need to provide a URI that points to a cabal project. The most common use-case for this is probably to generate a derivation for a project on the local file system:

$ cabal get mtl-2.2.1 && cd mtl-2.2.1
$ cabal2nix .
{ mkDerivation, base, lib, transformers }:
mkDerivation {
  pname = "mtl";
  version = "2.2.1";
  src = ./.;
  libraryHaskellDepends = [ base transformers ];
  homepage = "http://github.com/ekmett/mtl";
  description = "Monad classes, using functional dependencies";
  license = lib.licenses.bsd3;
}

This derivation will not fetch from hackage, but instead use the directory which contains the derivation as the source repository.

cabal2nix currently supports the following repository types:

  • directory
  • source archive (zip, tar.gz, ...) from http or https URL or local file.
  • git, mercurial, svn or bazaar repository

hackage2nix

This repository also contains, in the hackage2nix/ directory, the tool to update the Haskell packages in nixpkgs. It has its own README there.

Building

cabal2nix is built using cabal-install, like you'd expect, and you are free to use your favourite way of setting up a Haskell development environment.

Since cabal2nix is quite intertwined with the packages distribution-nixpkgs and hackage-db, we recommend setting up a shared development environment for the three packages like so:

$ mkdir /path/to/cabal2nix-root && cd /path/to/cabal2nix-root
$ # clone repositories, note that you may need to checkout an
$ # older tag for some depending on breaking changes on master.
$ git clone https://github.com/NixOS/cabal2nix.git
$ git clone https://github.com/NixOS/hackage-db.git
$ git clone https://github.com/NixOS/distribution-nixpkgs.git
$ # setup development environment with shellFor
$ cat > shell.nix << EOF
# assumes nix{os,pkgs}-unstable
{ pkgs ? import <nixpkgs> {} }:

pkgs.haskellPackages.shellFor {
  packages = p: [
    p.cabal2nix-unstable
    p.distribution-nixpkgs
    p.hackage-db
  ];

  # for running doctests locally
  nativeBuildInputs = [
    pkgs.haskellPackages.doctest
  ];

  # set environment variable, so the development version of
  # distribution-nixpkgs finds derivation-attr-paths.nix
  distribution_nixpkgs_datadir = toString ./distribution-nixpkgs;
}
EOF
$ # tell cabal about local packages
$ cat > cabal.project << EOF
packages: ./*/*.cabal
EOF
$ # test our new development environment
$ nix-shell --run "cabal v2-build exe:cabal2nix exe:hackage2nix"