# Maintainer: Dominique Martinet <dominique.martinet@atmark-techno.com>

pkgname=linux-at-x2
pkgver=5.10.243
pkgrel=0
_gitref=$pkgver-r$pkgrel

url="https://armadillo.atmark-techno.com/"
pkgdesc="Linux kernel for atmark X2 series"
makedepends="perl gmp-dev elfutils-dev bash
	sed installkernel bc linux-headers zstd
	bison flex openssl-dev findutils python3 pahole
	linux-firmware-imx
"
options="!strip !check"
source="linux-5.10-5.10.243-r0.tar.gz
config-changes-at.aarch64
config-changes-at-debug.aarch64"
arch="aarch64"
license="GPL-2.0"
_flavors="at at-debug"
subpackages="$pkgname-dbg::aarch64
	$pkgname-debug::aarch64
	$pkgname-debug-dbg:debug_dbg:aarch64
"
builddir="$srcdir/linux-5.10-$_gitref"

case "$CARCH" in
	aarch64) _carch="arm64" ;;
	arm*) _carch="arm" ;;
esac

prepare() {
	default_prepare
	_unzstd

	# remove localversion from patch if any
	rm -f localversion*

	local flavor=
	for flavor in $_flavors; do
		local _builddir="$srcdir"/build-$flavor
		mkdir -p "$_builddir"
		echo "-$pkgrel-$flavor" > "$_builddir"/localversion-alpine
		_genconfig $flavor
		make O="$_builddir" \
			ARCH="$_carch" \
			olddefconfig
		_verifyconfig $flavor
	done
}

_unzstd() {
	unzstd --output-dir-mirror "$srcdir/firm" -f -r /lib/firmware/imx/sdma
}

# generate config from defconfig and apply local changes.
# config-changes-$flavor.$CARCH holds a list of = delimited
# config command and values used by kernel scripts/config script.
_genconfig() {
	local flavor=$1 defconfig=
	local linux_tree="$builddir"
	local builddir="$srcdir"/build-$flavor
	local defconfig=
	case $flavor in
		at|at-debug) defconfig=x2_defconfig;;
		*) die "Unknown flavor: $flavor" ;;
	esac

	cp "$linux_tree/arch/$_carch/configs/$defconfig" \
		"$builddir"/.config
	"$srcdir"/linux-5.10-$_gitref/scripts/config \
	       --file "$builddir"/.config \
	       --set-str CONFIG_EXTRA_FIRMWARE_DIR "$srcdir/firm/lib/firmware"

	while read -r line; do
		# skip comments
		case "$line" in
			"#"*) continue;;
		esac
		local option=${line%%=*} str=
		local cmd=$(echo $line | cut -d= -f2)
		case "$cmd" in
			y) cmd="enable";;
			n) cmd="disable";;
			m) cmd="module";;
			'"'*) cmd="set-str"; str="${line#*=}";;
			[0-9]*) cmd="set-val"; str="${line#*=}";;
			*) die "Command $cmd not accepted" ;;
		esac
		msg "[$flavor] $cmd: $option $str"
		"$linux_tree/scripts/config" \
			--file "$builddir"/.config \
			--$cmd "$option" "${str//\"/}"
	done < "$srcdir"/config-changes-$flavor.$CARCH
}

# verify if options are set to correct value
_verifyconfig() {
	local flavor=$1
	local builddir="$srcdir"/build-$flavor
	while read -r line; do
		[ ${line:0:1} = "#" ] && continue
		local option=${line%%=*} str="" invert=""
		local cmd=$(echo $line | cut -d= -f2)
		case "$cmd" in
			enable) str="$option=y" ;;
			disable) str="$option"; invert="-v" ;;
			module) str="$option=m" ;;
			set-val) str="$option=${line##*=}" ;;
			set-str) str=${line##*=}
				str="$option=\"${str//\"/}\"" ;;
		esac
		grep -q $invert "^$str" "$builddir"/.config || \
			die "Config: $option not properly set!"
	done < "$srcdir"/config-changes-$flavor.$CARCH
}

build() {
	unset LDFLAGS

	# abuild exports HOSTLD=$LD for cross compilation, but
	# $LD can be empty and this breaks builds, reset a sane default
	[ -n "$HOSTLD" ] || export HOSTLD=ld

	for i in $_flavors; do
		cd "$srcdir"/build-$i
		local _kver=$(make kernelversion)
		case "$pkgver" in
		"$_kver"*) ;;
		*)
			error "Version in Makefile ($_kver) does not correspond with pkgver ($pkgver)"
			return 1
			;;
		esac
		make -j"$(nproc)" ARCH="$_carch" CC="${CC:-gcc}" \
			KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-Alpine"
	done
}

