# 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
	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/lib/modules/${KERNELRELEASE}"

	_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/lib/modules/${KERNELRELEASE}/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="${pkgver}")
	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/lib/modules/${KERNELRELEASE}/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
