-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbootstrap.sh
executable file
·338 lines (231 loc) · 10.1 KB
/
bootstrap.sh
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
#!/usr/bin/env bash
# replace with where you cloned this
export PROJECT_DIR=$(pwd)
# don't change this, the rest of the OS build depends on this.
# if you like, you can move it and symlink it.
export PREFIX=$PROJECT_DIR/build/toolchain
# please don't change this
export SYSROOT=$PROJECT_DIR/build/sysroot
# especially not this
export TARGET=x86_64-orionx
export BINUTILS_VERSION="2.33.1"
export GCC_VERSION="9.2.0"
export NUM_MAKE_JOBS=7
GNU_MIRROR_SITE="https://mirror.ossplanet.net/gnu"
SKIP_SETUP_LIBC=false
SKIP_SETUP_SYSROOT=false
SKIP_SETUP_DISKIMAGE=false
SKIP_SETUP_TOOLCHAIN=false
SKIP_SETUP_EFI_TOOLCHAIN=false
SKIP_SETUP_TOOLCHAIN_BINUTILS=false
SKIP_SETUP_TOOLCHAIN_GCC=false
# setup colour codes
_BOLD=`tput bold`
_NORMAL=`tput sgr0`
_RED=`tput setaf 1`
_BLUE=`tput setaf 4`
_GREEN=`tput setaf 2`
TAR_CHECKPOINT_ARG="--checkpoint=.250"
function main() {
if [ $(uname) == "Darwin" ]; then
# the tar on osx doesn't support --checkpoint
TAR_CHECKPOINT_ARG=""
fi
if [ "$1" == "clean" ]; then
# ! ACHTUNG !
# rm -rf with impunity is dangerous
echo "${_BOLD}${_RED}=> ${_NORMAL}${_BOLD}destroying development environment${_NORMAL}"
echo ""
if [ "$PROJECT_DIR" != "" ]; then
rm -rf $SYSROOT
rm -rf $PREFIX
rm -rf $PROJECT_DIR/build
rm -rf $PROJECT_DIR/toolchain-setup
fi
exit
fi
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}bootstrapping development environment${_NORMAL}"
echo ""
chmod +x $PROJECT_DIR/utils/tools/*.sh
if [ ! -f "$PROJECT_DIR/utils/patches/binutils-$BINUTILS_VERSION.patch" ]; then
echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}binutils-$BINUTILS_VERSION is not supported!${_NORMAL} see utils/patches/ for a list of supported versions"
exit 1
fi
if [ ! -f "$PROJECT_DIR/utils/patches/gcc-$GCC_VERSION.patch" ]; then
echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}gcc-$GCC_VERSION is not supported!${_NORMAL} see utils/patches/ for a list of supported versions"
exit 1
fi
if [ ! $(command -v pv) ]; then
echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}'pv' not found${_NORMAL}"
exit 1
fi
if [ $SKIP_SETUP_SYSROOT == false ]; then
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}setting up sysroot${_NORMAL}"
mkdir -p $SYSROOT/usr/include
mkdir -p $SYSROOT/usr/lib
mkdir -p $SYSROOT/boot
mkdir -p $SYSROOT/drivers
mkdir -p $SYSROOT/services
fi
echo "${_BOLD}${_GREEN}=> ${_NORMAL}prefix: ${_BOLD}$PREFIX${_NORMAL}"
echo "${_BOLD}${_GREEN}=> ${_NORMAL}sysroot: ${_BOLD}$SYSROOT${_NORMAL}"
echo ""
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}exporting headers${_NORMAL}"
make make-folders > /dev/null
make export-headers > /dev/null
if [ $SKIP_SETUP_TOOLCHAIN == false ]; then
export SETUP_DIR=$PROJECT_DIR/toolchain-setup
build_toolchain $SETUP_DIR
echo ""
fi
if [ $SKIP_SETUP_LIBC == false ]; then
# we need to build our libc with the cross compiler.
export CC=$PROJECT_DIR/build/toolchain/bin/x86_64-orionx-gcc
export CXX=$PROJECT_DIR/build/toolchain/bin/x86_64-orionx-g++
export LD=$PROJECT_DIR/build/toolchain/bin/x86_64-orionx-gcc
export CPP=$PROJECT_DIR/build/toolchain/bin/x86_64-orionx-cpp
export AR=$PROJECT_DIR/build/toolchain/bin/x86_64-orionx-ar
export AS=$PROJECT_DIR/build/toolchain/bin/x86_64-orionx-as
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}building libm${_NORMAL}"
make -C libs/libm install > /dev/null || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}libm compilation failed!${_NORMAL}"; exit 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}building libc${_NORMAL}"
make -C libs/libc > /dev/null || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}libc compilation failed!${_NORMAL}"; exit 1; }
echo ""
unset CC
unset CXX
unset LD
unset CPP
unset AR
unset AS
fi
if [ $SKIP_SETUP_TOOLCHAIN == false ]; then
export SETUP_DIR=$PROJECT_DIR/toolchain-setup
export PATH="$PREFIX/bin:$PATH"
mkdir -p $SETUP_DIR
pushd $SETUP_DIR > /dev/null
build_libstdcpp || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}libstdc++ compilation failed!${_NORMAL}"; exit 1; }
echo ""
popd > /dev/null
fi
if [ $SKIP_SETUP_DISKIMAGE == false ]; then
chmod +x $PROJECT_DIR/utils/tools/create-diskimage.sh
$PROJECT_DIR/utils/tools/create-diskimage.sh || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}disk image creation failed!${_NORMAL}"; exit 1; }
echo ""
fi
if [ $SKIP_SETUP_EFI_TOOLCHAIN == false ]; then
export SETUP_DIR=$PROJECT_DIR/toolchain-setup
mkdir -p $SETUP_DIR
chmod +x $PROJECT_DIR/utils/tools/bootstrap-efi.sh
$PROJECT_DIR/utils/tools/bootstrap-efi.sh || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}efi toolchain compilation failed!${_NORMAL}"; exit 1; }
echo ""
fi
mkdir -p $PROJECT_DIR/build/initrd/fonts
mkdir -p $PROJECT_DIR/build/initrd/drivers
mkdir -p $PROJECT_DIR/build/initrd/services
cp $PROJECT_DIR/utils/fonts/deja-vu/DejaVuSansMono.ttf $PROJECT_DIR/build/initrd/fonts/mono.ttf
cp $PROJECT_DIR/utils/fonts/deja-vu/DejaVuSansMono-Bold.ttf $PROJECT_DIR/build/initrd/fonts/mono-bold.ttf
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}environment is set up!${_NORMAL}"
}
function build_toolchain() {
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}building orionx toolchain${_NORMAL}"
echo "${_BOLD}${_GREEN}=> ${_NORMAL}${_BOLD}staging directory: $1${_NORMAL}"
echo "${_BOLD}${_GREEN}=> ${_NORMAL}${_BOLD}jobs: $NUM_MAKE_JOBS${_NORMAL}"
echo ""
mkdir -p $1
pushd $1 > /dev/null
build_binutils || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}binutils compilation failed!${_NORMAL}"; exit 1; }
echo ""
export PATH="$PREFIX/bin:$PATH"
build_gcc || { echo "${_BOLD}${_RED}!> ${_NORMAL}${_BOLD}gcc compilation failed!${_NORMAL}"; exit 1; }
popd > /dev/null
}
function build_binutils() {
if [ $SKIP_SETUP_TOOLCHAIN_BINUTILS == true ]; then
return 0
fi
echo "${_BOLD}${_GREEN}=> ${_NORMAL}binutils version: ${_BOLD}$BINUTILS_VERSION${_NORMAL}"
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}downloading binutils${_NORMAL}"
if [ ! -f "binutils-$BINUTILS_VERSION.tar.gz" ]; then
wget -q --show-progress "$GNU_MIRROR_SITE/binutils/binutils-$BINUTILS_VERSION.tar.gz"
fi
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}extracting binutils${_NORMAL}"
if [ ! -d "binutils-$BINUTILS_VERSION" ]; then
tar xf binutils-$BINUTILS_VERSION.tar.gz $TAR_CHECKPOINT_ARG
echo ""
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}patching binutils${_NORMAL}"
echo ""
pushd binutils-$BINUTILS_VERSION > /dev/null
patch -p1 < $PROJECT_DIR/utils/patches/binutils-$BINUTILS_VERSION.patch
popd > /dev/null
fi
echo ""
if [ -d build-binutils ]; then
rm -rf build-binutils
fi
mkdir -p build-binutils
pushd build-binutils > /dev/null
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}configure${_NORMAL}"
../binutils-$BINUTILS_VERSION/configure --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT --disable-nls --disable-werror 2>&1 | pv -t -i 0.5 --name 'elapsed' > binutils-configure.log || { return 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}make${_NORMAL}"
make -j$NUM_MAKE_JOBS all 2>&1 | pv -t -i 0.5 --name 'elapsed' > binutils-make.log || { cat binutils-make.log; return 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}install${_NORMAL}"
make install 2>&1 | pv -t -i 0.5 --name 'elapsed' > binutils-install.log || { cat binutils-install.log; return 1; }
echo "${_BOLD}${_GREEN}=> ${_NORMAL}${_BOLD}done!${_NORMAL}"
popd > /dev/null
}
function build_gcc() {
if [ $SKIP_SETUP_TOOLCHAIN_GCC == true ]; then
return 0
fi
echo "${_BOLD}${_GREEN}=> ${_NORMAL}gcc version: ${_BOLD}$GCC_VERSION${_NORMAL}"
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}downloading gcc${_NORMAL}"
if [ ! -f "gcc-$GCC_VERSION.tar.gz" ]; then
wget -q --show-progress "$GNU_MIRROR_SITE/gcc/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz"
fi
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}extracting gcc${_NORMAL}"
if [ ! -d "gcc-$GCC_VERSION" ]; then
tar xf gcc-$GCC_VERSION.tar.gz $TAR_CHECKPOINT_ARG
echo ""
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}patching gcc${_NORMAL}"
echo ""
pushd gcc-$GCC_VERSION > /dev/null
patch -p1 < $PROJECT_DIR/utils/patches/gcc-$GCC_VERSION.patch
popd > /dev/null
fi
echo ""
if [ -d build-gcc ]; then
rm -rf build-gcc
fi
mkdir -p build-gcc
pushd build-gcc > /dev/null
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}configure${_NORMAL}"
../gcc-$GCC_VERSION/configure --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT --disable-nls --disable-werror --disable-libssp --enable-languages=c,c++ 2>&1 | pv -t -i 0.5 --name "elapsed" > gcc-configure.log || { cat gcc-configure.log; return 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}make (gcc)${_NORMAL}"
make -j$NUM_MAKE_JOBS all-gcc 2>&1 | pv -t -i 0.5 --name "elapsed" > gcc-make.log || { cat gcc-make.log; return 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}make (libgcc)${_NORMAL}"
make -j2 all-target-libgcc 2>&1 | pv -t -i 0.5 --name "elapsed" > libgcc-make.log || { cat libgcc-make.log; return 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}install${_NORMAL}"
make install-gcc install-target-libgcc 2>&1 | pv -t -i 0.5 --name "elapsed" > gcc-install.log || { cat gcc-install.log; return 1; }
echo "${_BOLD}${_GREEN}=> ${_NORMAL}${_BOLD}done!${_NORMAL}"
popd > /dev/null
}
function build_libstdcpp() {
pushd build-gcc > /dev/null
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}make (libstdc++)${_NORMAL}"
make -j4 all-target-libstdc++-v3 2>&1 | pv -t -i 0.5 --name "elapsed" > libstdcpp-make.log || { cat libstdcpp-make.log; return 1; }
echo "${_BOLD}${_BLUE}=> ${_NORMAL}${_BOLD}install${_NORMAL}"
make install-target-libstdc++-v3 2>&1 | pv -t -i 0.5 --name "elapsed" > libstdcpp-install.log || { cat libstdcpp-install.log; return 1; }
echo "${_BOLD}${_GREEN}=> ${_NORMAL}${_BOLD}done!${_NORMAL}"
popd > /dev/null
}
for i in "$@"; do
if [ $i == "--skip-libc" ]; then SKIP_SETUP_LIBC=true; fi
if [ $i == "--skip-sysroot" ]; then SKIP_SETUP_SYSROOT=true; fi
if [ $i == "--skip-toolchain" ]; then SKIP_SETUP_TOOLCHAIN=true; fi
if [ $i == "--skip-diskimage" ]; then SKIP_SETUP_DISKIMAGE=true; fi
if [ $i == "--skip-efi-toolchain" ]; then SKIP_SETUP_EFI_TOOLCHAIN=true; fi
if [ $i == "--skip-toolchain-binutils" ]; then SKIP_SETUP_TOOLCHAIN_BINUTILS=true; fi
if [ $i == "--skip-toolchain-gcc" ]; then SKIP_SETUP_TOOLCHAIN_GCC=true; fi
done
set -o pipefail
main "$@"