From 48ccdf322d9e7a68d0caf5833511ee3e53ec7d3a Mon Sep 17 00:00:00 2001 From: John Ericson Date: Fri, 6 Jul 2018 16:17:54 -0400 Subject: [PATCH 1/4] lib: Use lib.fixed-points.extends to avoid repetition --- lib/customisation.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/customisation.nix b/lib/customisation.nix index d942f54ee7989f..9017319420c8e9 100644 --- a/lib/customisation.nix +++ b/lib/customisation.nix @@ -202,7 +202,7 @@ rec { callPackage = self.newScope {}; overrideScope = g: makeScope newScope - (self_: let super = f self_; in super // g super self_); + (lib.fixed-points.extends f g); packages = f; }; in self; From 0eb142cd46e8a46eb61fe41e1b916ffe0ec3e0ba Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 5 Jul 2018 20:19:07 -0400 Subject: [PATCH 2/4] top-level: Expose `splicePackages` for `newScope` users Otherwise extra packages in scope can't be made to work for cross. As much as I think splicing is an evil trick, I think it's best to do this and at least have it work consistently for now. It would seems simpler to expose a `newScopeWithSplicing`, but there's a few attrs (like `buildPackages` or `buildHaskellPackages`) that shouldn't be spliced. Users should instead splice, override the splicing on those packages, and apply `newScope` to that. --- pkgs/top-level/splice.nix | 66 ++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index 078075323dd016..9f5acd0a7de7cf 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -34,9 +34,10 @@ let defaultHostTargetScope = pkgs // pkgs.xorg; defaultTargetTargetScope = pkgs.targetPackages // pkgs.targetPackages.xorg or {}; - splicer = pkgsBuildBuild: pkgsBuildHost: pkgsBuildTarget: - pkgsHostHost: pkgsHostTarget: - pkgsTargetTarget: let + spliceReal = { pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget + , pkgsHostHost, pkgsHostTarget + , pkgsTargetTarget + }: let mash = # Other pkgs sets pkgsBuildBuild // pkgsBuildTarget // pkgsHostHost // pkgsTargetTarget @@ -50,7 +51,7 @@ let valueBuildBuild = pkgsBuildBuild.${name} or {}; valueBuildHost = pkgsBuildHost.${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 {}; valueTargetTarget = pkgsTargetTarget.${name} or {}; augmentedValue = defaultValue @@ -77,38 +78,51 @@ let in # The derivation along with its outputs, which we recur # on to splice them together. - if lib.isDerivation defaultValue then augmentedValue // splicer - (tryGetOutputs valueBuildBuild) (tryGetOutputs valueBuildHost) (tryGetOutputs valueBuildTarget) - (tryGetOutputs valueHostHost) (getOutputs valueHostTarget) - (tryGetOutputs valueTargetTarget) + if lib.isDerivation defaultValue then augmentedValue // spliceReal { + pkgsBuildBuild = tryGetOutputs valueBuildBuild; + pkgsBuildHost = tryGetOutputs valueBuildHost; + pkgsBuildTarget = tryGetOutputs valueBuildTarget; + pkgsHostHost = tryGetOutputs valueHostHost; + pkgsHostTarget = getOutputs valueHostTarget; + pkgsTargetTarget = tryGetOutputs valueTargetTarget; # Just recur on plain attrsets - else if lib.isAttrs defaultValue then splicer - valueBuildBuild valueBuildHost valueBuildTarget - {} valueHostTarget - valueTargetTarget + } else if lib.isAttrs defaultValue then spliceReal { + pkgsBuildBuild = valueBuildBuild; + pkgsBuildHost = valueBuildHost; + pkgsBuildTarget = valueBuildTarget; + pkgsHostHost = {}; + pkgsHostTarget = valueHostTarget; + pkgsTargetTarget = valueTargetTarget; # Don't be fancy about non-derivations. But we could have used used # `__functor__` for functions instead. - else defaultValue; + } else defaultValue; }; in lib.listToAttrs (map merge (lib.attrNames mash)); - splicedPackages = - if actuallySplice - then - splicer - defaultBuildBuildScope defaultBuildHostScope defaultBuildTargetScope - defaultHostHostScope defaultHostTargetScope - defaultTargetTargetScope - // { - # These should never be spliced under any circumstances - inherit (pkgs) pkgs buildPackages targetPackages - buildPlatform targetPlatform hostPlatform; - } - else pkgs // pkgs.xorg; + splicePackages = { pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget + , pkgsHostHost, pkgsHostTarget + , pkgsTargetTarget + } @ args: + if actuallySplice then spliceReal args else pkgsHostTarget; + + splicedPackages = splicePackages { + pkgsBuildBuild = defaultBuildBuildScope; + pkgsBuildHost = defaultBuildHostScope; + pkgsBuildTarget = defaultBuildTargetScope; + pkgsHostHost = defaultHostHostScope; + pkgsHostTarget = defaultHostTargetScope; + pkgsTargetTarget = defaultTargetTargetScope; + } // { + # These should never be spliced under any circumstances + inherit (pkgs) pkgs buildPackages targetPackages + buildPlatform targetPlatform hostPlatform; + }; in { + inherit splicedPackages; + # We use `callPackage' to be able to omit function arguments that can be # obtained `pkgs` or `buildPackages` and their `xorg` package sets. Use # `newScope' for sets of packages in `pkgs' (see e.g. `gnome' below). From f27f491784cd19abca6494ae28306deeea17c613 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sat, 7 Jul 2018 14:28:42 -0400 Subject: [PATCH 3/4] Haskell infra: Do callPackage splicing --- .../haskell-modules/make-package-set.nix | 17 +++++++++++++++-- pkgs/top-level/splice.nix | 4 ++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/pkgs/development/haskell-modules/make-package-set.nix b/pkgs/development/haskell-modules/make-package-set.nix index a54967c4e45e6a..87ac65307aabbd 100644 --- a/pkgs/development/haskell-modules/make-package-set.nix +++ b/pkgs/development/haskell-modules/make-package-set.nix @@ -97,7 +97,20 @@ let }; 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; callPackage = drv: args: callPackageWithScope defaultScope drv args; @@ -150,7 +163,7 @@ let in package-set { inherit pkgs stdenv callPackage; } self // { - inherit mkDerivation callPackage haskellSrc2nix hackage2nix; + inherit mkDerivation callPackage haskellSrc2nix hackage2nix buildHaskellPackages; inherit (haskellLib) packageSourceOverrides; diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index 9f5acd0a7de7cf..a9dd6c3ec0df09 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -131,4 +131,8 @@ in callPackages = lib.callPackagesWith splicedPackages; newScope = extra: lib.callPackageWith (splicedPackages // extra); + + # Haskell package sets need this because they reimplement their own + # `newScope`. + __splicedPackages = splicedPackages // { recurseForDerivations = false; }; } From 740cfffcb2ea32ae2ea888ac685d883e3ad3c36a Mon Sep 17 00:00:00 2001 From: John Ericson Date: Mon, 9 Jul 2018 12:22:23 -0400 Subject: [PATCH 4/4] haskell infra: Fix built-time overrides These should all come from `buildHaskellPackages` --- .../haskell-modules/configuration-common.nix | 18 ++++++++++++------ .../configuration-ghc-7.10.x.nix | 2 +- .../haskell-modules/configuration-ghcjs.nix | 8 ++++---- .../haskell-modules/configuration-nix.nix | 12 ++++++------ pkgs/top-level/splice.nix | 2 +- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/pkgs/development/haskell-modules/configuration-common.nix b/pkgs/development/haskell-modules/configuration-common.nix index c3b04c22c2aaec..9d53e61dd692a1 100644 --- a/pkgs/development/haskell-modules/configuration-common.nix +++ b/pkgs/development/haskell-modules/configuration-common.nix @@ -510,8 +510,14 @@ self: super: { doctest-prop = dontCheck super.doctest-prop; # Depends on itself for testing - doctest-discover = addBuildTool super.doctest-discover (dontCheck super.doctest-discover); - tasty-discover = addBuildTool super.tasty-discover (dontCheck super.tasty-discover); + doctest-discover = addBuildTool super.doctest-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 aeson = doJailbreak super.aeson; @@ -597,7 +603,7 @@ self: super: { # Install icons, metadata and cli program. bustle = overrideCabal super.bustle (drv: { buildDepends = [ pkgs.libpcap ]; - buildTools = with pkgs; [ gettext perl help2man intltool ]; + buildTools = with pkgs.buildPackages; [ gettext perl help2man intltool ]; patches = [ # Add missing gio-unix-2.0 dependency (pkgs.fetchpatch { @@ -665,7 +671,7 @@ self: super: { # 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; }); 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; }); # https://github.com/bos/configurator/issues/22 @@ -698,8 +704,8 @@ self: super: { jsaddle = dontCheck super.jsaddle; # Tools that use gtk2hs-buildtools now depend on them in a custom-setup stanza - cairo = addBuildTool super.cairo self.gtk2hs-buildtools; - pango = disableHardening (addBuildTool super.pango self.gtk2hs-buildtools) ["fortify"]; + cairo = addBuildTool super.cairo self.buildHaskellPackages.gtk2hs-buildtools; + pango = disableHardening (addBuildTool super.pango self.buildHaskellPackages.gtk2hs-buildtools) ["fortify"]; gtk = if pkgs.stdenv.isDarwin then appendConfigureFlag super.gtk "-fhave-quartz-gtk" diff --git a/pkgs/development/haskell-modules/configuration-ghc-7.10.x.nix b/pkgs/development/haskell-modules/configuration-ghc-7.10.x.nix index 15220c24b4f297..9925a5c03c89a6 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-7.10.x.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-7.10.x.nix @@ -39,7 +39,7 @@ self: super: { # Build jailbreak-cabal with the latest version of Cabal. 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 megaparsec = addBuildDepend (dontCheck super.megaparsec) self.fail; diff --git a/pkgs/development/haskell-modules/configuration-ghcjs.nix b/pkgs/development/haskell-modules/configuration-ghcjs.nix index 0482d03ba8fb11..f1a60f5ea878f3 100644 --- a/pkgs/development/haskell-modules/configuration-ghcjs.nix +++ b/pkgs/development/haskell-modules/configuration-ghcjs.nix @@ -23,9 +23,9 @@ self: super: }; in stage1 // stage2 // { - network = addBuildTools super.network (pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.libiconv); - zlib = addBuildTools super.zlib (pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.libiconv); - unix-compat = addBuildTools super.unix-compat (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.buildPlatform.isDarwin pkgs.buildPackages.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. inherit (pkgs) llvmPackages; @@ -121,7 +121,7 @@ self: super: }); 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 ]; isLibrary = true; }); diff --git a/pkgs/development/haskell-modules/configuration-nix.nix b/pkgs/development/haskell-modules/configuration-nix.nix index 54366046222dec..b8e3bbb30caf1f 100644 --- a/pkgs/development/haskell-modules/configuration-nix.nix +++ b/pkgs/development/haskell-modules/configuration-nix.nix @@ -138,10 +138,10 @@ self: super: builtins.intersectAttrs super { else super.x509-system; # 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"]; - glib = disableHardening (addPkgconfigDepend (addBuildTool super.glib 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.buildHaskellPackages.gtk2hs-buildtools) pkgs.glib) ["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; 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/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 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"; # 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 - hapistrano = addBuildTool super.hapistrano pkgs.git; + hapistrano = addBuildTool super.hapistrano pkgs.buildPackages.git; # This propagates this to everything depending on haskell-gi-base haskell-gi-base = addBuildDepend super.haskell-gi-base pkgs.gobjectIntrospection; diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index a9dd6c3ec0df09..27e8136cd397ff 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -121,7 +121,7 @@ let in { - inherit splicedPackages; + inherit splicePackages; # We use `callPackage' to be able to omit function arguments that can be # obtained `pkgs` or `buildPackages` and their `xorg` package sets. Use