@@ -1,119 +1,56 @@
1−hackage:
1+{ lib, expr, mkDerivation }:
2−{ cabalexpr, pkgs, compiler ? "Ghc", version, os ? "Osx", arch ? "X86_64" }:
2+let
3−assert (builtins.elem compiler ["Ghc" "Ghcjs" "Nhc" "Yhc" "Hugs" "Hbc" "Helium" "Jhc" "Lhc" "Uhc" "Eta"]);
4−assert (builtins.elem os ["Linux" "Windows" "Osx" "FreeBSD" "OpenBSD" "NetBSD" "DragonFly" "Solaris" "AIX" "HPUX" "IRIX" "HaLVM" "Hurd" "IOS" "Android" "Ghcjs"]);
5−assert (builtins.elem arch ["I386" "X86_64" "PPC" "PPC64" "Sparc" "Arm" "Aarch64" "Mips" "SH" "IA64" "S390" "Alpha" "Hppa" "Rs6000" "M68k" "Vax" "JavaScript"]);
8 # utilities
3 # utilities
9− collectAttr = a: s: pkgs.lib.lists.fold (e: acc: (if e ? ${a} then e.${a} else []) ++ acc) [] (builtins.attrValues s);
4+ collectAttr = a: s: lib.lists.fold (e: acc: (if e ? ${a} then e.${a} else []) ++ acc) [] (builtins.attrValues s);
11 # resolver for cabal license to nix license
6 # resolver for cabal license to nix license
12− resolve = { license = stdenv: license: (import ./cabal-licenses.nix stdenv).${license}; };
7+ resolve = { license = lib: license: (import ../lib/cabal-licenses.nix lib).${license}; };
14− # cabal os, arch and compilers.
15− cabal = import ./cabal-os-arch-comp.nix;
17− expr0 = flags: extraHsPkgs: let e = cabalexpr {
19− # null out self references. Tests, Benchmarks, ...
20− # naturally depend on the package (as a library), but
21− # we don't want those dependencies.
22− hsPkgs = pkgs.haskellPackages
23− // { ${e.package.identifier.name} = null; }
25− # We also need to do some system pkgs -> haskell pkgs
28− # fetchgit should always come from the buildPackages
29− # if it comes from the targetPackages we won't even
30− # be able to execute it.
31− // { fetchgit = pkgs.buildPackages.fetchgit; }
32− # haskell lib -> nix lib mapping
33− // { crypto = pkgs.openssl;
34− "c++" = null; # no libc++
35− "stdc++" = null; "stdc++-6" = null;
38− pthread = null; # available by default
41− // { advapi32 = null; gdi32 = null; imm32 = null; msimg32 = null;
42− shell32 = null; shfolder = null; shlwapi = null; user32 = null;
44− kernel32 = null; ws2_32 = null;
46− # this should be bundled with gcc.
47− # if it's not we have more severe
51− ssl32 = null; eay32 = pkgs.openssl;
53− iphlpapi = null; # IP Help API
55− msvcrt = null; # this is the libc
60− // pkgs.darwin.apple_sdk.frameworks;
62− # package-conf mappings.
63− # pkgconfig name -> nix package
64− pkgconfPkgs = { libpcre = pkgs.pcre; };
66− compiler = cabal.compiler // {
67− "is${compiler}" = true;
69− eq = v: builtins.compareVersions version v == 0;
70− lt = v: builtins.compareVersions version v == -1;
71− gt = v: builtins.compareVersions version v == 1;
72− le = v: eq v || lt v;
73− ge = v: eq v || gt v;
76− system = cabal.os // { "is${os}" = true; }
77− // cabal.arch // { "is${arch}" = true; };
80# These are the keys that <pkg>.override can override.
9# These are the keys that <pkg>.override can override.
81# the ... is used to allow to override all potential
10# the ... is used to allow to override all potential
82# other keys, that the builder understands.
11# other keys, that the builder understands.
83−{ mkDerivation, stdenv, flags ? {}, hsPkgs ? {}, ... }@args:
12+# { mkDerivation, stdenv, flags ? {}, hsPkgs ? {}, ... }@args:
84−let expr = expr0 flags hsPkgs;
13+#let
85 pname = expr.package.identifier.name;
14 pname = expr.package.identifier.name;
86 pversion = expr.package.identifier.version;
15 pversion = expr.package.identifier.version;
87 builderArgs = {
16 builderArgs = {
88 inherit pname;
17 inherit pname;
89 version = pversion;
18 version = pversion;
90− sha256 = hackage.hashes.${pname}.${pversion} or null;
19+
92 isLibrary = builtins.hasAttr pname expr.components;
20 isLibrary = builtins.hasAttr pname expr.components;
93 isExecutable = builtins.hasAttr "exes" expr.components;
21 isExecutable = builtins.hasAttr "exes" expr.components;
95 homepage = expr.package.homepage;
23 homepage = expr.package.homepage;
96 description = expr.package.synopsis;
24 description = expr.package.synopsis;
97− license = resolve.license stdenv expr.package.license;
25+ license = resolve.license lib expr.package.license;
99− configureFlags = pkgs.lib.mapAttrsToList (flag: enabled: (if enabled then "-f" else "-f-") + flag) expr.flags;
27+ configureFlags = lib.mapAttrsToList (flag: enabled: (if enabled then "-f" else "-f-") + flag) expr.flags;
29+ } // lib.optionalAttrs (expr ? revision) {
30+ revision = "${toString expr.revision}";
31+ editedCabalFile = expr.revisionSha256;
32+ } // lib.optionalAttrs (expr ? sha256) {
33+ inherit (expr) sha256;
100− } // pkgs.lib.optionalAttrs (builtins.hasAttr pname expr.components) {
34+ } // lib.optionalAttrs (builtins.hasAttr pname expr.components) {
101 libraryHaskellDepends = expr.components.${pname}.depends or [];
35 libraryHaskellDepends = expr.components.${pname}.depends or [];
102 libraryPkgconfigDepends = expr.components.${pname}.pkgconfig or [];
36 libraryPkgconfigDepends = expr.components.${pname}.pkgconfig or [];
103− librarySystemDepends = (expr.components.${pname}.libs or []) ++ pkgs.lib.optionals (os == "Osx") (expr.components.${pname}.frameworks or []);
37+ librarySystemDepends = (expr.components.${pname}.libs or []); # ++ lib.optionals (os == "Osx") (expr.components.${pname}.frameworks or []);
104 libraryToolDepends = expr.components.${pname}.build-tools or [];
38 libraryToolDepends = expr.components.${pname}.build-tools or [];
105− } // pkgs.lib.optionalAttrs (builtins.hasAttr "exes" expr.components) {
39+ } // lib.optionalAttrs (builtins.hasAttr "exes" expr.components) {
106 executableHaskellDepends = collectAttr "depends" expr.components.exes;
40 executableHaskellDepends = collectAttr "depends" expr.components.exes;
107 executableToolDepends = collectAttr "build-tools" expr.components.exes;
41 executableToolDepends = collectAttr "build-tools" expr.components.exes;
108− } // pkgs.lib.optionalAttrs (builtins.hasAttr "tests" expr.components) {
42+ } // lib.optionalAttrs (builtins.hasAttr "tests" expr.components) {
109 testHaskellDepends = collectAttr "depends" expr.components.tests;
43 testHaskellDepends = collectAttr "depends" expr.components.tests;
110− } // pkgs.lib.optionalAttrs (builtins.hasAttr "benchmarks" expr.components) {
44+ } // lib.optionalAttrs (builtins.hasAttr "benchmarks" expr.components) {
111 benchmarkHaskellDepends = collectAttr "depends" expr.components.benchmarks;
45 benchmarkHaskellDepends = collectAttr "depends" expr.components.benchmarks;
112− } // pkgs.lib.optionalAttrs (builtins.hasAttr "src" expr) {
46+ } // lib.optionalAttrs (expr ? src) {
113 inherit (expr) src;
47 inherit (expr) src;
114− } // pkgs.lib.optionalAttrs (builtins.hasAttr "postUnpack" expr) {
48+ } // lib.optionalAttrs (expr ? postUnpack) {
115 inherit (expr) postUnpack;
49 inherit (expr) postUnpack;
116− } // builtins.removeAttrs args [ "mkDerivation" "stdenv" "flags" "hsPkgs" ];
51+ #// builtins.removeAttrs args [ "mkDerivation" "stdenv" "flags" "hsPkgs" ];
53+in mkDerivation (builderArgs)
117−in mkDerivation (builderArgs // pkgs.lib.optionalAttrs (expr.cabal-generator or "" == "hpack")
54+#// lib.optionalAttrs (expr.cabal-generator or "" == "hpack")
118− { preConfigure = "hpack;" + (builderArgs.preConfigure or "");
55+# { preConfigure = "hpack;" + (builderArgs.preConfigure or "");
119− libraryToolDepends = builderArgs.libraryToolDepends ++ [ pkgs.haskellPackages.hpack ]; })
56+# libraryToolDepends = builderArgs.libraryToolDepends ++ [ pkgs.haskellPackages.hpack ]; })