Merge pull request #43264 from obsidiansystems/splice-more

haskell infra: Use splicing like normal `callPackage`
This commit is contained in:
John Ericson 2018-07-09 18:34:29 -04:00 committed by GitHub
commit 547ef77aa7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 83 additions and 46 deletions

View File

@ -202,7 +202,7 @@ rec {
callPackage = self.newScope {}; callPackage = self.newScope {};
overrideScope = g: overrideScope = g:
makeScope newScope makeScope newScope
(self_: let super = f self_; in super // g super self_); (lib.fixed-points.extends f g);
packages = f; packages = f;
}; };
in self; in self;

View File

@ -510,8 +510,14 @@ self: super: {
doctest-prop = dontCheck super.doctest-prop; doctest-prop = dontCheck super.doctest-prop;
# Depends on itself for testing # Depends on itself for testing
doctest-discover = addBuildTool super.doctest-discover (dontCheck super.doctest-discover); doctest-discover = addBuildTool super.doctest-discover
tasty-discover = addBuildTool super.tasty-discover (dontCheck super.tasty-discover); (if pkgs.buildPlatform != pkgs.hostPlatform
then self.buildHaskellPackages.doctest-discover
else dontCheck super.doctest-discover);
tasty-discover = addBuildTool super.tasty-discover
(if pkgs.buildPlatform != pkgs.hostPlatform
then self.buildHaskellPackages.tasty-discover
else dontCheck super.tasty-discover);
# generic-deriving bound is too tight # generic-deriving bound is too tight
aeson = doJailbreak super.aeson; aeson = doJailbreak super.aeson;
@ -597,7 +603,7 @@ self: super: {
# Install icons, metadata and cli program. # Install icons, metadata and cli program.
bustle = overrideCabal super.bustle (drv: { bustle = overrideCabal super.bustle (drv: {
buildDepends = [ pkgs.libpcap ]; buildDepends = [ pkgs.libpcap ];
buildTools = with pkgs; [ gettext perl help2man intltool ]; buildTools = with pkgs.buildPackages; [ gettext perl help2man intltool ];
patches = [ patches = [
# Add missing gio-unix-2.0 dependency # Add missing gio-unix-2.0 dependency
(pkgs.fetchpatch { (pkgs.fetchpatch {
@ -665,7 +671,7 @@ self: super: {
# Need newer versions of their dependencies than the ones we have in LTS-11.x. # Need newer versions of their dependencies than the ones we have in LTS-11.x.
cabal2nix = super.cabal2nix.overrideScope (self: super: { hpack = self.hpack_0_28_2; hackage-db = self.hackage-db_2_0_1; }); cabal2nix = super.cabal2nix.overrideScope (self: super: { hpack = self.hpack_0_28_2; hackage-db = self.hackage-db_2_0_1; });
dbus-hslogger = super.dbus-hslogger.overrideScope (self: super: { dbus = self.dbus_1_0_1; }); dbus-hslogger = super.dbus-hslogger.overrideScope (self: super: { dbus = self.dbus_1_0_1; });
graphviz = (addBuildTool super.graphviz pkgs.graphviz).overrideScope (self: super: { wl-pprint-text = self.wl-pprint-text_1_2_0_0; base-compat = self.base-compat_0_10_4; }); graphviz = (addBuildTool super.graphviz pkgs.buildPackages.graphviz).overrideScope (self: super: { wl-pprint-text = self.wl-pprint-text_1_2_0_0; base-compat = self.base-compat_0_10_4; });
status-notifier-item = super.status-notifier-item.overrideScope (self: super: { dbus = self.dbus_1_0_1; }); status-notifier-item = super.status-notifier-item.overrideScope (self: super: { dbus = self.dbus_1_0_1; });
# https://github.com/bos/configurator/issues/22 # https://github.com/bos/configurator/issues/22
@ -698,8 +704,8 @@ self: super: {
jsaddle = dontCheck super.jsaddle; jsaddle = dontCheck super.jsaddle;
# Tools that use gtk2hs-buildtools now depend on them in a custom-setup stanza # Tools that use gtk2hs-buildtools now depend on them in a custom-setup stanza
cairo = addBuildTool super.cairo self.gtk2hs-buildtools; cairo = addBuildTool super.cairo self.buildHaskellPackages.gtk2hs-buildtools;
pango = disableHardening (addBuildTool super.pango self.gtk2hs-buildtools) ["fortify"]; pango = disableHardening (addBuildTool super.pango self.buildHaskellPackages.gtk2hs-buildtools) ["fortify"];
gtk = gtk =
if pkgs.stdenv.isDarwin if pkgs.stdenv.isDarwin
then appendConfigureFlag super.gtk "-fhave-quartz-gtk" then appendConfigureFlag super.gtk "-fhave-quartz-gtk"

View File

@ -39,7 +39,7 @@ self: super: {
# Build jailbreak-cabal with the latest version of Cabal. # Build jailbreak-cabal with the latest version of Cabal.
jailbreak-cabal = super.jailbreak-cabal.override { Cabal = self.Cabal_1_24_2_0; }; jailbreak-cabal = super.jailbreak-cabal.override { Cabal = self.Cabal_1_24_2_0; };
gtk2hs-buildtools = super.gtk2hs-buildtools.override { Cabal = self.Cabal_1_24_2_0; }; gtk2hs-buildtools = super.gtk2hs-buildtools.override { Cabal = self.buildHaskellPackages.Cabal_1_24_2_0; };
# https://github.com/mrkkrp/megaparsec/issues/282 # https://github.com/mrkkrp/megaparsec/issues/282
megaparsec = addBuildDepend (dontCheck super.megaparsec) self.fail; megaparsec = addBuildDepend (dontCheck super.megaparsec) self.fail;

View File

@ -23,9 +23,9 @@ self: super:
}; };
in stage1 // stage2 // { in stage1 // stage2 // {
network = addBuildTools super.network (pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.libiconv); network = addBuildTools super.network (pkgs.lib.optional pkgs.buildPlatform.isDarwin pkgs.buildPackages.darwin.libiconv);
zlib = addBuildTools super.zlib (pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.libiconv); zlib = addBuildTools super.zlib (pkgs.lib.optional pkgs.buildPlatform.isDarwin pkgs.buildPackages.darwin.libiconv);
unix-compat = addBuildTools super.unix-compat (pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.libiconv); unix-compat = addBuildTools super.unix-compat (pkgs.lib.optional pkgs.buildPlatform.isDarwin pkgs.buildPackages.darwin.libiconv);
# LLVM is not supported on this GHC; use the latest one. # LLVM is not supported on this GHC; use the latest one.
inherit (pkgs) llvmPackages; inherit (pkgs) llvmPackages;
@ -121,7 +121,7 @@ self: super:
}); });
ghcjs-dom-jsffi = overrideCabal super.ghcjs-dom-jsffi (drv: { ghcjs-dom-jsffi = overrideCabal super.ghcjs-dom-jsffi (drv: {
setupHaskellDepends = (drv.setupHaskellDepends or []) ++ [ self.Cabal_1_24_2_0 ]; setupHaskellDepends = (drv.setupHaskellDepends or []) ++ [ self.buildHaskellPackages.Cabal_1_24_2_0 ];
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base self.text ]; libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base self.text ];
isLibrary = true; isLibrary = true;
}); });

View File

@ -138,10 +138,10 @@ self: super: builtins.intersectAttrs super {
else super.x509-system; else super.x509-system;
# https://github.com/NixOS/cabal2nix/issues/136 and https://github.com/NixOS/cabal2nix/issues/216 # https://github.com/NixOS/cabal2nix/issues/136 and https://github.com/NixOS/cabal2nix/issues/216
gio = disableHardening (addPkgconfigDepend (addBuildTool super.gio self.gtk2hs-buildtools) pkgs.glib) ["fortify"]; gio = disableHardening (addPkgconfigDepend (addBuildTool super.gio self.buildHaskellPackages.gtk2hs-buildtools) pkgs.glib) ["fortify"];
glib = disableHardening (addPkgconfigDepend (addBuildTool super.glib self.gtk2hs-buildtools) pkgs.glib) ["fortify"]; glib = disableHardening (addPkgconfigDepend (addBuildTool super.glib self.buildHaskellPackages.gtk2hs-buildtools) pkgs.glib) ["fortify"];
gtk3 = disableHardening (super.gtk3.override { inherit (pkgs) gtk3; }) ["fortify"]; gtk3 = disableHardening (super.gtk3.override { inherit (pkgs) gtk3; }) ["fortify"];
gtk = disableHardening (addPkgconfigDepend (addBuildTool super.gtk self.gtk2hs-buildtools) pkgs.gtk2) ["fortify"]; gtk = disableHardening (addPkgconfigDepend (addBuildTool super.gtk self.buildHaskellPackages.gtk2hs-buildtools) pkgs.gtk2) ["fortify"];
gtksourceview2 = addPkgconfigDepend super.gtksourceview2 pkgs.gtk2; gtksourceview2 = addPkgconfigDepend super.gtksourceview2 pkgs.gtk2;
gtk-traymanager = addPkgconfigDepend super.gtk-traymanager pkgs.gtk3; gtk-traymanager = addPkgconfigDepend super.gtk-traymanager pkgs.gtk3;
@ -305,7 +305,7 @@ self: super: builtins.intersectAttrs super {
# https://github.com/edwinb/EpiVM/issues/13 # https://github.com/edwinb/EpiVM/issues/13
# https://github.com/edwinb/EpiVM/issues/14 # https://github.com/edwinb/EpiVM/issues/14
epic = addExtraLibraries (addBuildTool super.epic self.happy) [pkgs.boehmgc pkgs.gmp]; epic = addExtraLibraries (addBuildTool super.epic self.buildHaskellPackages.happy) [pkgs.boehmgc pkgs.gmp];
# https://github.com/ekmett/wl-pprint-terminfo/issues/7 # https://github.com/ekmett/wl-pprint-terminfo/issues/7
wl-pprint-terminfo = addExtraLibrary super.wl-pprint-terminfo pkgs.ncurses; wl-pprint-terminfo = addExtraLibrary super.wl-pprint-terminfo pkgs.ncurses;
@ -469,10 +469,10 @@ self: super: builtins.intersectAttrs super {
io-streams = enableCabalFlag super.io-streams "NoInteractiveTests"; io-streams = enableCabalFlag super.io-streams "NoInteractiveTests";
# requires autotools to build # requires autotools to build
secp256k1 = addBuildTools super.secp256k1 [ pkgs.autoconf pkgs.automake pkgs.libtool ]; secp256k1 = addBuildTools super.secp256k1 [ pkgs.buildPackages.autoconf pkgs.buildPackages.automake pkgs.buildPackages.libtool ];
# tests require git # tests require git
hapistrano = addBuildTool super.hapistrano pkgs.git; hapistrano = addBuildTool super.hapistrano pkgs.buildPackages.git;
# This propagates this to everything depending on haskell-gi-base # This propagates this to everything depending on haskell-gi-base
haskell-gi-base = addBuildDepend super.haskell-gi-base pkgs.gobjectIntrospection; haskell-gi-base = addBuildDepend super.haskell-gi-base pkgs.gobjectIntrospection;

View File

@ -97,7 +97,20 @@ let
}; };
in stdenv.lib.makeOverridable drvScope (auto // manualArgs); in stdenv.lib.makeOverridable drvScope (auto // manualArgs);
mkScope = scope: pkgs // pkgs.xorg // pkgs.gnome2 // { inherit stdenv; } // scope; mkScope = scope: let
ps = pkgs.__splicedPackages;
scopeSpliced = pkgs.splicePackages {
pkgsBuildBuild = scope.buildHaskellPackages.buildHaskellPackages;
pkgsBuildHost = scope.buildHaskellPackages;
pkgsBuildTarget = {};
pkgsHostHost = {};
pkgsHostTarget = scope;
pkgsTargetTarget = {};
} // {
# Don't splice these
inherit (scope) ghc buildHaskellPackages;
};
in ps // ps.xorg // ps.gnome2 // { inherit stdenv; } // scopeSpliced;
defaultScope = mkScope self; defaultScope = mkScope self;
callPackage = drv: args: callPackageWithScope defaultScope drv args; callPackage = drv: args: callPackageWithScope defaultScope drv args;
@ -150,7 +163,7 @@ let
in package-set { inherit pkgs stdenv callPackage; } self // { in package-set { inherit pkgs stdenv callPackage; } self // {
inherit mkDerivation callPackage haskellSrc2nix hackage2nix; inherit mkDerivation callPackage haskellSrc2nix hackage2nix buildHaskellPackages;
inherit (haskellLib) packageSourceOverrides; inherit (haskellLib) packageSourceOverrides;

View File

@ -34,9 +34,10 @@ let
defaultHostTargetScope = pkgs // pkgs.xorg; defaultHostTargetScope = pkgs // pkgs.xorg;
defaultTargetTargetScope = pkgs.targetPackages // pkgs.targetPackages.xorg or {}; defaultTargetTargetScope = pkgs.targetPackages // pkgs.targetPackages.xorg or {};
splicer = pkgsBuildBuild: pkgsBuildHost: pkgsBuildTarget: spliceReal = { pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget
pkgsHostHost: pkgsHostTarget: , pkgsHostHost, pkgsHostTarget
pkgsTargetTarget: let , pkgsTargetTarget
}: let
mash = mash =
# Other pkgs sets # Other pkgs sets
pkgsBuildBuild // pkgsBuildTarget // pkgsHostHost // pkgsTargetTarget pkgsBuildBuild // pkgsBuildTarget // pkgsHostHost // pkgsTargetTarget
@ -50,7 +51,7 @@ let
valueBuildBuild = pkgsBuildBuild.${name} or {}; valueBuildBuild = pkgsBuildBuild.${name} or {};
valueBuildHost = pkgsBuildHost.${name} or {}; valueBuildHost = pkgsBuildHost.${name} or {};
valueBuildTarget = pkgsBuildTarget.${name} or {}; valueBuildTarget = pkgsBuildTarget.${name} or {};
valueHostHost = throw "`valueHostHost` unimplemented: pass manually rather than relying on splicer."; valueHostHost = throw "`valueHostHost` unimplemented: pass manually rather than relying on splice.";
valueHostTarget = pkgsHostTarget.${name} or {}; valueHostTarget = pkgsHostTarget.${name} or {};
valueTargetTarget = pkgsTargetTarget.${name} or {}; valueTargetTarget = pkgsTargetTarget.${name} or {};
augmentedValue = defaultValue augmentedValue = defaultValue
@ -77,38 +78,51 @@ let
in in
# The derivation along with its outputs, which we recur # The derivation along with its outputs, which we recur
# on to splice them together. # on to splice them together.
if lib.isDerivation defaultValue then augmentedValue // splicer if lib.isDerivation defaultValue then augmentedValue // spliceReal {
(tryGetOutputs valueBuildBuild) (tryGetOutputs valueBuildHost) (tryGetOutputs valueBuildTarget) pkgsBuildBuild = tryGetOutputs valueBuildBuild;
(tryGetOutputs valueHostHost) (getOutputs valueHostTarget) pkgsBuildHost = tryGetOutputs valueBuildHost;
(tryGetOutputs valueTargetTarget) pkgsBuildTarget = tryGetOutputs valueBuildTarget;
pkgsHostHost = tryGetOutputs valueHostHost;
pkgsHostTarget = getOutputs valueHostTarget;
pkgsTargetTarget = tryGetOutputs valueTargetTarget;
# Just recur on plain attrsets # Just recur on plain attrsets
else if lib.isAttrs defaultValue then splicer } else if lib.isAttrs defaultValue then spliceReal {
valueBuildBuild valueBuildHost valueBuildTarget pkgsBuildBuild = valueBuildBuild;
{} valueHostTarget pkgsBuildHost = valueBuildHost;
valueTargetTarget pkgsBuildTarget = valueBuildTarget;
pkgsHostHost = {};
pkgsHostTarget = valueHostTarget;
pkgsTargetTarget = valueTargetTarget;
# Don't be fancy about non-derivations. But we could have used used # Don't be fancy about non-derivations. But we could have used used
# `__functor__` for functions instead. # `__functor__` for functions instead.
else defaultValue; } else defaultValue;
}; };
in lib.listToAttrs (map merge (lib.attrNames mash)); in lib.listToAttrs (map merge (lib.attrNames mash));
splicedPackages = splicePackages = { pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget
if actuallySplice , pkgsHostHost, pkgsHostTarget
then , pkgsTargetTarget
splicer } @ args:
defaultBuildBuildScope defaultBuildHostScope defaultBuildTargetScope if actuallySplice then spliceReal args else pkgsHostTarget;
defaultHostHostScope defaultHostTargetScope
defaultTargetTargetScope splicedPackages = splicePackages {
// { pkgsBuildBuild = defaultBuildBuildScope;
# These should never be spliced under any circumstances pkgsBuildHost = defaultBuildHostScope;
inherit (pkgs) pkgs buildPackages targetPackages pkgsBuildTarget = defaultBuildTargetScope;
buildPlatform targetPlatform hostPlatform; pkgsHostHost = defaultHostHostScope;
} pkgsHostTarget = defaultHostTargetScope;
else pkgs // pkgs.xorg; pkgsTargetTarget = defaultTargetTargetScope;
} // {
# These should never be spliced under any circumstances
inherit (pkgs) pkgs buildPackages targetPackages
buildPlatform targetPlatform hostPlatform;
};
in in
{ {
inherit splicePackages;
# We use `callPackage' to be able to omit function arguments that can be # We use `callPackage' to be able to omit function arguments that can be
# obtained `pkgs` or `buildPackages` and their `xorg` package sets. Use # obtained `pkgs` or `buildPackages` and their `xorg` package sets. Use
# `newScope' for sets of packages in `pkgs' (see e.g. `gnome' below). # `newScope' for sets of packages in `pkgs' (see e.g. `gnome' below).
@ -117,4 +131,8 @@ in
callPackages = lib.callPackagesWith splicedPackages; callPackages = lib.callPackagesWith splicedPackages;
newScope = extra: lib.callPackageWith (splicedPackages // extra); newScope = extra: lib.callPackageWith (splicedPackages // extra);
# Haskell package sets need this because they reimplement their own
# `newScope`.
__splicedPackages = splicedPackages // { recurseForDerivations = false; };
} }