From fe2315d7285c147c78317cd29b4ccc215cd80323 Mon Sep 17 00:00:00 2001 From: 0xda157 Date: Sat, 24 Jan 2026 17:45:39 -0800 Subject: [PATCH] mkShell: use extendMkDerivation --- pkgs/build-support/mkshell/default.nix | 105 +++++++++++-------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/pkgs/build-support/mkshell/default.nix b/pkgs/build-support/mkshell/default.nix index 83dfeca87fce..d1c3d13491e6 100644 --- a/pkgs/build-support/mkshell/default.nix +++ b/pkgs/build-support/mkshell/default.nix @@ -1,73 +1,64 @@ { lib, stdenv, - buildEnv, }: - # A special kind of derivation that is only meant to be consumed by the # nix-shell. -{ - name ? "nix-shell", - # a list of packages to add to the shell environment - packages ? [ ], - # propagate all the inputs from the given derivations - inputsFrom ? [ ], - buildInputs ? [ ], - nativeBuildInputs ? [ ], - propagatedBuildInputs ? [ ], - propagatedNativeBuildInputs ? [ ], - ... -}@attrs: -let - mergeInputs = - name: - (attrs.${name} or [ ]) - ++ - # 1. get all `{build,nativeBuild,...}Inputs` from the elements of `inputsFrom` - # 2. since that is a list of lists, `flatten` that into a regular list - # 3. filter out of the result everything that's in `inputsFrom` itself - # this leaves actual dependencies of the derivations in `inputsFrom`, but never the derivations themselves - (lib.subtractLists inputsFrom (lib.flatten (lib.catAttrs name inputsFrom))); +lib.extendMkDerivation { + constructDrv = stdenv.mkDerivation; - rest = removeAttrs attrs [ - "name" + excludeDrvArgNames = [ "packages" "inputsFrom" - "buildInputs" - "nativeBuildInputs" - "propagatedBuildInputs" - "propagatedNativeBuildInputs" - "shellHook" ]; -in -stdenv.mkDerivation ( - { - inherit name; + extendDrvArgs = + _finalAttrs: + { + name ? "nix-shell", + # a list of packages to add to the shell environment + packages ? [ ], + # propagate all the inputs from the given derivations + inputsFrom ? [ ], + ... + }@attrs: + let + mergeInputs = + name: + (attrs.${name} or [ ]) + ++ + # 1. get all `{build,nativeBuild,...}Inputs` from the elements of `inputsFrom` + # 2. since that is a list of lists, `flatten` that into a regular list + # 3. filter out of the result everything that's in `inputsFrom` itself + # this leaves actual dependencies of the derivations in `inputsFrom`, but never the derivations themselves + (lib.subtractLists inputsFrom (lib.flatten (lib.catAttrs name inputsFrom))); + in + { + inherit name; - buildInputs = mergeInputs "buildInputs"; - nativeBuildInputs = packages ++ (mergeInputs "nativeBuildInputs"); - propagatedBuildInputs = mergeInputs "propagatedBuildInputs"; - propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs"; + buildInputs = mergeInputs "buildInputs"; + nativeBuildInputs = packages ++ (mergeInputs "nativeBuildInputs"); + propagatedBuildInputs = mergeInputs "propagatedBuildInputs"; + propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs"; - shellHook = lib.concatStringsSep "\n" ( - lib.catAttrs "shellHook" (lib.reverseList inputsFrom ++ [ attrs ]) - ); + shellHook = lib.concatStringsSep "\n" ( + lib.catAttrs "shellHook" (lib.reverseList inputsFrom ++ [ attrs ]) + ); - phases = [ "buildPhase" ]; + phases = attrs.phases or [ "buildPhase" ]; - buildPhase = '' - { echo "------------------------------------------------------------"; - echo " WARNING: the existence of this path is not guaranteed."; - echo " It is an internal implementation detail for pkgs.mkShell."; - echo "------------------------------------------------------------"; - echo; - # Record all build inputs as runtime dependencies - export; - } >> "$out" - ''; + buildPhase = + attrs.buildPhase or '' + { echo "------------------------------------------------------------"; + echo " WARNING: the existence of this path is not guaranteed."; + echo " It is an internal implementation detail for pkgs.mkShell."; + echo "------------------------------------------------------------"; + echo; + # Record all build inputs as runtime dependencies + export; + } >> "$out" + ''; - preferLocalBuild = true; - } - // rest -) + preferLocalBuild = attrs.preferLocalBuild or true; + }; +}