1#!/bin/bash -e
2
3build_buildroot()
4{
5	check_config RK_BUILDROOT_CFG || return 0
6
7	ROOTFS_DIR="${1:-$RK_OUTDIR/buildroot}"
8
9	BUILDROOT_VERSION=$(grep "export BR2_VERSION := " \
10		"$SDK_DIR/buildroot/Makefile" | xargs -n 1 | tail -n 1)
11
12	echo "=========================================="
13	echo "          Start building buildroot($BUILDROOT_VERSION)"
14	echo "=========================================="
15
16	/usr/bin/time -f "you take %E to build buildroot" \
17		"$SCRIPTS_DIR/mk-buildroot.sh" $RK_BUILDROOT_CFG "$ROOTFS_DIR"
18
19	cp -fr $ROOTFS_DIR/rootfs.ext2  $RK_OUTDIR/../linuxfs/rootfs.img
20
21	cat "$RK_LOG_DIR/post-rootfs.log"
22
23	finish_build build_buildroot $@
24}
25
26build_linuxfs()
27{
28        check_config RK_BUILDROOT_CFG || return 0
29
30        ROOTFS_DIR="${1:-$RK_OUTDIR/buildroot}"
31
32        BUILDROOT_VERSION=$(grep "export BR2_VERSION := " \
33                "$SDK_DIR/buildroot/Makefile" | xargs -n 1 | tail -n 1)
34
35        echo "=========================================="
36        echo "          Start building buildroot($BUILDROOT_VERSION)"
37        echo "=========================================="
38
39        cp -fr $RK_OUTDIR/../linuxfs/rootfs.img $ROOTFS_DIR/rootfs.ext4
40
41        finish_build build_buildroot $@
42}
43
44build_yocto()
45{
46	check_config RK_YOCTO_CFG RK_KERNEL_VERSION_REAL || return 0
47
48	ROOTFS_DIR="${1:-$RK_OUTDIR/yocto}"
49
50	"$SCRIPTS_DIR/check-yocto.sh"
51
52	cd yocto
53	rm -f build/conf/local.conf
54
55	if echo "$RK_YOCTO_CFG" | grep -q ".conf$"; then
56		ln -sf $RK_YOCTO_CFG build/conf/local.conf
57
58		echo "=========================================="
59		echo "          Start building $RK_YOCTO_CFG"
60		echo "=========================================="
61	else
62		{
63			echo "include include/common.conf"
64			echo "include include/debug.conf"
65			echo "include include/display.conf"
66			echo "include include/multimedia.conf"
67			echo "include include/audio.conf"
68
69			echo
70			echo "MACHINE = \"$RK_YOCTO_CFG\""
71			echo
72		} > build/conf/local.conf
73
74		echo "=========================================="
75		echo "          Start building machine($RK_YOCTO_CFG)"
76		echo "=========================================="
77	fi
78
79	{
80		if [ "$RK_WIFIBT_CHIP" ]; then
81			echo "include include/wifibt.conf"
82		fi
83
84		if [ "$RK_YOCTO_CHROMIUM" ]; then
85			echo "include include/browser.conf"
86		fi
87
88		echo "include include/rksdk.conf"
89
90		echo
91
92		echo "PREFERRED_VERSION_linux-rockchip :=" \
93			"\"$RK_KERNEL_VERSION_REAL%\""
94		echo "LINUXLIBCVERSION := \"$RK_KERNEL_VERSION_REAL-custom%\""
95		case "$RK_CHIP_FAMILY" in
96			px30|rk3326|rk3562|rk3566_rk3568|rk3588)
97				echo "MALI_VERSION := \"g13p0\"" ;;
98		esac
99		echo "DISPLAY_PLATFORM := \"$RK_YOCTO_DISPLAY_PLATFORM\""
100	} > build/conf/rksdk_override.conf
101
102	source oe-init-build-env build
103	LANG=en_US.UTF-8 LANGUAGE=en_US.en LC_ALL=en_US.UTF-8 \
104		bitbake core-image-minimal -f -c rootfs -c image_complete \
105		-R conf/rksdk_override.conf
106
107	ln -rsf "$PWD/latest/rootfs.img" $ROOTFS_DIR/rootfs.ext4
108
109	touch "$RK_LOG_DIR/post-rootfs.log"
110	cat "$RK_LOG_DIR/post-rootfs.log"
111	finish_build build_yocto $@
112}
113
114build_debian()
115{
116	check_config RK_DEBIAN_VERSION || return 0
117
118	ROOTFS_DIR="${1:-$RK_OUTDIR/debian}"
119	ARCH=${RK_DEBIAN_ARCH:-armhf}
120
121	"$SCRIPTS_DIR/check-debian.sh"
122
123	echo "=========================================="
124	echo "          Start building $RK_DEBIAN_VERSION($ARCH)"
125	echo "=========================================="
126
127	cd debian
128	if [ ! -f linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz ]; then
129		RELEASE=$RK_DEBIAN_VERSION TARGET=desktop ARCH=$ARCH \
130			./mk-base-debian.sh
131		ln -sf linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz \
132			linaro-$RK_DEBIAN_VERSION-$ARCH.tar.gz
133	fi
134
135	VERSION=debug ARCH=$ARCH ./mk-rootfs-$RK_DEBIAN_VERSION.sh
136	./mk-image.sh
137
138	ln -rsf "$PWD/linaro-rootfs.img" $ROOTFS_DIR/rootfs.ext4
139
140	finish_build build_debian $@
141}
142
143# Hooks
144
145build_ubuntu()
146{
147        check_config RK_UBUNTU_VERSION || return 0
148
149        ROOTFS_DIR="${1:-$RK_OUTDIR/ubuntu}"
150        ARCH=${RK_UBUNTU_ARCH:-armhf}
151
152        echo "=========================================="
153        echo "          Start building $RK_UBUNTU_VERSION($ARCH)"
154        echo "=========================================="
155
156        cd ubuntu
157
158        ln -rsf "$PWD/jammy-rootfs.img" "$ROOTFS_DIR/rootfs.ext4"
159	"$SCRIPTS_DIR/mk-kernel.sh" modules
160
161	finish_build build_ubuntu $@
162}
163
164usage_hook()
165{
166	echo -e "buildroot-config[:<config>]       \tmodify buildroot defconfig"
167	echo -e "buildroot-make[:<arg1>:<arg2>]    \trun buildroot make"
168	echo -e "rootfs[:<rootfs type>]            \tbuild default rootfs"
169	echo -e "buildroot                         \tbuild buildroot rootfs"
170	echo -e "yocto                             \tbuild yocto rootfs"
171	echo -e "debian                            \tbuild debian rootfs"
172	echo -e "ubuntu                            \tbuild ubuntu rootfs"
173}
174
175clean_hook()
176{
177	rm -rf yocto/build/tmp yocto/build/*cache
178	rm -rf debian/binary
179
180	if check_config RK_BUILDROOT_CFG &>/dev/null; then
181		rm -rf buildroot/output/$RK_BUILDROOT_CFG
182	fi
183
184	rm -rf "$RK_OUTDIR/buildroot"
185	rm -rf "$RK_OUTDIR/yocto"
186	rm -rf "$RK_OUTDIR/debian"
187	rm -rf "$RK_OUTDIR/rootfs"
188}
189
190INIT_CMDS="default buildroot debian ubuntu yocto"
191init_hook()
192{
193	load_config RK_ROOTFS_TYPE
194	check_config RK_ROOTFS_TYPE &>/dev/null || return 0
195
196	# Priority: cmdline > custom env
197	if [ "$1" != default ]; then
198		export RK_ROOTFS_SYSTEM=$1
199		echo "Using rootfs system($RK_ROOTFS_SYSTEM) from cmdline"
200	elif [ "$RK_ROOTFS_SYSTEM" ]; then
201		export RK_ROOTFS_SYSTEM=${RK_ROOTFS_SYSTEM//\"/}
202		echo "Using rootfs system($RK_ROOTFS_SYSTEM) from environment"
203	else
204		return 0
205	fi
206
207	ROOTFS_CONFIG="RK_ROOTFS_SYSTEM=\"$RK_ROOTFS_SYSTEM\""
208	ROOTFS_UPPER=$(echo $RK_ROOTFS_SYSTEM | tr 'a-z' 'A-Z')
209	ROOTFS_CHOICE="RK_ROOTFS_SYSTEM_$ROOTFS_UPPER"
210	if ! grep -q "^$ROOTFS_CONFIG$" "$RK_CONFIG"; then
211		if ! grep -wq "$ROOTFS_CHOICE" "$RK_CONFIG"; then
212			echo -e "\e[35m$RK_ROOTFS_SYSTEM not supported!\e[0m"
213			return 0
214		fi
215
216		sed -i -e "/RK_ROOTFS_SYSTEM/d" "$RK_CONFIG"
217		echo "$ROOTFS_CONFIG" >> "$RK_CONFIG"
218		echo "$ROOTFS_CHOICE=y" >> "$RK_CONFIG"
219		"$SCRIPTS_DIR/mk-config.sh" olddefconfig &>/dev/null
220	fi
221}
222
223PRE_BUILD_CMDS="buildroot-config buildroot-make bmake"
224pre_build_hook()
225{
226	check_config RK_ROOTFS_TYPE || return 0
227
228	case "$1" in
229		buildroot-make | bmake)
230			check_config RK_BUILDROOT_CFG || return 0
231
232			shift
233			"$SCRIPTS_DIR/mk-buildroot.sh" $RK_BUILDROOT_CFG make $@
234			finish_build buildroot-make $@
235			;;
236		buildroot-config)
237			BUILDROOT_BOARD="${2:-"$RK_BUILDROOT_CFG"}"
238
239			[ "$BUILDROOT_BOARD" ] || return 0
240
241			TEMP_DIR=$(mktemp -d)
242			unset BUILDROOT_OUTPUT_DIR
243			"$SDK_DIR/buildroot/build/parse_defconfig.sh" \
244				"$BUILDROOT_BOARD" "$TEMP_DIR/.config"
245			make -C "$SDK_DIR/buildroot" O="$TEMP_DIR" menuconfig
246			"$SDK_DIR/buildroot/build/update_defconfig.sh" \
247				"$BUILDROOT_BOARD" "$TEMP_DIR"
248			rm -rf "$TEMP_DIR"
249
250			finish_build $@
251			;;
252	esac
253}
254
255BUILD_CMDS="rootfs linuxfs buildroot debian ubuntu yocto"
256build_hook()
257{
258	check_config RK_ROOTFS_TYPE || return 0
259
260	if [ -z "$1" -o "$1" = rootfs ]; then
261		ROOTFS=${RK_ROOTFS_SYSTEM:-buildroot}
262	else
263		ROOTFS=$1
264	fi
265
266	ROOTFS_IMG=rootfs.${RK_ROOTFS_TYPE}
267	ROOTFS_DIR="$RK_OUTDIR/rootfs"
268
269	echo "=========================================="
270	echo "          Start building rootfs($ROOTFS)"
271	echo "=========================================="
272
273	rm -rf "$ROOTFS_DIR"
274	mkdir -p "$ROOTFS_DIR"
275
276	case "$ROOTFS" in
277		yocto) build_yocto "$ROOTFS_DIR" ;;
278		debian) build_debian "$ROOTFS_DIR" ;;
279		ubuntu) build_ubuntu "$ROOTFS_DIR" ;;
280		buildroot) build_buildroot "$ROOTFS_DIR" ;;
281		linuxfs) build_linuxfs "$ROOTFS_DIR" ;;
282		*) usage ;;
283	esac
284
285	if [ ! -f "$ROOTFS_DIR/$ROOTFS_IMG" ]; then
286		echo "There's no $ROOTFS_IMG generated..."
287		exit 1
288	fi
289
290	if [ "$RK_ROOTFS_INITRD" ]; then
291		/usr/bin/time -f "you take %E to pack initrd image" \
292			"$SCRIPTS_DIR/mk-ramdisk.sh" "$ROOTFS_DIR/$ROOTFS_IMG" \
293			"$ROOTFS_DIR/boot.img" "$RK_BOOT_FIT_ITS"
294		ln -rsf "$ROOTFS_DIR/boot.img" "$RK_FIRMWARE_DIR/boot.img"
295	else
296		ln -rsf "$ROOTFS_DIR/$ROOTFS_IMG" "$RK_FIRMWARE_DIR/rootfs.img"
297	fi
298
299	finish_build build_rootfs $@
300}
301
302source "${BUILD_HELPER:-$(dirname "$(realpath "$0")")/../build-hooks/build-helper}"
303
304case "${1:-rootfs}" in
305	buildroot-config | buildroot-make | bmake) pre_build_hook $@ ;;
306	buildroot | debian | ubuntu | yocto) init_hook $@ ;&
307	*) build_hook $@ ;;
308esac
309