forked from CodeAsm/teeny-linux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.sh
executable file
·310 lines (284 loc) · 7.52 KB
/
build.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
#!/bin/bash
KERNEL="5.1-rc2" #Kernel release number.
V="5" #Kernel version for folder (should use subsctring)
KTYPE="gz" #gz used by RC, xz by stable releases
BUSY="1.30.1" #busybox release number
ARCH="x86_64" #default arch
ARC="x86" #short arch (can I use grep for this?)
TOP=$HOME/Linux/teeny-linux #location for the build
COMPILER="powerpc-linux-gnu-" #compiler pre.
#DO NOT EDIT BELOW it should not be nececairy.
#-----------------------------------------------------------
#first stuff happening here.
mkdir -p $TOP
cd $TOP
#a bunch of helpfull functions
#----------------------------------------------------------------------
function DoQemu {
cd $TOP
qemu-system-$ARCH \
-kernel obj/linux-$ARC/arch/$ARCH/boot/bzImage \
-initrd obj/initramfs-busybox-$ARC.cpio.gz \
-nographic -append "console=ttyS0" #-enable-kvm
}
#----------------------------------------------------------------------
function delete {
cd $TOP
mv linux-$KERNEL.tar.$KTYPE ../linux-$KERNEL.tar.$KTYPE
mv busybox-$BUSY.tar.bz2 ../busybox-$BUSY.tar.bz2
rm -rf *
mv ../linux-$KERNEL.tar.$KTYPE linux-$KERNEL.tar.$KTYPE
mv ../busybox-$BUSY.tar.bz2 busybox-$BUSY.tar.bz2
exit 1
}
#----------------------------------------------------------------------
function writeInit {
cat << EOF> init
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo -e '\nWelcome to Teeny Linux\n'
echo -e 'Amount of seconds to boot: '
cut -d' ' -f1 /proc/uptime
echo -e 'To shutdown and return to your CLI'
echo -e 'type poweroff -f or \n Ctrl+a C, then "quit"\n'
cat /proc/version
exec /bin/sh
EOF
}
#----------------------------------------------------------------------
function buildBusyBox {
cd $TOP
rm -rf busybox-$BUSY/
tar xjf busybox-$BUSY.tar.bz2
rm -rf obj/busybox-$ARC
cd $TOP/busybox-$BUSY
mkdir -pv ../obj/busybox-$ARC
if [ $ARCH != "x86_64" ]; then
make O=../obj/busybox-$ARC ARCH=$ARCH CROSS_COMPILE=$COMPILER defconfig
else
make O=../obj/busybox-$ARC defconfig
fi
# do a static lib thing for busy,
sed -i '/# CONFIG_STATIC is not set/c\CONFIG_STATIC=y' ../obj/busybox-$ARC/.config
cd ../obj/busybox-$ARC
if [ $ARCH != "x86_64" ]; then
make -j$(nproc) ARCH=$ARCH CROSS_COMPILE=$COMPILER
else
make -j$(nproc)
fi
make install
}
function makeNewInitramfs {
#Make the initramfs (first clean ofcourse)
rm -rf $TOP/initramfs
mkdir -pv $TOP/initramfs/$ARC-busybox
cd $TOP/initramfs/$ARC-busybox
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin,local/{bin,lib}}}
makeInitramfs
}
function makeInitramfs {
cd $TOP/initramfs/$ARC-busybox
cp -av $TOP/obj/busybox-$ARC/_install/* .
#add new files to copy here?
writeInit
chmod +x init
find . -print0 \
| cpio --null -ov --format=newc \
| gzip -9 > $TOP/obj/initramfs-busybox-$ARC.cpio.gz
}
#----------------------------------------------------------------------
function makeKernel {
cd $TOP
rm -rf linux-$KERNEL/
rm -rf obj/linux-$ARC
if [ ! $KTYPE == "gz" ]; then #for gz we need xvf, due to RC being diferent
tar xJf linux-$KERNEL.tar.$KTYPE
else
tar xvf linux-$KERNEL.tar.$KTYPE
fi
#Make our Kernel
cd $TOP/linux-$KERNEL
if [ $ARCH == "ppc" ]; then
#for ppc, we need to make a selection somday
#make O=../obj/linux-$ARC ARCH=$ARCHF CROSS_COMPILE=$COMPILER g5_defconfig
# Write out Linux kernel .config file
mkdir "${TOP}"/obj/linux-$ARC/
#touch "${TOP}"/obj/linux-$ARC/.config
cat << EOF> "${TOP}"/obj/linux-$ARC/.config
CONFIG_EXPERIMENTAL=y
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_SYSFS_DEPRECATED=y
CONFIG_RELAY=y
CONFIG_EMBEDDED=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SHMEM=y
CONFIG_SLAB=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_KMOD=y
CONFIG_BLOCK=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_ALTIVEC=y
CONFIG_PREEMPT=y
CONFIG_PREEMPT_BKL=y
CONFIG_BINFMT_ELF=y
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="rw init=/bin/sh panic=1 PATH=/bin root=/dev/ram0 console=ttyS0"
CONFIG_SECCOMP=y
CONFIG_ISA=y
CONFIG_ADVANCED_OPTIONS=y
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_IDE_TASK_IOCTL=y
CONFIG_IDE_GENERIC=y
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_SCSI_PROC_FS=y
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_LOGGING=y
CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_MD=y
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_KEYBOARD=y
CONFIG_INPUT_MOUSE=y
CONFIG_SERIO=y
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_HWMON=y
CONFIG_FB=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TRIDENT=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FONTS=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y
CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_DNOTIFY=y
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=ytt
CONFIG_PROC_SYSCTL=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_CONFIGFS_FS=y
CONFIG_SQUASHFS=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_UTF8=y
EOF
make O=../obj/linux-$ARC ARCH=$ARCHF CROSS_COMPILE=$COMPILER g5_defconfig
#make O=../obj/linux-$ARC ARCH=$ARCHF CROSS_COMPILE=$COMPILER menuconfig
#make O=../obj/linux-$ARC ARCH=$ARCHF CROSS_COMPILE=$COMPILER kvmconfig
make O=../obj/linux-$ARC ARCH=$ARCHF CROSS_COMPILE=$COMPILER -j$(nproc)
else
make O=../obj/linux-$ARC x86_64_defconfig
make O=../obj/linux-$ARC kvmconfig
make O=../obj/linux-$ARC -j$(nproc)
fi
}
#----------------------------------------------------------------------
#process commandline arguments
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-arch|-cpu)
ARCH="$2"
ARC="$2"
shift; shift # past argument and value
;;-init|-makeInit|-makeinit)
makeInitramfs
ARCH="x86_64"
DoQemu
exit
shift; shift # past argument and value
;;-d|-delete|-deleteall)
delete
shift; # past argument and value
;;-k|-kernel)
KERNEL="$2"
shift; shift
;;
esac
done
#sets defaults if arguments are empty or incorrect
if [ -z $ARCH ]; then
ARCH="x86_64"; fi
cd $TOP
#Download if nececairy, clean an unclean build
if [ ! -f $TOP/linux-$KERNEL.tar.$KTYPE ]; then
wget -c https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-$KERNEL.tar.$KTYPE
wget -c https://git.kernel.org/torvalds/t/linux-$KERNEL.tar.gz
fi
if [ ! -f $TOP/busybox-$BUSY.tar.bz2 ]; then
wget -c https://busybox.net/downloads/busybox-$BUSY.tar.bz2
fi
if [ $ARCH == "ppc" ]; then #this is to have a full arch name, but working functions
ARCHF="powerpc"
else
ARCHF=$ARCH
fi
if [ -f $TOP/obj/initramfs-busybox-$ARC.cpio.gz ]; then
if [ ! -f $TOP/obj/linux-$ARC/arch/$ARCHF/boot/bzImage ]; then
makeKernel
fi
DoQemu
exit
else
if [ -f $TOP/obj/busybox-$ARC/busybox ]; then
makeNewInitramfs
if [ ! -f $TOP/obj/linux-$ARC/arch/$ARCHF/boot/bzImage ]; then
makeKernel
fi
DoQemu
exit
else
buildBusyBox
makeNewInitramfs
if [ ! -f $TOP/obj/linux-$ARC/arch/$ARCHF/boot/bzImage ]; then
makeKernel
fi
DoQemu
exit
fi
fi
fi