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
''
|