_package() {
	local _buildflavor="$1" _outdir="$2"
	local _abi_release=$pkgver-$pkgrel-$_buildflavor

	cd "$srcdir"/build-$_buildflavor

	mkdir -p "$_outdir"/boot "$_outdir"/lib/modules

	cd "$srcdir"/build-$_buildflavor
	# modules_install seems to regenerate a defect Modules.symvers. Work
	# around it by backing it up and restore it after modules_install
	cp Module.symvers Module.symvers.backup

	make -j1 modules_install \
		ARCH="$_carch" \
		INSTALL_MOD_PATH="$_outdir" \
		INSTALL_MOD_STRIP=1 STRIP="${CHOST:+$CHOST-}strip"
	cp Module.symvers.backup Module.symvers

	rm -f "$_outdir/boot/System.map"
	rm -f "$_outdir"/lib/modules/$_abi_release/build \
		"$_outdir"/lib/modules/$_abi_release/source
	rm -rf "$_outdir"/lib/firmware

	cp arch/arm64/boot/Image \
		arch/arm64/boot/dts/freescale/yakushima-eva.dtb \
		arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dtb \
		arch/arm64/boot/dts/freescale/armadillo_iotg_g4*.dtbo \
		arch/arm64/boot/dts/freescale/high-g1*.dtb \
		arch/arm64/boot/dts/freescale/high-g1*.dtbo \
		arch/arm64/boot/dts/freescale/imx8mp-evk.dtb \
		arch/arm64/boot/dts/freescale/imx8ulp-evk.dtb \
		arch/arm64/boot/dts/freescale/armadillo_900.dtb \
		arch/arm64/boot/dts/freescale/armadillo_900*.dtbo \
		arch/arm64/boot/dts/freescale/armadillo_iotg_a9e*.dtbo \
		"$_outdir/boot"

	# remove customize dtbo that is left for user
	rm -f "$_outdir/boot/"*-customize.dtbo \
		"$_outdir/boot/"*-at-dtweb.dtbo

	# check we removed all at-dtweb and customize dtbo
	if find "$_outdir/boot" | grep -iE 'at-dtweb|customize'; then
		echo "Found user overlays, see above!!"
		return 1
	fi
}

_dbg() {
	local _buildflavor="$1" _outdir="$2"
	local _abi_release=$pkgver-$pkgrel-$_buildflavor

	pkgdesc="Debug files for kernel (vmlinux, modules debug symbols)"
	depends=
	local dir="$_outdir/usr/lib/debug/lib/modules/$_abi_release/"

	cd "$srcdir"/build-$_buildflavor

	mkdir -p "$dir"
	install -Dt "$dir" -m644 Module.symvers System.map vmlinux

	# install module debug symbols
	# we need 'suffix-y= DEPMOD=:' to avoid compressing them successfully
	make -j1 modules_install \
		ARCH="$_carch" \
		INSTALL_MOD_PATH="$_outdir/usr/lib/debug" \
		INSTALL_MOD_STRIP=--only-keep-debug \
		STRIP="${CHOST:+$CHOST-}strip" \
		suffix-y= DEPMOD=:
}

# main flavor installs in $pkgdir
package() {
	_package at "$pkgdir"
}

debug() {
	_package at-debug "$subpkgdir"
}

dbg() {
	_dbg at "$subpkgdir"
}

debug_dbg() {
	_dbg at-debug "$subpkgdir"
}


sha512sums="
d360a1cd770a574cb6f95f616c038638ea4fdebc7119aa37f8fa738c9e06561bbaea686b791839304109bee43b798ad3a81ac089761cd40ba98f829b0dff4eab  linux-5.10-5.10.243-r0.tar.gz
424d53e9b9fbd09c287f58d24ca35d1a4f6627c46fd10fb3d20a90cd2d3e167eea997ff5da6ea0aba7ac746b5a388fe1f0dd2af43905d63f8cbbe577fb7361ef  config-changes-at.aarch64
477df717a1f7867f726c9c24b5c54377bc0527345612cd315575681a31e054fa0115d1c44e77e1dc2739dc0338be183d3482d8653e11f4d9dfda178d6888eef6  config-changes-at-debug.aarch64
"
