cabal2nix
converts a single Cabal file into a single Nix build expression.
For example:
$ cabal2nix cabal:https://mtl
{ mkDerivation, base, stdenv, transformers }:
mkDerivation {
pname = "mtl";
version = "2.2.1";
sha256 = "1icdbj2rshzn0m1zz5wa7v3xvkf6qw811p4s7jgqwvx1ydwrvrfa";
buildDepends = [ base transformers ];
homepage = "https://github.com/ekmett/mtl";
description = "Monad classes, using functional dependencies";
license = stdenv.lib.licenses.bsd3;
}
Cabal files can be referred to using the magic URL cabal:https://NAME-VERSION
,
which will automatically download the file from Hackage. Alternatively, a
direct https://host/path/pkg.cabal
URL can be provided, as well as a
file:https:///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 obviously still causes network traffic. Run the
utility with --help
to see the complete list of supported command line flags.
Detailed instructions how to use those generated files with Nix can be found at https://nixos.org/nixpkgs/manual/#users-guide-to-the-haskell-infrastructure.
cabal2nix
can also build derivations for projects from other sources than
hackage. You only need to provide an URI that points to a cabal project. The
most common usecase 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, stdenv, transformers }:
mkDerivation {
pname = "mtl";
version = "2.2.1";
src = ./.;
buildDepends = [ base transformers ];
homepage = "https://github.com/ekmett/mtl";
description = "Monad classes, using functional dependencies";
license = stdenv.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 respository types:
- directory
- source archive (zip, tar.gz, ...) from http or https URL or local file.
- git, mercurial, svn or bazaar repository
The cabal2nix.cabal
file for this package is automatically generated by the
generate-cabal-file.hs
program. The easiest way to accomplish that is to run
nix-shell release.nix -A cabal2nix.ghc7102.x86_64-linux.env --run "runhaskell generate-cabal-file.hs >cabal2nix.cabal"
where x86_64-linux
should be replaced with whatever system ID is appropriate
for your local machine. Basically, generate-cabal-file.hs
requires the
cartel library and git
to run.
With the Cabal file in place, this is a normal Haskell project that can be
compiled with cabal-install
.
Users of Nix can build this package by running
nix-build release.nix -A cabal2nix.ghc7102.x86_64-linux
where, again, x86_64-linux
should be replaced with the appropriate value.
This gives you an executable at result/bin/cabal2nix
. If you'd like to
install the latest release version, then
nix-env -f "<nixpkgs>" -iA cabal2nix
is the way to go.