# Contributor: Carlo Landmeter <clandmeter@alpinelinux.org>

_flavor=sophgo
pkgname=linux-$_flavor
pkgver=6.12.7
_kernver=${pkgver%.*}
pkgrel=0
arch="riscv64"
pkgdesc="Linux Sophgo kernel"
url="https://github.com/sophgo/linux-riscv"
depends="initramfs-generator"
subpackages="$pkgname-dev $pkgname-doc"
_depends_dev="perl gmp-dev mpc1-dev mpfr-dev elfutils-dev bash flex bison zstd"
makedepends="$_depends_dev sed installkernel bc linux-headers linux-firmware-any openssl-dev>3 mawk
	diffutils findutils zstd pahole python3 gcc>=13.1.1_git20230624"
options="!strip	!check"
license="GPL-2.0-only"
source="https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/linux-$_kernver.tar.xz
	patch-$pkgver.patch.xz::https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/patch-$pkgver.xz
	https://dev.alpinelinux.org/archive/sophgo-patches/sophgo-$pkgver-alpine.patch
	sophgo.riscv64.config
	"
builddir="$srcdir"/linux-$_kernver

prepare() {
	default_prepare

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

prepareconfig() {
	local _builddir="$srcdir"/build-$_flavor-$CARCH
	mkdir -p "$_builddir"
	cp "$srcdir"/"$_flavor.$arch.config" "$_builddir"/.config
	echo "-$pkgrel-$flavor" > "$_builddir"/localversion-alpine
	make -C "$srcdir"/linux-$_kernver \
		O="$_builddir" \
		ARCH="riscv" \
		olddefconfig
}

build() {
	unset LDFLAGS CFLAGS CPPFLAGS CXXFLAGS
	export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"
	local _builddir="$srcdir/build-$_flavor-$CARCH"

	mkdir -p "$_builddir"
	echo "-$pkgrel-$_flavor" > "$_builddir"/localversion-alpine
	cp "$srcdir"/"$_flavor.$arch.config" "$_builddir"/.config
	msg "Configuring kernel"
	make -C "$builddir" \
		ARCH="riscv" \
		O="$_builddir" \
		olddefconfig

	msg "Build kernel"
	cd "$_builddir"
	make CC="${CC:-gcc}" \
		ARCH="riscv" \
		AWK="${AWK:-mawk}" \
		KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-Alpine"
}

package() {
	depends="$depends linux-firmware-any"
	local _builddir="$srcdir/build-$_flavor-$arch"
	export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"
	cd "$_builddir"
	local _abi_release="$(make -s kernelrelease)"

	mkdir -p "$pkgdir"/boot "$pkgdir"/lib/modules
	make modules_install zinstall dtbs_install \
		ARCH="riscv" \
		INSTALL_MOD_PATH="$pkgdir" \
		INSTALL_MOD_STRIP=1 \
		INSTALL_PATH="$pkgdir"/boot \
		INSTALL_DTBS_PATH="$pkgdir/boot/dtbs-$_flavor"

	rm -f "$pkgdir"/lib/modules/"$_abi_release"/build \
		"$pkgdir"/lib/modules/"$_abi_release"/source
	rm -rf "$pkgdir"/lib/firmware

	install -D -m644 include/config/kernel.release \
		"$pkgdir"/usr/share/kernel/$_flavor/kernel.release

	mkdir -p "$pkgdir"/usr/share/doc
	cp -r "$builddir"/Documentation \
		"$pkgdir"/usr/share/doc/linux-doc-"$pkgver"/
	# remove files that aren't part of the documentation itself
	for nondoc in \
		.gitignore conf.py docutils.conf \
		dontdiff Kconfig Makefile
	do
		rm "$pkgdir"/usr/share/doc/linux-doc-"$pkgver"/"$nondoc"
	done
	# create /usr/share/doc/linux-doc symlink
	cd "$pkgdir"/usr/share/doc; ln -s linux-doc-"$pkgver" linux-doc
}


dev() {
	local _builddir="$srcdir/build-$_flavor-$arch"
	local _abi_release="$(make -C "$_builddir" -s kernelrelease)"
	# copy the only the parts that we really need for build 3rd party
	# kernel modules and install those as /usr/src/linux-headers,
	# simlar to what ubuntu does
	#
	# this way you dont need to install the 300-400 kernel sources to
	# build a tiny kernel module
	#
	pkgdesc="Headers and script for third party modules for $_flavor kernel"
	depends="$_depends_dev"
	local dir="$subpkgdir"/usr/src/linux-headers-"$_abi_release"
	export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"

	# first we import config, run prepare to set up for building
	# external modules, and create the scripts
	mkdir -p "$dir"
	cp -a "$_builddir"/.config "$_builddir"/localversion-alpine \
		"$dir"/

	make -C "$builddir" \
		ARCH="riscv" \
		O="$dir" \
		AWK="${AWK:-mawk}" \
		prepare modules_prepare scripts

	# remove the stuff that points to real sources. we want 3rd party
	# modules to believe this is the sources
	rm "$dir"/Makefile "$dir"/source

	# copy the needed stuff from real sources
	#
	# this is taken from ubuntu kernel build script
	# http://kernel.ubuntu.com/git/ubuntu/ubuntu-zesty.git/tree/debian/rules.d/3-binary-indep.mk
	cd "$builddir"
	find .  -path './include/*' -prune \
		-o -path './scripts/*' -prune -o -type f \
		\( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \
		   -name '*.sh' -o -name '*.pl' -o -name '*.lds' -o -name 'Platform' \) \
		-print | cpio -pdm "$dir"

	cp -a scripts include "$dir"

	find "arch/riscv" -name include -type d -print | while IFS='' read -r folder; do
		find "$folder" -type f
	done | sort -u | cpio -pdm "$dir"

	install -Dm644 "$_builddir"/Module.symvers \
		"$dir"/Module.symvers

	# remove unneeded things
	msg "Removing documentation..."
	rm -r "$dir"/Documentation
	find "$dir" -type f -name '*.o' -printf 'Removing %P\n' -delete

	msg "Removing unneeded arch headers..."
	for i in "$dir"/arch/*; do
		if [ "${i##*/}" != riscv ]; then
			echo "  ${i##*/}"
			rm -r "$i"
		fi
	done

	mkdir -p "$subpkgdir"/lib/modules/"$_abi_release"
	ln -sf /usr/src/linux-headers-"$_abi_release" \
		"$subpkgdir"/lib/modules/"$_abi_release"/build
}
sha512sums="
a37b1823df7b4f72542f689b65882634740ba0401a42fdcf6601d9efd2e132e5a7650e70450ba76f6cd1f13ca31180f2ccee9d54fe4df89bc0000ade4380a548  linux-6.12.tar.xz
f45143354f8b41f928fa76c7e26d4a12cacafb972172c3835e5178d3eb5c385091af26c7bf303467a7cec7efdea23a90257cba6c4f858458ddb2aacce4131344  patch-6.12.7.patch.xz
966df374bea930ad39d60c9d0a9582156321f8b4aaad5d629331f69c55241d51dbf9488fc5e8368051f282629d1358e8c7a0e97e5e48effc7b99ad8fbf0b4938  sophgo-6.12.7-alpine.patch
1725dcc4c7cd72c3964d97504d19452ef542ba694a6c81471d4d787752e70560e7504302371206c3c8e229468e0391ebedd5bf34430cf18cc05176787d3e5ffa  sophgo.riscv64.config
"
