aboutsummaryrefslogtreecommitdiff
path: root/.config/nixpkgs/helpers/mkShellMinimal.nix
blob: 54d0e6807780d6b79116b5db476b793d27d3fcfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
### Source:  https://github.com/NixOS/nixpkgs/commit/459771518d44f60b59a19381d07b12297908215d
### Article: https://fzakaria.com/2021/08/02/a-minimal-nix-shell.html
### Usage:

# let
#
#   name = "nix-shell.minimal";
#   pkgs = import <nixpkgs> { };
#
#   mkShellMinimal = pkgs.callPackage (builtins.fetchurl {
#     url = "https://raw.githubusercontent.com/tdro/dotfiles/0aac4414559235f8cd8c454acce30c0471e0f6b1/.config/nixpkgs/helpers/mkShellMinimal.nix";
#     sha256 = "06vbyyhaam3nmzimzasz6la590ni9cbdql3jy29hhw9ln0xf09yy";
#   }) { };
#
# in mkShellMinimal {
#   buildInputs = [ pkgs.coreutils pkgs.hello pkgs.gnugrep pkgs.which ];
#   ENV = "ENV";
#   shellHook = ''
#     hello
#     printf "%s\n" "$ENV"
#     which mkdir
#     printf "\nPATH is $PATH\n\n"
#     grep --version
#     export PS1='\h (${name}) \W \$ '
#   '';
# }

{ lib }:

{ packages ? [ ], inputsFrom ? [ ], buildInputs ? [ ], nativeBuildInputs ? [ ]
, propagatedBuildInputs ? [ ], propagatedNativeBuildInputs ? [ ], ... }@attrs:
let
  mergeInputs = name:
    (attrs.${name} or [ ]) ++ (lib.subtractLists inputsFrom
      (lib.flatten (lib.catAttrs name inputsFrom)));

  rest = builtins.removeAttrs attrs [
    "packages"
    "inputsFrom"
    "buildInputs"
    "nativeBuildInputs"
    "propagatedBuildInputs"
    "propagatedNativeBuildInputs"
    "shellHook"
  ];

  pkgs = import (builtins.fetchTarball {
    url = "https://releases.nixos.org/nixos/21.05/nixos-21.05.1510.a165aeceda9/nixexprs.tar.xz";
    sha256 = "124s05b0xk97arw0vvq8b4wcvsw6024dfdzwcx9qjxf3a2zszmam";
  }) { };

  stdenv = pkgs.stdenvNoCC.override {
    cc = null;
    preHook = "";
    allowedRequisites = null;
    initialPath = pkgs.coreutils;
    extraNativeBuildInputs = [ ];
  };

in stdenv.mkDerivation ({
  name = "nix-shell";
  phases = [ "nobuildPhase" ];

  buildInputs = mergeInputs "buildInputs";
  nativeBuildInputs = packages ++ (mergeInputs "nativeBuildInputs");
  propagatedBuildInputs = mergeInputs "propagatedBuildInputs";
  propagatedNativeBuildInputs = mergeInputs "propagatedNativeBuildInputs";

  shellHook = ''
    PATH=${stdenv.initialPath}/bin
    for package in ${toString buildInputs}; do
      export PATH=$package/bin:$PATH
    done
  '' + 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)