about summary refs log tree commit diff
path: root/nixpkgs/pkgs/top-level/splice.nix
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-06-16 06:56:35 +0000
committerAlyssa Ross <hi@alyssa.is>2023-06-16 06:56:35 +0000
commit99fcaeccb89621dd492203ce1f2d551c06f228ed (patch)
tree41cb730ae07383004789779b0f6e11cb3f4642a3 /nixpkgs/pkgs/top-level/splice.nix
parent59c5f5ac8682acc13bb22bc29c7cf02f7d75f01f (diff)
parent75a5ebf473cd60148ba9aec0d219f72e5cf52519 (diff)
downloadnixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.gz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.bz2
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.lz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.xz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.zst
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.zip
Merge branch 'nixos-unstable' of https://github.com/NixOS/nixpkgs
Conflicts:
	nixpkgs/nixos/modules/config/console.nix
	nixpkgs/nixos/modules/services/mail/mailman.nix
	nixpkgs/nixos/modules/services/mail/public-inbox.nix
	nixpkgs/nixos/modules/services/mail/rss2email.nix
	nixpkgs/nixos/modules/services/networking/ssh/sshd.nix
	nixpkgs/pkgs/applications/networking/instant-messengers/dino/default.nix
	nixpkgs/pkgs/applications/networking/irc/weechat/default.nix
	nixpkgs/pkgs/applications/window-managers/sway/default.nix
	nixpkgs/pkgs/build-support/go/module.nix
	nixpkgs/pkgs/build-support/rust/build-rust-package/default.nix
	nixpkgs/pkgs/development/interpreters/python/default.nix
	nixpkgs/pkgs/development/node-packages/overrides.nix
	nixpkgs/pkgs/development/tools/b4/default.nix
	nixpkgs/pkgs/servers/dict/dictd-db.nix
	nixpkgs/pkgs/servers/mail/public-inbox/default.nix
	nixpkgs/pkgs/tools/security/pinentry/default.nix
	nixpkgs/pkgs/tools/text/unoconv/default.nix
	nixpkgs/pkgs/top-level/all-packages.nix
Diffstat (limited to 'nixpkgs/pkgs/top-level/splice.nix')
-rw-r--r--nixpkgs/pkgs/top-level/splice.nix203
1 files changed, 118 insertions, 85 deletions
diff --git a/nixpkgs/pkgs/top-level/splice.nix b/nixpkgs/pkgs/top-level/splice.nix
index 459baaca2e63..ce536aa1fd2f 100644
--- a/nixpkgs/pkgs/top-level/splice.nix
+++ b/nixpkgs/pkgs/top-level/splice.nix
@@ -8,16 +8,9 @@
 # The solution is to splice the package sets together as we do below, so every
 # `callPackage`d expression in fact gets both versions. Each# derivation (and
 # each derivation's outputs) consists of the run-time version, augmented with a
-# `nativeDrv` field for the build-time version, and `crossDrv` field for the
+# `__spliced.buildHost` field for the build-time version, and `__spliced.hostTarget` field for the
 # run-time version.
 #
-# We could have used any names we want for the disambiguated versions, but
-# `crossDrv` and `nativeDrv` were somewhat similarly used for the old
-# cross-compiling infrastructure. The names are mostly invisible as
-# `mkDerivation` knows how to pull out the right ones for `buildDepends` and
-# friends, but a few packages use them directly, so it seemed efficient (to
-# @Ericson2314) to reuse those names, at least initially, to minimize breakage.
-#
 # For performance reasons, rather than uniformally splice in all cases, we only
 # do so when `pkgs` and `buildPackages` are distinct. The `actuallySplice`
 # parameter there the boolean value of that equality check.
@@ -25,84 +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(@Ericson2314): Stop using old names after transition period
-          // (lib.optionalAttrs (pkgsBuildHost ? ${name}) { nativeDrv = valueBuildHost; })
-          // (lib.optionalAttrs (pkgsHostTarget ? ${name}) { crossDrv = valueHostTarget; })
-          // {
-            __spliced =
-                 (lib.optionalAttrs (pkgsBuildBuild ? ${name}) { buildBuild = valueBuildBuild; })
-              // (lib.optionalAttrs (pkgsBuildTarget ? ${name}) { buildTarget = valueBuildTarget; })
-              // (lib.optionalAttrs (pkgsHostHost ? ${name}) { hostHost = valueHostHost; })
-              // (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
@@ -114,7 +126,10 @@ let
   };
 
   splicedPackagesWithXorg = splicedPackages // builtins.removeAttrs splicedPackages.xorg [
-    "callPackage" "newScope" "overrideScope" "packages"
+    "callPackage"
+    "newScope"
+    "overrideScope"
+    "packages"
   ];
 
 in
@@ -125,12 +140,30 @@ 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;
 
   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; };