#!/bin/bash

# Created by jiaqiang.ye@lnxall.com
# Toolchain definition for aarch64 (glibc) architecture
# 2023/06/27

SRCPKG_ucinet=y
SRCPKG_openssl=y
SRCPKG_deb4gnet=y
SRCPKG_sdmount=y
SRCPKG_libcurl=y
SRCPKG_newdiags=y
SRCPKG_tdengine=n
SRCPKG_librdkafka=y
SRCPKG_rk3568_dido=n
SRCPKG_dido_modbus_tcp=y
SRCPKG_proto_forward=y
SRCPKG_rathole_config=y
SRCPKG_frpc_lnxall=y
SRCPKG_libdb_control=y
SRCPKG_socat=y
SRCPKG_xieneng_can=y
SRCPKG_libmodbus_dy=y
SRCPKG_gpio_powerchk=y
SRCPKG_bmser_db_dump=y
SRCPKG_bmser_virtual_device=y
SRCPKG_bmser_upgrade=y
SRCPKG_bmser_modbus_tcp_poll=y
# load opensource build script
source "${FTOPDIR}/opensource/sources.sh"
source "${FTOPDIR}/base_openwrt/sources.sh"
source "${FTOPDIR}/lnxall_core/sources.sh"

PRODUCT="${product}"

aarch64_dummy_config() {
	return 0
}

aarch64_dummy_clean() {
	return 0
}

aarch64_override_files() {
	local OLDDIR="$PWD"
	cp -r -p -P -v * "${LNXDESTPFX}/"
	return $?
}

generate_version_issue() {
	# generate /lib/dyiot/issue
	local major="$(($(date +%Y) - 2018))"
	local minor="$(date +%V%u)"
	local revision="$(date +%H%M)"
	ISSUE_DATE="v2-${major}.${minor}.${revision}"
	echo  "${ISSUE_DATE}" > './lib/dyiot/issue'
	return $?
}

# generate build_info.txt
generate_build_info() {
	local bfile=./build_info.txt
	echo "issue=$1" > ${bfile}
	echo "product=$2" >> ${bfile}
	echo "build_date=$(date '+%Y-%m-%d')" >> ${bfile}
}

aarch64_firmware_build() {
	local OLDDIR="${PWD}"
	local STRIP="${LNX_TCP}-strip"

	cd "${LNXDESTPFX}/" || return 1

	# generate /lib/dyiot/issue for non-openwrt systems
	local ISSUE_DATE='' # variable set in function `generate_version_issue
	generate_version_issue
	[ -z "${ISSUE_DATE}" ] && ISSUE_DATE="$(date +%Y%m%d-%H%M)"

	rm -rf ../lnxall_app-symbols/*
	mkdir -p ../lnxall_app-symbols
	cp -r -p -P * ../lnxall_app-symbols/

	# firstly strip binary
	"${STRIP}" -s bin/* sbin/*
	"${STRIP}" -s lib/lua/*.so lib/*.so*
	"${STRIP}" -s lib/*/*.so lib/lua/*/*.so

	# thirdly, remove unwanted files
	rm -rf ./share/man ./share/doc ./share/licenses ./man

	cd "${LNXDESTDIR}/opt" || return 2
	local CURDIR="${PWD}"

	rm -rf *.tar *.tar.* # remove existing tarballs

	# next create tarball
	tar --numeric-owner --owner=0 --group=0 --exclude=include \
		'--exclude=*.a' '--exclude=*.la' \
		-cf lnxall_app.tar lnxall_app && xz -z -v -9 lnxall_app.tar
	if [ $? -ne 0 ] ; then
		rm -rf *.tar *.tar.*
		echo "Error, failed to create firmware tarball" 1>&2
		return 3
	fi

	# goto firmware upgrade package generation directory
	local fwup_dir="${FTOPDIR}/lnxall_core/fwupgrade"
	cd "${fwup_dir}" || return 4

	rm -rf *.bin *.sh *.elf *.out fwupgrade # remove old files
	generate_build_info "${ISSUE_DATE}" ems

	ln -sv "${CURDIR}/lnxall_app.tar.xz" firmware.bin && \
		ln -sv "${OLDDIR}/fwscript.sh" fwscript.sh
	if [ $? -ne 0 ] ; then
		echo "Error, failed to symlink for firmware and upgrade script" 1>&2
		return 5
	fi

	# invoke make to compile `fwupgrade package
	make TARGET_CC="${LNX_CC}" TARGET_CFLAGS="${LNX_CFLAGS}" TARGET_STRIP="${LNX_TCP}-strip"
	if [ $? -ne 0 ] ; then
		rm -rf target *.bin *.sh
		return 6
	fi

	local fwfile="LNXALL_APP_RK3568_fwupgrade.elf"
	mv -f -v fwupgrade "${fwfile}" && ls -lh "${fwfile}"

	# append signed certificate to the END of ELF file:
	${FTOPDIR}/scripts/append-verify-data.sh "${fwfile}"
	cd "${OLDDIR}"
	return 0
}

register_source 'target_rk3568_glibc_bau-b30-003/override-files' \
	aarch64_dummy_config aarch64_override_files aarch64_dummy_clean

case "${PRODUCT}" in
emu)
	 register_source 'target_rk3568_glibc_bau-b30-003/gen_fw_lc' \
		aarch64_dummy_config aarch64_firmware_build aarch64_dummy_clean
;;
ems)
	register_source 'target_rk3568_glibc_bau-b30-003/gen_fw' \
		aarch64_dummy_config aarch64_firmware_build aarch64_dummy_clean
;;
*)
	register_source 'target_rk3568_glibc_bau-b30-003/gen_fw' \
		aarch64_dummy_config aarch64_firmware_build aarch64_dummy_clean
;;
esac
