1f18f65650
The callCabal2nix function cannot reliably determine the appropriate "name" for the package it's processing. Attempts to derive this information have led to plenty of evaluation errors, and so I'd like to go for the obvious and reliable solution now and let the caller specify that bit of information. Here is an example that demonstrates how to use callCabal2nix. let pkgs = import <nixpkgs> {}; src = pkgs.fetchFromGitHub { owner = "gtk2hs"; repo = "gtk2hs"; rev = "eee61d84edf1dd44f8d380d7d7cae2405de50124"; sha256 = "12i53grimni0dyjqjydl120z5amcn668w4pfhl8dxscjh4a0l5nb"; }; in pkgs.haskellPackages.callCabal2nix "gtkhs-tools" "${src}/tools" {}
115 lines
4 KiB
Nix
115 lines
4 KiB
Nix
{ pkgs, stdenv, ghc, all-cabal-hashes
|
|
, compilerConfig ? (self: super: {})
|
|
, packageSetConfig ? (self: super: {})
|
|
, overrides ? (self: super: {})
|
|
}:
|
|
|
|
let
|
|
|
|
inherit (stdenv.lib) fix' extends;
|
|
|
|
haskellPackages = self:
|
|
let
|
|
|
|
mkDerivation = pkgs.callPackage ./generic-builder.nix {
|
|
inherit stdenv;
|
|
inherit (pkgs) fetchurl pkgconfig glibcLocales coreutils gnugrep gnused;
|
|
jailbreak-cabal = if (self.ghc.cross or null) != null
|
|
then self.ghc.bootPkgs.jailbreak-cabal
|
|
else self.jailbreak-cabal;
|
|
inherit (self) ghc;
|
|
hscolour = overrideCabal self.hscolour (drv: {
|
|
isLibrary = false;
|
|
doHaddock = false;
|
|
hyperlinkSource = false; # Avoid depending on hscolour for this build.
|
|
postFixup = "rm -rf $out/lib $out/share $out/nix-support";
|
|
});
|
|
cpphs = overrideCabal (self.cpphs.overrideScope (self: super: {
|
|
mkDerivation = drv: super.mkDerivation (drv // {
|
|
enableSharedExecutables = false;
|
|
enableSharedLibraries = false;
|
|
doHaddock = false;
|
|
useCpphs = false;
|
|
});
|
|
})) (drv: {
|
|
isLibrary = false;
|
|
postFixup = "rm -rf $out/lib $out/share $out/nix-support";
|
|
});
|
|
};
|
|
|
|
overrideCabal = drv: f: drv.override (args: args // {
|
|
mkDerivation = drv: args.mkDerivation (drv // f drv);
|
|
});
|
|
|
|
callPackageWithScope = scope: drv: args: (stdenv.lib.callPackageWith scope drv args) // {
|
|
overrideScope = f: callPackageWithScope (mkScope (fix' (extends f scope.__unfix__))) drv args;
|
|
};
|
|
|
|
mkScope = scope: pkgs // pkgs.xorg // pkgs.gnome2 // scope;
|
|
defaultScope = mkScope self;
|
|
callPackage = drv: args: callPackageWithScope defaultScope drv args;
|
|
|
|
withPackages = packages: callPackage ./with-packages-wrapper.nix {
|
|
inherit (self) llvmPackages;
|
|
haskellPackages = self;
|
|
inherit packages;
|
|
};
|
|
|
|
haskellSrc2nix = { name, src, sha256 ? null }:
|
|
let
|
|
sha256Arg = if isNull sha256 then "" else ''--sha256="${sha256}"'';
|
|
in pkgs.stdenv.mkDerivation {
|
|
name = "cabal2nix-${name}";
|
|
buildInputs = [ pkgs.cabal2nix ];
|
|
phases = ["installPhase"];
|
|
LANG = "en_US.UTF-8";
|
|
LOCALE_ARCHIVE = pkgs.lib.optionalString pkgs.stdenv.isLinux "${pkgs.glibcLocales}/lib/locale/locale-archive";
|
|
installPhase = ''
|
|
export HOME="$TMP"
|
|
mkdir -p "$out"
|
|
cabal2nix --compiler=${self.ghc.name} --system=${stdenv.system} ${sha256Arg} "${src}" > "$out/default.nix"
|
|
'';
|
|
};
|
|
|
|
hackage2nix = name: version: haskellSrc2nix {
|
|
name = "${name}-${version}";
|
|
sha256 = ''$(sed -e 's/.*"SHA256":"//' -e 's/".*$//' "${all-cabal-hashes}/${name}/${version}/${name}.json")'';
|
|
src = "${all-cabal-hashes}/${name}/${version}/${name}.cabal";
|
|
};
|
|
|
|
in
|
|
import ./hackage-packages.nix { inherit pkgs stdenv callPackage; } self // {
|
|
|
|
inherit mkDerivation callPackage;
|
|
|
|
callHackage = name: version: self.callPackage (hackage2nix name version);
|
|
|
|
# Creates a Haskell package from a source package by calling cabal2nix on the source.
|
|
callCabal2nix = name: src: self.callPackage (haskellSrc2nix { inherit src name; });
|
|
|
|
ghcWithPackages = selectFrom: withPackages (selectFrom self);
|
|
|
|
ghcWithHoogle = selectFrom:
|
|
let
|
|
packages = selectFrom self;
|
|
hoogle = callPackage ./hoogle.nix {
|
|
inherit packages;
|
|
};
|
|
in withPackages (packages ++ [ hoogle ]);
|
|
|
|
ghc = ghc // {
|
|
withPackages = self.ghcWithPackages;
|
|
withHoogle = self.ghcWithHoogle;
|
|
};
|
|
|
|
};
|
|
|
|
commonConfiguration = import ./configuration-common.nix { inherit pkgs; };
|
|
|
|
in
|
|
|
|
fix'
|
|
(extends overrides
|
|
(extends packageSetConfig
|
|
(extends compilerConfig
|
|
(extends commonConfiguration haskellPackages))))
|