diff options
Diffstat (limited to 'pkgs/top-level/splice.nix')
-rw-r--r-- | pkgs/top-level/splice.nix | 79 |
1 files changed, 46 insertions, 33 deletions
diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index 1fde08d1d48b4..27e8136cd397f 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -31,17 +31,13 @@ let then defaultBuildHostScope else assert pkgs.hostPlatform == pkgs.buildPlatform; defaultHostTargetScope; defaultHostHostScope = {}; # unimplemented - # TODO(@Ericson2314): we shouldn't preclude run-time fetching by removing - # these attributes. We should have a more general solution for selecting - # whether `nativeDrv` or `crossDrv` is the default in `defaultScope`. - pkgsWithoutFetchers = lib.filterAttrs (n: _: !lib.hasPrefix "fetch" n) pkgs; - targetPkgsWithoutFetchers = lib.filterAttrs (n: _: !lib.hasPrefix "fetch" n) pkgs.targetPackages; - defaultHostTargetScope = pkgsWithoutFetchers // pkgs.xorg; - defaultTargetTargetScope = targetPkgsWithoutFetchers // targetPkgsWithoutFetchers.xorg or {}; + 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 @@ -55,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 @@ -82,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 splicePackages; + # 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). @@ -122,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; }; } |