From 0a3d3512401648f6b760111552a7f59dae412023 Mon Sep 17 00:00:00 2001 From: Artturin Date: Sat, 24 Dec 2022 15:55:22 +0200 Subject: [PATCH 1/3] splice.nix: run nixpkgs-fmt the file was a bit hard to read --- pkgs/top-level/splice.nix | 178 +++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 79 deletions(-) diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index 2bf15252f9a..4c85c7567c3 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -18,86 +18,103 @@ lib: pkgs: actuallySplice: let - spliceReal = { pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget - , pkgsHostHost, pkgsHostTarget - , pkgsTargetTarget - }: let - mash = - # Other pkgs sets - pkgsBuildBuild // pkgsBuildTarget // pkgsHostHost // pkgsTargetTarget - # The same pkgs sets one probably intends - // pkgsBuildHost // pkgsHostTarget; - merge = name: { - inherit name; - value = let - defaultValue = mash.${name}; - # `or {}` is for the non-derivation attsert splicing case, where `{}` is the identity. - valueBuildBuild = pkgsBuildBuild.${name} or {}; - valueBuildHost = pkgsBuildHost.${name} or {}; - valueBuildTarget = pkgsBuildTarget.${name} or {}; - valueHostHost = pkgsHostHost.${name} or {}; - valueHostTarget = pkgsHostTarget.${name} or {}; - valueTargetTarget = pkgsTargetTarget.${name} or {}; - augmentedValue = defaultValue - # TODO(@Artturin): remove before release 23.05 and only have __spliced. - // (lib.optionalAttrs (pkgsBuildHost ? ${name}) { nativeDrv = lib.warn "use ${name}.__spliced.buildHost instead of ${name}.nativeDrv" valueBuildHost; }) - // (lib.optionalAttrs (pkgsHostTarget ? ${name}) { crossDrv = lib.warn "use ${name}.__spliced.hostTarget instead of ${name}.crossDrv" valueHostTarget; }) - // { - __spliced = - (lib.optionalAttrs (pkgsBuildBuild ? ${name}) { buildBuild = valueBuildBuild; }) - // (lib.optionalAttrs (pkgsBuildHost ? ${name}) { buildHost = valueBuildHost; }) - // (lib.optionalAttrs (pkgsBuildTarget ? ${name}) { buildTarget = valueBuildTarget; }) - // (lib.optionalAttrs (pkgsHostHost ? ${name}) { hostHost = valueHostHost; }) - // (lib.optionalAttrs (pkgsHostTarget ? ${name}) { hostTarget = valueHostTarget; }) - // (lib.optionalAttrs (pkgsTargetTarget ? ${name}) { targetTarget = valueTargetTarget; - }); - }; - # Get the set of outputs of a derivation. If one derivation fails to - # evaluate we don't want to diverge the entire splice, so we fall back - # on {} - tryGetOutputs = value0: let - inherit (builtins.tryEval value0) success value; - in getOutputs (lib.optionalAttrs success value); - getOutputs = value: lib.genAttrs - (value.outputs or (lib.optional (value ? out) "out")) - (output: value.${output}); - in - # The derivation along with its outputs, which we recur - # on to splice them together. - 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 spliceReal { - pkgsBuildBuild = valueBuildBuild; - pkgsBuildHost = valueBuildHost; - pkgsBuildTarget = valueBuildTarget; - pkgsHostHost = valueHostHost; - pkgsHostTarget = valueHostTarget; - pkgsTargetTarget = valueTargetTarget; - # Don't be fancy about non-derivations. But we could have used used - # `__functor__` for functions instead. - } else defaultValue; - }; - in lib.listToAttrs (map merge (lib.attrNames mash)); + spliceReal = + { pkgsBuildBuild + , pkgsBuildHost + , pkgsBuildTarget + , pkgsHostHost + , pkgsHostTarget + , pkgsTargetTarget + }: + let + mash = + # Other pkgs sets + pkgsBuildBuild // pkgsBuildTarget // pkgsHostHost // pkgsTargetTarget + # The same pkgs sets one probably intends + // pkgsBuildHost // pkgsHostTarget; + merge = name: { + inherit name; + value = + let + defaultValue = mash.${name}; + # `or {}` is for the non-derivation attsert splicing case, where `{}` is the identity. + valueBuildBuild = pkgsBuildBuild.${name} or { }; + valueBuildHost = pkgsBuildHost.${name} or { }; + valueBuildTarget = pkgsBuildTarget.${name} or { }; + valueHostHost = pkgsHostHost.${name} or { }; + valueHostTarget = pkgsHostTarget.${name} or { }; + valueTargetTarget = pkgsTargetTarget.${name} or { }; + augmentedValue = defaultValue + # TODO(@Artturin): remove before release 23.05 and only have __spliced. + // (lib.optionalAttrs (pkgsBuildHost ? ${name}) { nativeDrv = lib.warn "use ${name}.__spliced.buildHost instead of ${name}.nativeDrv" valueBuildHost; }) + // (lib.optionalAttrs (pkgsHostTarget ? ${name}) { crossDrv = lib.warn "use ${name}.__spliced.hostTarget instead of ${name}.crossDrv" valueHostTarget; }) + // { + __spliced = + (lib.optionalAttrs (pkgsBuildBuild ? ${name}) { buildBuild = valueBuildBuild; }) + // (lib.optionalAttrs (pkgsBuildHost ? ${name}) { buildHost = valueBuildHost; }) + // (lib.optionalAttrs (pkgsBuildTarget ? ${name}) { buildTarget = valueBuildTarget; }) + // (lib.optionalAttrs (pkgsHostHost ? ${name}) { hostHost = valueHostHost; }) + // (lib.optionalAttrs (pkgsHostTarget ? ${name}) { hostTarget = valueHostTarget; }) + // (lib.optionalAttrs (pkgsTargetTarget ? ${name}) { + targetTarget = valueTargetTarget; + }); + }; + # Get the set of outputs of a derivation. If one derivation fails to + # evaluate we don't want to diverge the entire splice, so we fall back + # on {} + tryGetOutputs = value0: + let + inherit (builtins.tryEval value0) success value; + in + getOutputs (lib.optionalAttrs success value); + getOutputs = value: lib.genAttrs + (value.outputs or (lib.optional (value ? out) "out")) + (output: value.${output}); + in + # The derivation along with its outputs, which we recur + # on to splice them together. + 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 + spliceReal + { + pkgsBuildBuild = valueBuildBuild; + pkgsBuildHost = valueBuildHost; + pkgsBuildTarget = valueBuildTarget; + pkgsHostHost = valueHostHost; + pkgsHostTarget = valueHostTarget; + pkgsTargetTarget = valueTargetTarget; + # Don't be fancy about non-derivations. But we could have used used + # `__functor__` for functions instead. + } else defaultValue; + }; + in + lib.listToAttrs (map merge (lib.attrNames mash)); - splicePackages = { pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget - , pkgsHostHost, pkgsHostTarget - , pkgsTargetTarget - } @ args: + splicePackages = + { pkgsBuildBuild + , pkgsBuildHost + , pkgsBuildTarget + , pkgsHostHost + , pkgsHostTarget + , pkgsTargetTarget + } @ args: if actuallySplice then spliceReal args else pkgsHostTarget; - splicedPackages = splicePackages { - inherit (pkgs) - pkgsBuildBuild pkgsBuildHost pkgsBuildTarget - pkgsHostHost pkgsHostTarget - pkgsTargetTarget - ; - } // { + splicedPackages = splicePackages + { + inherit (pkgs) + pkgsBuildBuild pkgsBuildHost pkgsBuildTarget + pkgsHostHost pkgsHostTarget + pkgsTargetTarget + ; + } // { # These should never be spliced under any circumstances inherit (pkgs) pkgsBuildBuild pkgsBuildHost pkgsBuildTarget @@ -109,7 +126,10 @@ let }; splicedPackagesWithXorg = splicedPackages // builtins.removeAttrs splicedPackages.xorg [ - "callPackage" "newScope" "overrideScope" "packages" + "callPackage" + "newScope" + "overrideScope" + "packages" ]; in @@ -120,7 +140,7 @@ in # 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). - callPackage = pkgs.newScope {}; + callPackage = pkgs.newScope { }; callPackages = lib.callPackagesWith splicedPackagesWithXorg; From 665e15ee407ea3d08c80344fa1da2bad34e78650 Mon Sep 17 00:00:00 2001 From: Artturin Date: Sat, 24 Dec 2022 17:33:06 +0200 Subject: [PATCH 2/3] splice.nix: add convenience functions --- pkgs/top-level/splice.nix | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix index 4c85c7567c3..ce536aa1fd2 100644 --- a/pkgs/top-level/splice.nix +++ b/pkgs/top-level/splice.nix @@ -146,6 +146,24 @@ in newScope = extra: lib.callPackageWith (splicedPackagesWithXorg // extra); + # prefill 2 fields of the function for convenience + makeScopeWithSplicing = lib.makeScopeWithSplicing splicePackages pkgs.newScope; + + # generate 'otherSplices' for 'makeScopeWithSplicing' + generateSplicesForMkScope = attr: + let + split = X: lib.splitString "." "${X}.${attr}"; + in + { + # nulls should never be reached + selfBuildBuild = lib.attrByPath (split "pkgsBuildBuild") null pkgs; + selfBuildHost = lib.attrByPath (split "pkgsBuildHost") null pkgs; + selfBuildTarget = lib.attrByPath (split "pkgsBuildTarget") null pkgs; + selfHostHost = lib.attrByPath (split "pkgsHostHost") null pkgs; + selfHostTarget = lib.attrByPath (split "pkgsHostTarget") null pkgs; + selfTargetTarget = lib.attrByPath (split "pkgsTargetTarget") { } pkgs; + }; + # Haskell package sets need this because they reimplement their own # `newScope`. __splicedPackages = splicedPackages // { recurseForDerivations = false; }; From 58fa78077c937e1879a20fc66fe7c6c57e4f75b7 Mon Sep 17 00:00:00 2001 From: Artturin Date: Sat, 24 Dec 2022 17:44:09 +0200 Subject: [PATCH 3/3] treewide: use splicing convenience functions --- pkgs/desktops/xfce/default.nix | 22 ++++--------------- .../interpreters/lua-5/default.nix | 6 ++--- .../interpreters/python/default.nix | 7 ++---- pkgs/games/steam/default.nix | 14 +++--------- pkgs/os-specific/bsd/freebsd/default.nix | 18 ++++----------- pkgs/os-specific/bsd/netbsd/default.nix | 20 +++++------------ pkgs/top-level/all-packages.nix | 13 ++--------- pkgs/top-level/darwin-packages.nix | 14 +++--------- 8 files changed, 25 insertions(+), 89 deletions(-) diff --git a/pkgs/desktops/xfce/default.nix b/pkgs/desktops/xfce/default.nix index 546681afedf..d76e0d10aff 100644 --- a/pkgs/desktops/xfce/default.nix +++ b/pkgs/desktops/xfce/default.nix @@ -1,31 +1,17 @@ { config , lib , pkgs -, splicePackages -, newScope -, pkgsBuildBuild -, pkgsBuildHost -, pkgsBuildTarget -, pkgsHostHost -, pkgsTargetTarget +, generateSplicesForMkScope +, makeScopeWithSplicing }: let - otherSplices = { - selfBuildBuild = pkgsBuildBuild.xfce; - selfBuildHost = pkgsBuildHost.xfce; - selfBuildTarget = pkgsBuildTarget.xfce; - selfHostHost = pkgsHostHost.xfce; - selfTargetTarget = pkgsTargetTarget.xfce or { }; - }; keep = _self: { }; extra = _spliced0: { }; in -lib.makeScopeWithSplicing - splicePackages - newScope - otherSplices +makeScopeWithSplicing + (generateSplicesForMkScope "xfce") keep extra (self: diff --git a/pkgs/development/interpreters/lua-5/default.nix b/pkgs/development/interpreters/lua-5/default.nix index ac903545b0f..27e9ac07c43 100644 --- a/pkgs/development/interpreters/lua-5/default.nix +++ b/pkgs/development/interpreters/lua-5/default.nix @@ -24,7 +24,7 @@ let # - imports lua-packages.nix # - adds spliced package sets to the package set # - applies overrides from `packageOverrides` - ({ lua, overrides, callPackage, splicePackages, newScope }: let + ({ lua, overrides, callPackage, makeScopeWithSplicing }: let luaPackagesFun = callPackage ../../../top-level/lua-packages.nix { lua = self; }; @@ -47,9 +47,7 @@ let overriddenPackages overrides ]; - in lib.makeScopeWithSplicing - splicePackages - newScope + in makeScopeWithSplicing otherSplices keep extra diff --git a/pkgs/development/interpreters/python/default.nix b/pkgs/development/interpreters/python/default.nix index 18282bc6d26..6b3b21ec8fa 100644 --- a/pkgs/development/interpreters/python/default.nix +++ b/pkgs/development/interpreters/python/default.nix @@ -5,9 +5,8 @@ , db , lib , libffiBoot -, newScope +, makeScopeWithSplicing , pythonPackagesExtensions -, splicePackages , stdenv }: @@ -71,9 +70,7 @@ overrides ]); aliases = self: super: lib.optionalAttrs config.allowAliases (import ../../../top-level/python-aliases.nix lib self super); - in lib.makeScopeWithSplicing - splicePackages - newScope + in makeScopeWithSplicing otherSplices keep extra diff --git a/pkgs/games/steam/default.nix b/pkgs/games/steam/default.nix index 395980e8ee6..9dfb239620e 100644 --- a/pkgs/games/steam/default.nix +++ b/pkgs/games/steam/default.nix @@ -1,5 +1,4 @@ -{ lib, newScope, splicePackages, steamPackagesAttr ? "steamPackages" -, pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget, pkgsHostHost, pkgsTargetTarget +{ makeScopeWithSplicing, generateSplicesForMkScope , stdenv, buildFHSUserEnv, pkgsi686Linux }: @@ -18,19 +17,12 @@ let glxinfo-i686 = pkgsi686Linux.glxinfo; steam-runtime-wrapped-i686 = if self.steamArch == "amd64" - then pkgsi686Linux.${steamPackagesAttr}.steam-runtime-wrapped + then pkgsi686Linux.steamPackages.steam-runtime-wrapped else null; inherit buildFHSUserEnv; }; steamcmd = callPackage ./steamcmd.nix { }; }; - otherSplices = { - selfBuildBuild = pkgsBuildBuild.${steamPackagesAttr}; - selfBuildHost = pkgsBuildHost.${steamPackagesAttr}; - selfBuildTarget = pkgsBuildTarget.${steamPackagesAttr}; - selfHostHost = pkgsHostHost.${steamPackagesAttr}; - selfTargetTarget = pkgsTargetTarget.${steamPackagesAttr} or {}; # might be missing; - }; keep = self: { }; extra = spliced0: { }; -in lib.makeScopeWithSplicing splicePackages newScope otherSplices keep extra steamPackagesFun +in makeScopeWithSplicing (generateSplicesForMkScope "steamPackages") keep extra steamPackagesFun diff --git a/pkgs/os-specific/bsd/freebsd/default.nix b/pkgs/os-specific/bsd/freebsd/default.nix index 86c63fc5065..3a53916a46d 100644 --- a/pkgs/os-specific/bsd/freebsd/default.nix +++ b/pkgs/os-specific/bsd/freebsd/default.nix @@ -1,6 +1,6 @@ { stdenv, lib, stdenvNoCC -, pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget, pkgsHostHost, pkgsTargetTarget -, buildPackages, splicePackages, newScope +, makeScopeWithSplicing, generateSplicesForMkScope +, buildPackages , bsdSetupHook, makeSetupHook , fetchgit, fetchurl, coreutils, groff, mandoc, byacc, flex, which, m4, gawk, substituteAll, runtimeShell , zlib, expat, libmd @@ -24,14 +24,6 @@ let name = "freebsd-setup-hook"; } ./setup-hook.sh; - otherSplices = { - selfBuildBuild = pkgsBuildBuild.freebsd; - selfBuildHost = pkgsBuildHost.freebsd; - selfBuildTarget = pkgsBuildTarget.freebsd; - selfHostHost = pkgsHostHost.freebsd; - selfTargetTarget = pkgsTargetTarget.freebsd or {}; # might be missing - }; - mkBsdArch = stdenv': { x86_64 = "amd64"; aarch64 = "arm64"; @@ -74,10 +66,8 @@ let done ''; -in lib.makeScopeWithSplicing - splicePackages - newScope - otherSplices +in makeScopeWithSplicing + (generateSplicesForMkScope "freebsd") (_: {}) (_: {}) (self: let diff --git a/pkgs/os-specific/bsd/netbsd/default.nix b/pkgs/os-specific/bsd/netbsd/default.nix index 4219706a352..37a0c35b186 100644 --- a/pkgs/os-specific/bsd/netbsd/default.nix +++ b/pkgs/os-specific/bsd/netbsd/default.nix @@ -1,6 +1,6 @@ { stdenv, lib, stdenvNoCC -, pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget, pkgsHostHost, pkgsTargetTarget -, buildPackages, splicePackages, newScope +, makeScopeWithSplicing, generateSplicesForMkScope +, buildPackages , bsdSetupHook, makeSetupHook, fetchcvs, groff, mandoc, byacc, flex , zlib , writeShellScript, writeText, runtimeShell, symlinkJoin @@ -20,24 +20,14 @@ let name = "netbsd-setup-hook"; } ./setup-hook.sh; - otherSplices = { - selfBuildBuild = pkgsBuildBuild.netbsd; - selfBuildHost = pkgsBuildHost.netbsd; - selfBuildTarget = pkgsBuildTarget.netbsd; - selfHostHost = pkgsHostHost.netbsd; - selfTargetTarget = pkgsTargetTarget.netbsd or {}; # might be missing - }; - defaultMakeFlags = [ "MKSOFTFLOAT=${if stdenv.hostPlatform.gcc.float or (stdenv.hostPlatform.parsed.abi.float or "hard") == "soft" then "yes" else "no"}" ]; -in lib.makeScopeWithSplicing - splicePackages - newScope - otherSplices +in makeScopeWithSplicing + (generateSplicesForMkScope "netbsd") (_: {}) (_: {}) (self: let @@ -46,7 +36,7 @@ in lib.makeScopeWithSplicing # Why do we have splicing and yet do `nativeBuildInputs = with self; ...`? # - # We use `lib.makeScopeWithSplicing` because this should be used for all + # We use `makeScopeWithSplicing` because this should be used for all # nested package sets which support cross, so the inner `callPackage` works # correctly. But for the inline packages we don't bother to use # `callPackage`. diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index bdbc3f6410e..f80b76f16a4 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -24955,13 +24955,6 @@ with pkgs; }; xorg = let - otherSplices = { - selfBuildBuild = pkgsBuildBuild.xorg; - selfBuildHost = pkgsBuildHost.xorg; - selfBuildTarget = pkgsBuildTarget.xorg; - selfHostHost = pkgsHostHost.xorg; - selfTargetTarget = pkgsTargetTarget.xorg or { }; - }; keep = _self: { }; extra = _spliced0: { }; @@ -24980,10 +24973,8 @@ with pkgs; generatedPackages = lib.callPackageWith __splicedPackages ../servers/x11/xorg/default.nix {}; - xorgPackages = lib.makeScopeWithSplicing - splicePackages - newScope - otherSplices + xorgPackages = makeScopeWithSplicing + (generateSplicesForMkScope "xorg") keep extra (lib.extends overrides generatedPackages); diff --git a/pkgs/top-level/darwin-packages.nix b/pkgs/top-level/darwin-packages.nix index c270dd2220d..2cc74028f62 100644 --- a/pkgs/top-level/darwin-packages.nix +++ b/pkgs/top-level/darwin-packages.nix @@ -1,19 +1,11 @@ { lib , buildPackages, pkgs, targetPackages -, pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget, pkgsHostHost, pkgsTargetTarget -, stdenv, splicePackages, newScope +, generateSplicesForMkScope, makeScopeWithSplicing +, stdenv , preLibcCrossHeaders }: let - otherSplices = { - selfBuildBuild = pkgsBuildBuild.darwin; - selfBuildHost = pkgsBuildHost.darwin; - selfBuildTarget = pkgsBuildTarget.darwin; - selfHostHost = pkgsHostHost.darwin; - selfTargetTarget = pkgsTargetTarget.darwin or {}; # might be missing - }; - # Prefix for binaries. Customarily ends with a dash separator. # # TODO(@Ericson2314) Make unconditional, or optional but always true by @@ -22,7 +14,7 @@ let (stdenv.targetPlatform.config + "-"); in -lib.makeScopeWithSplicing splicePackages newScope otherSplices (_: {}) (spliced: spliced.apple_sdk.frameworks) (self: let +makeScopeWithSplicing (generateSplicesForMkScope "darwin") (_: {}) (spliced: spliced.apple_sdk.frameworks) (self: let inherit (self) mkDerivation callPackage; # Must use pkgs.callPackage to avoid infinite recursion.