on iko/ghcjs-patch-master help sign in
Adds `stackage-lts-set` and `hackage-package`.

This allows us to build a full stackage-lts-set, or a package from hackage. ``` nix build '(with import ./. {}; (hackage-package { name = "lens"; version = "4.17.1"; })).components.library' ``` would build the lens library. ``` nix build '(with import ./. {}; (stackage-lts-set "lts-13.28")).lens.components.library' ``` would build the lens library component from the lts-13.28 stackage set.

commitc5b5595f1aee8177106a22a2c029f36677adcde1 authorMoritz Angermann <moritz.angermann@gmail.com> dateSun 14 Jul 2019, 21:48 (7 years ago) parentb0a7f89
2 files changed+36−6
default.nix+29 lib/call-cabal-project-to-nix.nix+7−6
default.nix+29
@@ -211,6 +211,35 @@ let
211211 source-pins = self.callPackage ./lib/make-source-pins.nix {
212212 sources = [ hackageSrc stackageSrc pkgs.path ];
213213 };
214+
215+ # Utility
216+ stackage-lts-set = lts:
217+ assert (if !(pkgs.lib.hasPrefix "lts-" lts || pkgs.lib.hasPrefix "nightly-" lts) then throw "argument to stackage-lts-set needs to start with either lts- or nightly-!" else true);
218+ let src = buildPackages.pkgs.runCommand "stackage-${lts}-set-src" { nativeBuildInputs = [ buildPackages.nix-tools ]; } ''
219+ mkdir -p $out
220+ echo "resolver: ${lts}" > $out/stack.yaml
221+ '';
222+ in let stack-pkgs = import (callStackToNix { inherit src; });
223+ in let pkg-set = mkStackPkgSet { inherit stack-pkgs; };
224+ in pkg-set.config.hsPkgs;
225+
226+ hackage-package =
227+ { name
228+ , version
229+ , index-state ? builtins.trace "Using latest index state!" pkgs.lib.last (builtins.attrNames (import indexStateHashesPath))
230+ }:
231+ let tarball = pkgs.fetchurl {
232+ url = "mirror://hackage/${name}-${version}.tar.gz";
233+ inherit (hackage.${name}.${version}) sha256; };
234+ in let src = buildPackages.pkgs.runCommand "${name}-${version}-src" { } ''
235+ tmp=$(mktemp -d)
236+ cd $tmp
237+ tar xzf ${tarball}
238+ mv "${name}-${version}" $out
239+ '';
240+ in let plan-pkgs = import (callCabalProjectToNix { inherit src; index-state = builtins.trace "Using index-state: ${index-state}" index-state; });
241+ in let pkg-set = mkCabalProjectPkgSet { inherit plan-pkgs; };
242+ in pkg-set.config.hsPkgs.${name};
214243 });
215244
216245in
lib/call-cabal-project-to-nix.nix+7−6
@@ -10,19 +10,20 @@ assert (if (builtins.compareVersions cabal-install.version "2.4.0.0") < 0
1010 then throw "cabal-install (current version: ${cabal-install.version}) needs to be at least 2.4 for plan-to-nix to work without cabal-to-nix"
1111 else true);
1212let
13− cabalFiles =
14− pkgs.lib.cleanSourceWith {
15− inherit src;
13+ maybeCleanedSource =
14+ if pkgs.lib.canCleanSource src
15+ then pkgs.lib.cleanSourceWith {
16+ src = builtins.trace "src = ${src};" src;
1617 filter = path: type:
1718 type == "directory" ||
18− pkgs.lib.any (i: (pkgs.lib.hasSuffix i path)) [ ".project" ".cabal" "package.yaml" ];
19− };
19+ pkgs.lib.any (i: (pkgs.lib.hasSuffix i path)) [ ".project" ".cabal" "package.yaml" ]; }
20+ else src;
2021 plan = runCommand "plan-to-nix-pkgs" {
2122 nativeBuildInputs = [ nix-tools ghc hpack cabal-install pkgs.rsync pkgs.git ];
2223 } ''
2324 tmp=$(mktemp -d)
2425 cd $tmp
25− cp -r ${cabalFiles}/* .
26+ cp -r ${maybeCleanedSource}/* .
2627 chmod +w -R .
2728 # warning: this may not generate the proper cabal file.
2829 # hpack allows globbing, and turns that into module lists