File PKGBUILD of Package linux-pf-generic

# Maintainer: Oleksandr Natalenko aka post-factum <oleksandr@natalenko.name>

_basename="linux-pf"
_suffix="generic"
pkgname=(
		"${_basename}-${_suffix}" "${_basename}-headers-${_suffix}"
	)
_linux_major=5
_linux_minor=8
_release=1
_basever=${_linux_major}.${_linux_minor}.0-pf${_release}
pkgver=${_linux_major}.${_linux_minor}.${_release}
pkgrel=1
pkgdesc="pf-kernel"
arch=(x86_64)
url="https://gitlab.com/post-factum/pf-kernel/wikis/README"
license=(GPL2)
makedepends=(bc kmod libelf xmlto)
options=('!strip')
_srcname="linux-${_linux_major}.${_linux_minor}"
source=(
		"linux-${_linux_major}.${_linux_minor}.tar.xz"
		"patch-${_linux_major}.${_linux_minor}-pf${_release}.diff"
		"config_arch_${_suffix}"
	)

sha256sums=('e7f75186aa0642114af8f19d99559937300ca27acaf7451b36d4f9b0f85cf1f5'
            'b067a2e436c89fe6feca3b77bd338be0af21da47d3548f2815c2e2b672c576ed'
            'b53c2935cc4d4c07cc8aa7e809880824c57b605dcf8f1c094ce757a0cddc595f')

export KBUILD_BUILD_HOST=archlinux
export KBUILD_BUILD_USER=${_basename}
export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"

prepare() {
	cd "${_srcname}"

	echo "Applying ${pkgdesc} patch..."
	patch -Np1 -i ${srcdir}/patch-${_linux_major}.${_linux_minor}-pf${_release}.diff

	echo "Setting config..."
	cp "../config_arch_${_suffix}" .config
	make olddefconfig

	make -s kernelrelease >version
	echo "Prepared ${pkgdesc} version %s $(<version)"
}

build() {
	cd "${_srcname}"

	__nthreads=$(($(nproc) + 1))
	make -j${__nthreads} all
}

_package() {
	pkgdesc="The ${pkgdesc} and modules"
	provides=(linux-pf)
	conflicts=(linux-pf)
	depends=(coreutils kmod initramfs)
	optdepends=('crda: to set the correct wireless channels of your country'
				'linux-firmware: firmware images needed for some devices')
	provides=(VIRTUALBOX-GUEST-MODULES WIREGUARD-MODULE)
	replaces=(virtualbox-guest-modules-arch wireguard-arch)

	cd "${_srcname}"
	local modulesdir="${pkgdir}/usr/lib/modules/${_basever}"

	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 "${_basename}" | install -Dm644 /dev/stdin "${modulesdir}/pkgbase"

	echo "Installing modules..."
	make INSTALL_MOD_PATH="${pkgdir}/usr" modules_install

	# remove build and source links
	rm "${modulesdir}"/{source,build}
}

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

	cd "${_srcname}"
	local builddir="${pkgdir}/usr/lib/modules/$(<version)/build"

	echo "Installing build files..."
	install -Dt "${builddir}" -m644 .config Makefile Module.symvers System.map \
		version vmlinux
	install -Dt "${builddir}/kernel" -m644 kernel/Makefile
	install -Dt "${builddir}/arch/x86" -m644 arch/x86/Makefile
	cp -t "${builddir}" -a scripts

	# add objtool for external module building and enabled VALIDATION_STACK option
	install -Dt "${builddir}/tools/objtool" tools/objtool/objtool

	# add xfs and shmem for aufs building
	mkdir -p "${builddir}"/{fs/xfs,mm}

	echo "Installing headers..."
	cp -t "${builddir}" -a include
	cp -t "${builddir}/arch/x86" -a arch/x86/include
	install -Dt "${builddir}/arch/x86/kernel" -m644 arch/x86/kernel/asm-offsets.s

	install -Dt "${builddir}/drivers/md" -m644 drivers/md/*.h
	install -Dt "${builddir}/net/mac80211" -m644 net/mac80211/*.h

	# http://bugs.archlinux.org/task/13146
	install -Dt "${builddir}/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h

	# http://bugs.archlinux.org/task/20402
	install -Dt "${builddir}/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h
	install -Dt "${builddir}/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h
	install -Dt "${builddir}/drivers/media/tuners" -m644 drivers/media/tuners/*.h

	echo "Installing Kconfig files..."
	find . -name 'Kconfig*' -exec install -Dm644 {} "${builddir}/{}" \;

	# remove unneeded architectures
	local arch
	for arch in "${builddir}"/arch/*/; do
		[[ ${arch} = */x86/ ]] && continue
		echo "Removing $(basename "${arch}")"
		rm -r "${arch}"
	done

	echo "Removing documentation..."
	rm -r "${builddir}/Documentation"

	echo "Removing broken symlinks..."
	find -L "${builddir}" -type l -printf 'Removing %P\n' -delete

	echo "Removing loose objects..."
	find "${builddir}" -type f -name '*.o' -printf 'Removing %P\n' -delete

	echo "Stripping build tools..."
	local file
	while read -rd '' file; do
		case "$(file -bi "${file}")" in
			application/x-sharedlib\;*)      # Libraries (.so)
				strip -v $STRIP_SHARED "${file}" ;;
			application/x-archive\;*)        # Libraries (.a)
				strip -v $STRIP_STATIC "${file}" ;;
			application/x-executable\;*)     # Binaries
				strip -v $STRIP_BINARIES "${file}" ;;
			application/x-pie-executable\;*) # Relocatable binaries
				strip -v $STRIP_SHARED "${file}" ;;
		esac
	done < <(find "${builddir}" -type f -perm -u+x ! -name vmlinux -print0)

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

for _p in ${pkgname[@]}; do
	_i=$(echo ${_p} | sed "s/-${_suffix}//g")
	eval "package_${_i}-${_suffix}() {
		$(declare -f "_package${_i#${_basename}}")
		_package${_i#${_basename}}
	}"
done