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.
This commit is contained in:
John Ericson 2018-07-05 20:19:07 -04:00
parent 48ccdf322d
commit 0eb142cd46

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;
pkgsBuildHost = defaultBuildHostScope;
pkgsBuildTarget = defaultBuildTargetScope;
pkgsHostHost = defaultHostHostScope;
pkgsHostTarget = defaultHostTargetScope;
pkgsTargetTarget = defaultTargetTargetScope;
} // {
# These should never be spliced under any circumstances # These should never be spliced under any circumstances
inherit (pkgs) pkgs buildPackages targetPackages inherit (pkgs) pkgs buildPackages targetPackages
buildPlatform targetPlatform hostPlatform; buildPlatform targetPlatform hostPlatform;
} };
else pkgs // pkgs.xorg;
in in
{ {
inherit splicedPackages;
# 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).