diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-06-16 06:56:35 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-06-16 06:56:35 +0000 |
commit | 99fcaeccb89621dd492203ce1f2d551c06f228ed (patch) | |
tree | 41cb730ae07383004789779b0f6e11cb3f4642a3 /nixpkgs/pkgs/top-level/splice.nix | |
parent | 59c5f5ac8682acc13bb22bc29c7cf02f7d75f01f (diff) | |
parent | 75a5ebf473cd60148ba9aec0d219f72e5cf52519 (diff) | |
download | nixlib-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.nix | 203 |
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; }; |