about summary refs log tree commit diff
path: root/nixpkgs/pkgs/os-specific/linux/minimal-bootstrap/bash/2.nix
blob: 41e3547a78617446fbcfd0958afc29e8e282b66e (plain) (blame)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
{ lib
, derivationWithMeta
, fetchurl
, kaem
, tinycc
, gnumake
, gnupatch
, coreutils
, mescc-tools-extra
, bash_2_05
}:
let
  pname = "bash";
  version = "2.05b";

  src = fetchurl {
    url = "mirror://gnu/bash/bash-${version}.tar.gz";
    sha256 = "1r1z2qdw3rz668nxrzwa14vk2zcn00hw7mpjn384picck49d80xs";
  };

  # Thanks to the live-bootstrap project!
  # See https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/bash-2.05b/bash-2.05b.kaem
  liveBootstrap = "https://github.com/fosslinux/live-bootstrap/raw/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/bash-2.05b";

  main_mk = fetchurl {
    url = "${liveBootstrap}/mk/main.mk";
    sha256 = "0hj29q3pq3370p18sxkpvv9flb7yvx2fs96xxlxqlwa8lkimd0j4";
  };

  common_mk = fetchurl {
    url = "${liveBootstrap}/mk/common.mk";
    sha256 = "09rigxxf85p2ybnq248sai1gdx95yykc8jmwi4yjx389zh09mcr8";
  };

  builtins_mk = fetchurl {
    url = "${liveBootstrap}/mk/builtins.mk";
    sha256 = "0939dy5by1xhfmsjj6w63nlgk509fjrhpb2crics3dpcv7prl8lj";
  };

  patches = [
    # mes libc does not have locale support
    (fetchurl {
      url = "${liveBootstrap}/patches/mes-libc.patch";
      sha256 = "0zksdjf6zbb3p4hqg6plq631y76hhhgab7kdvf7cnpk8bcykn12z";
    })
    # int name, namelen; is wrong for mes libc, it is char* name, so we modify tinycc
    # to reflect this.
    (fetchurl {
      url = "${liveBootstrap}/patches/tinycc.patch";
      sha256 = "042d2kr4a8klazk1hlvphxr6frn4mr53k957aq3apf6lbvrjgcj2";
    })
    # add ifdef's for features we don't want
    (fetchurl {
      url = "${liveBootstrap}/patches/missing-defines.patch";
      sha256 = "1q0k1kj5mrvjkqqly7ki5575a5b3hy1ywnmvhrln318yh67qnkj4";
    })
    # mes libc + setting locale = not worky
    (fetchurl {
      url = "${liveBootstrap}/patches/locale.patch";
      sha256 = "1p1q1slhafsgj8x4k0dpn9h6ryq5fwfx7dicbbxhldbw7zvnnbx9";
    })
    # We do not have /dev at this stage of the bootstrap, including /dev/tty
    (fetchurl {
      url = "${liveBootstrap}/patches/dev-tty.patch";
      sha256 = "1315slv5f7ziajqyxg4jlyanf1xwd06xw14y6pq7xpm3jzjk55j9";
    })
  ];
in
kaem.runCommand "${pname}-${version}" {
  inherit pname version;

  nativeBuildInputs = [
    tinycc.compiler
    gnumake
    gnupatch
    coreutils
  ];

  passthru.runCommand = name: env: buildCommand:
    derivationWithMeta ({
      inherit name buildCommand;
      builder = "${bash_2_05}/bin/bash";
      args = [
        "-e"
        (builtins.toFile "bash-builder.sh" ''
          export CONFIG_SHELL=$SHELL
          bash -eux $buildCommandPath
        '')
      ];
      passAsFile = [ "buildCommand" ];

      SHELL = "${bash_2_05}/bin/bash";
      PATH = lib.makeBinPath ((env.nativeBuildInputs or []) ++ [
        bash_2_05
        coreutils
        # provides untar, ungz, and unbz2
        mescc-tools-extra
      ]);
    } // (builtins.removeAttrs env [ "nativeBuildInputs" ]));

  passthru.tests.get-version = result:
    kaem.runCommand "${pname}-get-version-${version}" {} ''
      ${result}/bin/bash --version
      mkdir ''${out}
    '';

  meta = with lib; {
    description = "GNU Bourne-Again Shell, the de facto standard shell on Linux";
    homepage = "https://www.gnu.org/software/bash";
    license = licenses.gpl3Plus;
    maintainers = teams.minimal-bootstrap.members;
    platforms = platforms.unix;
  };
} ''
  # Unpack
  ungz --file ${src} --output bash.tar
  untar --file bash.tar
  rm bash.tar
  cd bash-${version}

  # Patch
  ${lib.concatMapStringsSep "\n" (f: "patch -Np0 -i ${f}") patches}

  # Configure
  cp ${main_mk} Makefile
  cp ${builtins_mk} builtins/Makefile
  cp ${common_mk} common.mk
  touch config.h
  touch include/version.h
  touch include/pipesize.h

  # Build
  make \
    CC="tcc -B ${tinycc.libs}/lib" \
    mkbuiltins
  cd builtins
  make \
    CC="tcc -B ${tinycc.libs}/lib" \
    libbuiltins.a
  cd ..
  make CC="tcc -B ${tinycc.libs}/lib"

  # Install
  install -D bash ''${out}/bin/bash
  ln -s bash ''${out}/bin/sh
''