core/pkgs/build-support/mkshell/default.nix

55 lines
1.9 KiB
Nix
Raw Normal View History

2024-05-02 00:46:19 +00:00
{ lib, stdenv, buildEnv }:
# A special kind of derivation that is only meant to be consumed by the
# nix-shell.
2024-05-13 21:24:10 +00:00
{ 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:
2024-05-02 00:46:19 +00:00
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)));
rest = builtins.removeAttrs attrs [
"name"
"packages"
"inputsFrom"
"buildInputs"
"nativeBuildInputs"
"propagatedBuildInputs"
"propagatedNativeBuildInputs"
"shellHook"
];
2024-05-13 21:24:10 +00:00
in stdenv.mkDerivation ({
2024-05-02 00:46:19 +00:00
inherit name;
buildInputs = mergeInputs "buildInputs";
nativeBuildInputs = packages ++ (mergeInputs "nativeBuildInputs");
propagatedBuildInputs = mergeInputs "propagatedBuildInputs";
propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs";
2024-05-13 21:24:10 +00:00
shellHook = lib.concatStringsSep "\n"
(lib.catAttrs "shellHook" (lib.reverseList inputsFrom ++ [ attrs ]));
2024-05-02 00:46:19 +00:00
phases = [ "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"
'';
preferLocalBuild = true;
} // rest)