vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / pkgs / build-support / mkshell / default.nix
blob5369301ea105273e87110acce421157795f8bdad
1 { lib, stdenv, buildEnv }:
3 # A special kind of derivation that is only meant to be consumed by the
4 # nix-shell.
5 { name ? "nix-shell"
6 , # a list of packages to add to the shell environment
7   packages ? [ ]
8 , # propagate all the inputs from the given derivations
9   inputsFrom ? [ ]
10 , buildInputs ? [ ]
11 , nativeBuildInputs ? [ ]
12 , propagatedBuildInputs ? [ ]
13 , propagatedNativeBuildInputs ? [ ]
14 , ...
15 }@attrs:
16 let
17   mergeInputs = name:
18     (attrs.${name} or [ ]) ++
19     # 1. get all `{build,nativeBuild,...}Inputs` from the elements of `inputsFrom`
20     # 2. since that is a list of lists, `flatten` that into a regular list
21     # 3. filter out of the result everything that's in `inputsFrom` itself
22     # this leaves actual dependencies of the derivations in `inputsFrom`, but never the derivations themselves
23     (lib.subtractLists inputsFrom (lib.flatten (lib.catAttrs name inputsFrom)));
25   rest = builtins.removeAttrs attrs [
26     "name"
27     "packages"
28     "inputsFrom"
29     "buildInputs"
30     "nativeBuildInputs"
31     "propagatedBuildInputs"
32     "propagatedNativeBuildInputs"
33     "shellHook"
34   ];
37 stdenv.mkDerivation ({
38   inherit name;
40   buildInputs = mergeInputs "buildInputs";
41   nativeBuildInputs = packages ++ (mergeInputs "nativeBuildInputs");
42   propagatedBuildInputs = mergeInputs "propagatedBuildInputs";
43   propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs";
45   shellHook = lib.concatStringsSep "\n" (lib.catAttrs "shellHook"
46     (lib.reverseList inputsFrom ++ [ attrs ]));
48   phases = [ "buildPhase" ];
50   buildPhase = ''
51     { echo "------------------------------------------------------------";
52       echo " WARNING: the existence of this path is not guaranteed.";
53       echo " It is an internal implementation detail for pkgs.mkShell.";
54       echo "------------------------------------------------------------";
55       echo;
56       # Record all build inputs as runtime dependencies
57       export;
58     } >> "$out"
59   '';
61   preferLocalBuild = true;
62 } // rest)