From aadbef00bd083fe59977205b2fc330cf17d09e6f Mon Sep 17 00:00:00 2001 From: Will Fancher Date: Tue, 24 Oct 2017 03:00:07 -0400 Subject: [PATCH] callCabal2nix: Don't rebuild unchanged cabal file (Fixed #23880) --- .../haskell-modules/make-package-set.nix | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkgs/development/haskell-modules/make-package-set.nix b/pkgs/development/haskell-modules/make-package-set.nix index d84167008d9..c234ff3e780 100644 --- a/pkgs/development/haskell-modules/make-package-set.nix +++ b/pkgs/development/haskell-modules/make-package-set.nix @@ -144,7 +144,22 @@ in package-set { inherit pkgs stdenv callPackage; } self // { callHackage = name: version: self.callPackage (self.hackage2nix name version); # Creates a Haskell package from a source package by calling cabal2nix on the source. - callCabal2nix = name: src: self.callPackage (self.haskellSrc2nix { inherit src name; }); + callCabal2nix = name: src: args: if builtins.typeOf src != "path" + then self.callPackage (haskellSrc2nix { inherit name src; }) args + else + # When `src` is a Nix path literal, only use `cabal2nix` on + # the cabal file, so that the "import-from-derivation" is only + # recomputed when the cabal file changes, and so your source + # code isn't duplicated into the nix store on every change. + # This can only be done when `src` is a Nix path literal + # because that is the only kind of source that + # `builtins.filterSource` works on. But this filtering isn't + # usually important on other kinds of sources, like + # `fetchFromGitHub`. + overrideCabal (self.callPackage (haskellSrc2nix { + inherit name; + src = builtins.filterSource (path: type: pkgs.lib.hasSuffix ".cabal" path) src; + }) args) (_: { inherit src; }); # : Map Name (Either Path VersionNumber) -> HaskellPackageOverrideSet # Given a set whose values are either paths or version strings, produces