git.iko.soy/typeable/cabal2nix
on master help sign in
Add ng.nix experiment to figure out a nice haskellPackages architecture.
commit15a4f193c5686dee35e629918eaae238e7375b78 authorPeter Simons <simons@cryp.to> dateFri 5 Dec 2014, 22:13 (12 years ago) parent5fe7760
1 file changed+45
doc/ng.nix+45
doc/ng.nixnew file+45
@@ -0,0 +1,45 @@
1+# Architecture of the cleaned-up Haskell packages set in Nixpkgs.
2+
3+# run: rm -f /tmp/test ; nix-build -o /tmp/test ng.nix -A hsemail --show-trace && tree /tmp/test/
4+
5+let
6+
7+ pkgs = import <nixpkgs> {};
8+ lib = pkgs.lib;
9+
10+ inherit (lib) callPackageWith;
11+
12+ fix = f: let tmp = rec { x = f x; }; in tmp.x;
13+
14+ extend = rattrs: f: self: let super = rattrs self; in super // f self super;
15+
16+ hpkgs = self:
17+ let
18+ simplePackage = { name, buildInputs ? [], override, overrideDerivation, deepOverride }: pkgs.stdenv.mkDerivation {
19+ inherit name buildInputs;
20+ phases = ["installPhase"];
21+ installPhase = ''
22+ install -D /dev/null $out/$name
23+ for dir in $buildInputs $nativeBuildInputs $propagatedBuildInputs; do
24+ cp --no-clobber "$dir/"* $out/
25+ done
26+ '';
27+ };
28+
29+ package = f: args: simplePackage (callPackageWith self f args);
30+ in
31+ {
32+ hsemail = package ({ mtl, parsec } : { name = "hsemail-0"; buildInputs = [mtl parsec]; }) { mtl = self.mtl2; };
33+ mtl1 = package ({ transformers } : { name = "mtl-1"; buildInputs = [transformers]; }) {};
34+ mtl2 = package ({ transformers } : { name = "mtl-2"; buildInputs = [transformers]; }) {};
35+ parsec = package ({ mtl } : { name = "parsec-0"; buildInputs = [mtl]; }) {};
36+ transformers = package ({} : { name = "transformers-0"; }) {};
37+ };
38+
39+ defaultConfiguration = self: super: { mtl = self.mtl1; };
40+
41+ otherConfiguration = self: super: { };
42+
43+in
44+
45+ fix (extend (extend hpkgs defaultConfiguration) otherConfiguration)