forked from OpenIPC/firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
/
building.sh
executable file
·271 lines (222 loc) · 7.54 KB
/
building.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
#!/bin/bash
#
# OpenIPC.org (c)
#
#
# Constants
#
MAX_KERNEL_SIZE=0x200000 # 2MiB, 2097152
MAX_KERNEL_SIZE_ULTIMATE=0x300000 # 3MiB, 3145728
MAX_KERNEL_SIZE_EXPERIMENTAL=0x3E8480 # ~3.9MiB, 4097152
MAX_ROOTFS_SIZE=0x500000 # 5MiB, 5242880
MAX_ROOTFS_SIZE_ULTIMATE=0xA00000 # 10MiB, 10485760
_d=$(date +"%y.%m.%d")
OPENIPC_VER=$(echo OpenIPC v${_d:0:1}.${_d:1})
unset _d
SRC_CACHE_DIR="/tmp/buildroot_dl"
LOCK_FILE="$(pwd)/openipc.lock"
#
# Functions
#
echo_c() {
# 30 grey, 31 red, 32 green, 33 yellow, 34 blue, 35 magenta, 36 cyan,37 white
echo -e "\e[1;$1m$2\e[0m"
}
check_or_set_lock() {
if [ -f "$LOCK_FILE" ] && ps -ax | grep "^\s*\b$(cat "$LOCK_FILE")\b" >/dev/null; then
echo_c 31 "Another instance running with PID $(cat "$LOCK_FILE")."
exit 1
fi
echo_c 32 "Starting OpenIPC builder."
echo $$ >$LOCK_FILE
}
build_list_of_projects() {
FUNCS=()
AVAILABLE_PROJECTS=$(find br-ext-chip-*/configs/* -name "*_defconfig")
local p
for p in $AVAILABLE_PROJECTS; do
p=${p##*/}; p=${p//_defconfig/}
FUNCS+=($p)
done
}
select_project() {
if [ $# -eq 0 ]; then
if [ -n "$(command -v fzf)" ]; then
local entries=$(echo $AVAILABLE_PROJECTS | sed "s/ /\n/g" | fzf)
[ -z "$entries" ] && echo_c 31 "Cancelled." && drop_lock_and_exit
BOARD=$(echo $entries | cut -d / -f 3 | awk -F_ '{printf "%s_%s", $1, $2}')
elif [ -n "$(command -v whiptail)" ]; then
local cmd="whiptail --title \"Available projects\" --menu \"Please select a project from the list:\" --notags 20 76 12"
local entry
for entry in $AVAILABLE_PROJECTS; do
local project=${entry##*/}; project=${project//_defconfig/}
local vendor=${entry%%/*}; vendor=${vendor##*-}
local flavor=${project##*_}
local chip=${project%%_*}
cmd="${cmd} \"${project}\" \"${vendor^} ${chip^^} ${flavor}\""
done
BOARD=$(eval "${cmd} 3>&1 1>&2 2>&3")
[ $? != 0 ] && echo_c 31 "Cancelled." && drop_lock_and_exit
else
echo -ne "Usage: $0 <variant>\nVariants:"
local i
for i in "${FUNCS[@]}"; do echo -n " ${i}"; done
echo
drop_lock_and_exit
fi
else
BOARD=$1
fi
}
drop_lock_and_exit() {
[ -f "$LOCK_FILE" ] && rm $LOCK_FILE
exit 0
}
log_and_run() {
local command=$1
echo_c 35 "$command"
$command
}
clone() {
sudo apt-get update -y
sudo apt-get install -y automake make wget cpio file autotools-dev bc build-essential curl fzf git libtool rsync unzip
git clone --depth=1 https://github.com/OpenIPC/firmware.git
}
fresh() {
BR_VER=$1
if [ -d "$SRC_CACHE_DIR" ]; then
echo_c 36 "Found cache directory."
else
echo_c 31 "Cache directory not found."
echo_c 34 "Creating cache directory ..."
log_and_run "mkdir -p ${SRC_CACHE_DIR}"
echo_c 34 "Done.\n"
fi
if [ -d "buildroot-${BR_VER}" ]; then
echo_c 36 "Found existing Buildroot directory."
if [ -d "buildroot-${BR_VER}/dl" ]; then
echo_c 36 "Found existing Buildroot downloads directory."
echo_c 34 "Copying Buildroot downloads to cache directory ..."
log_and_run "cp -rvf buildroot-${BR_VER}/dl/* ${SRC_CACHE_DIR}"
echo_c 34 "Done.\n"
fi
echo_c 34 "Cleaning source directory."
echo_c 35 "make distclean"
make distclean
echo_c 34 "Done.\n"
else
echo_c 31 "Buildroot sources not found."
fi
echo_c 34 "Downloading Buildroot sources to cache directory ..."
log_and_run "curl --continue-at - --output ${SRC_CACHE_DIR}/buildroot-${BR_VER}.tar.gz https://buildroot.org/downloads/buildroot-${BR_VER}.tar.gz"
echo_c 34 "Done.\n"
echo_c 34 "Extracting a fresh copy of Buildroot from Buildroot sources ..."
log_and_run "tar xvf ${SRC_CACHE_DIR}/buildroot-${BR_VER}.tar.gz"
echo_c 34 "Done.\n"
echo_c 34 "Copying cached source files back to Buildroot ..."
log_and_run "mkdir -p buildroot-${BR_VER}/dl/"
log_and_run "cp -rvf ${SRC_CACHE_DIR}/* buildroot-${BR_VER}/dl/"
echo_c 34 "Done.\n"
# prevent to double download buildroot
# make prepare
echo_c 33 "Start building OpenIPC Firmware ${OPENIPC_VER} for ${SOC}."
echo "The start-stop times" >/tmp/openipc_buildtime.txt
date >>/tmp/openipc_buildtime.txt
}
should_fit() {
local filename=$1
local maxsize=$2
local filesize=$(stat --printf="%s" ./output/images/$filename)
if [[ $filesize -gt $maxsize ]]; then
export TG_NOTIFY="Warning: $filename is too large: $filesize vs $maxsize"
echo_c 31 "Warning: $filename is too large: $filesize vs $maxsize"
exit 1
fi
}
rename() {
if grep -q ultimate_defconfig ./output/.config || grep -q sdcard_defconfig ./output/.config; then
should_fit uImage $MAX_KERNEL_SIZE_ULTIMATE
should_fit rootfs.squashfs $MAX_ROOTFS_SIZE_ULTIMATE
else
should_fit uImage $MAX_KERNEL_SIZE
should_fit rootfs.squashfs $MAX_ROOTFS_SIZE
fi
mv -v ./output/images/uImage ./output/images/uImage.${SOC}
mv -v ./output/images/rootfs.squashfs ./output/images/rootfs.squashfs.${SOC}
mv -v ./output/images/rootfs.cpio ./output/images/rootfs.${SOC}.cpio
mv -v ./output/images/rootfs.tar ./output/images/rootfs.${SOC}.tar
date >>/tmp/openipc_buildtime.txt
echo_c 31 "\n\n$(cat /tmp/openipc_buildtime.txt)\n\n"
}
rename_initramfs() {
should_fit uImage $MAX_KERNEL_SIZE_EXPERIMENTAL
mv -v ./output/images/uImage ./output/images/uImage.initramfs.${SOC}
mv -v ./output/images/rootfs.cpio ./output/images/rootfs.${SOC}.cpio
mv -v ./output/images/rootfs.tar ./output/images/rootfs.${SOC}.tar
date >>/tmp/openipc_buildtime.txt
echo_c 31 "\n\n$(cat /tmp/openipc_buildtime.txt)\n\n"
}
autoup_rootfs() {
echo_c 34 "\nDownloading u-boot created by OpenIPC"
curl --location --output ./output/images/u-boot-${SOC}-universal.bin \
https://github.com/OpenIPC/firmware/releases/download/latest/u-boot-${SOC}-universal.bin
echo_c 34 "\nMaking autoupdate u-boot image"
./output/host/bin/mkimage -A arm -O linux -T firmware -n "$OPENIPC_VER" \
-a 0x0 -e 0x50000 -d ./output/images/u-boot-${SOC}-universal.bin \
./output/images/autoupdate-uboot.img
echo_c 34 "\nMaking autoupdate kernel image"
./output/host/bin/mkimage -A arm -O linux -T kernel -C none -n "$OPENIPC_VER" \
-a 0x50000 -e 0x250000 -d ./output/images/uImage.${SOC} \
./output/images/autoupdate-kernel.img
echo_c 34 "\nMaking autoupdate rootfs image"
./output/host/bin/mkimage -A arm -O linux -T filesystem -n "$OPENIPC_VER" \
-a 0x250000 -e 0x750000 -d ./output/images/rootfs.squashfs.${SOC} \
./output/images/autoupdate-rootfs.img
}
copy_function() {
test -n "$(declare -f "$1")" || return
eval "${_/$1/$2}"
}
uni_build() {
[ -z "$BOARD" ] && BOARD=$FUNCNAME
SOC=$(echo $BOARD | cut -d '_' -f 1)
set -e
if [ "$(echo $BOARD | cut -sd '_' -f 2)" == "" ]; then
BOARD="${BOARD}_lite"
fi
if [ "$BOARD" == "hi3518ev200_lite" ]; then
NEED_AUTOUP=1
fi
echo_c 33 "\n SoC: $SOC\nBoard: $BOARD\n"
if [ "all" = "${COMMAND}" ]; then
fresh $(make BOARD=${BOARD} buildroot-version)
fi
log_and_run "make BOARD=${BOARD} ${COMMAND}"
if [ "all" == "${COMMAND}" ]; then
if [ "ssc335_initramfs" == "$BOARD" ]; then
rename_initramfs
else
rename
fi
if [ ! -z "$NEED_AUTOUP" ]; then
autoup_rootfs
fi
fi
}
#######
check_or_set_lock
build_list_of_projects
if [ -n "$1" ]; then
BOARD=$1
else
select_project
fi
[ -z "$BOARD" ] && echo_c 31 "Nothing selected." && drop_lock_and_exit
COMMAND=$2
[ -z "$COMMAND" ] && COMMAND=all
for i in "${FUNCS[@]}"; do
copy_function uni_build $i
done
echo_c 37 "Building OpenIPC for ${BOARD}"
uni_build $BOARD $COMMAND
drop_lock_and_exit