about summary refs log tree commit diff
path: root/nixpkgs/pkgs/build-support/mkshell
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/build-support/mkshell')
-rw-r--r--nixpkgs/pkgs/build-support/mkshell/default.nix45
1 files changed, 45 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/build-support/mkshell/default.nix b/nixpkgs/pkgs/build-support/mkshell/default.nix
new file mode 100644
index 000000000000..a70dc0390cb5
--- /dev/null
+++ b/nixpkgs/pkgs/build-support/mkshell/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv }:
+
+# A special kind of derivation that is only meant to be consumed by the
+# nix-shell.
+{
+  inputsFrom ? [], # a list of derivations whose inputs will be made available to the environment
+  buildInputs ? [],
+  nativeBuildInputs ? [],
+  propagatedBuildInputs ? [],
+  propagatedNativeBuildInputs ? [],
+  ...
+}@attrs:
+let
+  mergeInputs = name: lib.concatLists (lib.catAttrs name
+    ([attrs] ++ inputsFrom));
+
+  rest = builtins.removeAttrs attrs [
+    "inputsFrom"
+    "buildInputs"
+    "nativeBuildInputs"
+    "propagatedBuildInputs"
+    "propagatedNativeBuildInputs"
+    "shellHook"
+  ];
+in
+
+stdenv.mkDerivation ({
+  name = "nix-shell";
+  phases = ["nobuildPhase"];
+
+  buildInputs = mergeInputs "buildInputs";
+  nativeBuildInputs = mergeInputs "nativeBuildInputs";
+  propagatedBuildInputs = mergeInputs "propagatedBuildInputs";
+  propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs";
+
+  shellHook = lib.concatStringsSep "\n" (lib.catAttrs "shellHook"
+    (lib.reverseList inputsFrom ++ [attrs]));
+
+  nobuildPhase = ''
+    echo
+    echo "This derivation is not meant to be built, aborting";
+    echo
+    exit 1
+  '';
+} // rest)