# SPDX-License-Identifier: GPL-2.0-only
# Maintainer: Thomas Weißschuh <linux@weissschuh.net>
# Contributor: Jan Alexander Steffens (heftig) <heftig@archlinux.org>

pkgbase=${PACMAN_PKGBASE:-linux-upstream}
pkgname=("${pkgbase}")

_extrapackages=${PACMAN_EXTRAPACKAGES-headers api-headers debug}
for pkg in $_extrapackages; do
	pkgname+=("${pkgbase}-${pkg}")
done

pkgver="${KERNELRELEASE//-/_}"
# The PKGBUILD is evaluated multiple times.
# Running scripts/build-version from here would introduce inconsistencies.
pkgrel="${KBUILD_REVISION}"
pkgdesc='Upstream Linux'
url='https://www.kernel.org/'
# Enable flexible cross-compilation
arch=(${CARCH})
license=(GPL-2.0-only)
makedepends=(
	bc
	bison
	cpio
	flex
	gettext
	kmod
	libelf
	openssl
	pahole
	perl
	python
	rsync
	tar
)
options=(!debug !strip !buildflags !makeflags)

_prologue() {
	# MAKEFLAGS from makepkg.conf override the ones inherited from kbuild.
	# Bypass this override with a custom variable.
	export MAKEFLAGS="${KBUILD_MAKEFLAGS}"

	# Kbuild works in the output directory, where this PKGBUILD is located.
	cd "$(dirname "${BASH_SOURCE[0]}")"
}

build() {
	_prologue

	${MAKE} KERNELRELEASE="${KERNELRELEASE}" KBUILD_BUILD_VERSION="${pkgrel}"
}

_package() {
	pkgdesc="The ${pkgdesc} kernel and modules"

	local modulesdir="${pkgdir}/usr/${MODLIB}"

	_prologue

	echo "Installing boot image..."
	# systemd expects to find the kernel here to allow hibernation
	# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
	install -Dm644 "$(${MAKE} -s image_name)" "${modulesdir}/vmlinuz"

	# Used by mkinitcpio to name the kernel
	echo "${pkgbase}" > "${modulesdir}/pkgbase"

	echo "Installing modules..."
	${MAKE} INSTALL_MOD_PATH="${pkgdir}/usr" INSTALL_MOD_STRIP=1 \
		DEPMOD=true modules_install

	if [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
		echo "Installing dtbs..."
		${MAKE} INSTALL_DTBS_PATH="${modulesdir}/dtb" dtbs_install
	fi

	# remove build link, will be part of -headers package
	rm -f "${modulesdir}/build"
}

_package-headers() {
	pkgdesc="Headers and scripts for building modules for the ${pkgdesc} kernel"

	local builddir="${pkgdir}/usr/${MODLIB}/build"

	_prologue

	if grep -q CONFIG_MODULES=y include/config/auto.conf; then
		echo "Installing build files..."
		"${srctree}/scripts/package/install-extmod-build" "${builddir}"
	fi

	echo "Installing System.map and config..."
	mkdir -p "${builddir}"
	cp System.map "${builddir}/System.map"
	cp .config "${builddir}/.config"

	echo "Adding symlink..."
	mkdir -p "${pkgdir}/usr/src"
	ln -sr "${builddir}" "${pkgdir}/usr/src/${pkgbase}"
}

_package-api-headers() {
	pkgdesc="Kernel headers sanitized for use in userspace"
	provides=(linux-api-headers)
	conflicts=(linux-api-headers)

	_prologue

	${MAKE} headers_install INSTALL_HDR_PATH="${pkgdir}/usr"
}

_package-debug(){
	pkgdesc="Non-stripped vmlinux file for the ${pkgdesc} kernel"

	local debugdir="${pkgdir}/usr/src/debug/${pkgbase}"
	local builddir="${pkgdir}/usr/${MODLIB}/build"

	_prologue

	install -Dt "${debugdir}" -m644 vmlinux
	mkdir -p "${builddir}"
	ln -sr "${debugdir}/vmlinux" "${builddir}/vmlinux"
}

for _p in "${pkgname[@]}"; do
	eval "package_$_p() {
		$(declare -f "_package${_p#$pkgbase}")
		_package${_p#$pkgbase}
	}"
done
