#https://build.opensuse.org/package/view_file/home:post-factum:kernels/linux-pf-generic/PKGBUILD?expand=1OH
# 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=15
_release=5
_basever=${_linux_major}.${_linux_minor}.0-pf${_release}
pkgver=${_linux_major}.${_linux_minor}.${_release}
pkgrel=7
pkgdesc="pf-kernel"
arch=(x86_64 i686)
url="https://gitlab.com/post-factum/pf-kernel/wikis/README"
license=(GPL2)
makedepends=(bc kmod libelf xmlto cpio perl tar xz zstd python flex bison)
options=('!strip')
_srcname="linux-${_linux_major}.${_linux_minor}"

_name=-am
_kernelname=pf
_pfrel=${_release}
_major=${_linux_major}
_minor=${_linux_minor}
_basekernel=${_major}.${_minor}
_srcname=linux-${_basekernel}
_pfpatchhome="https://github.com/pfactum/pf-kernel/compare/"
_pfpatchname="patch-${_basekernel}-${_kernelname}${_pfrel}.diff"

_lucjanpath="https://gitlab.com/sirlucjan/kernel-patches/raw/master/${_major}.${_minor}"
#_aufs_path="aufs-patches-v3"
#_aufs_ver="20210809"
#_aufs_patch="0001-aufs-${_aufs_ver}.patch"

#_lucjanpath="https://gitlab.com/sirlucjan/kernel-patches/raw/master/${_major}"
_aufs_path="aufs-patches"
_aufs_ver="20211222"
_aufs_patch="0001-aufs-${_aufs_ver}.patch"


source=(
#		"linux-${_linux_major}.${_linux_minor}.tar.xz"
	"https://www.kernel.org/pub/linux/kernel/v${_major}.x/linux-${_basekernel}.tar.xz"
#		"patch-${_linux_major}.${_linux_minor}-pf${_release}.diff"
        "${_pfpatchname}::${_pfpatchhome}/v${_basekernel}...v${_basekernel}-${_kernelname}${_pfrel}.diff"     # the -pf patchset
		"config_arch_${_suffix}"
        "${_lucjanpath}/${_aufs_path}/${_aufs_patch}"
pf_defconfig-lf
mono
	)

sha256sums=('SKIP'
            'SKIP'
#            '95f092330b7eff0124e6e2bb19fa9373345efc78a17e99bb1287a4bd3051d8b4'
	    SKIP
	    SKIP
	    SKIP
            SKIP)

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

        for src in "${source[@]}"; do
            src="${src%%::*}"
            src="${src##*/}"
            [[ $src = *.patch ]] || continue
        echo "Applying patch $src..."
        patch -Np1 < "../$src"
        done
#	patch -Np1 -i ${srcdir}/patch-${_linux_major}.${_linux_minor}-pf${_release}.diff

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



	make olddefconfig
#	make syncconfig

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


_NUMA_off=yes		# Disable NUMA in kernel config
  # disable NUMA since 99.9% of users do not have multiple CPUs but do have multiple cores in one CPU
  # see, https://bugs.archlinux.org/task/31187
  if [ -n "$_NUMA_off" ] && [ "${CARCH}" = "x86_64" ]; then
    sed -i -e 's/CONFIG_NUMA=y/# CONFIG_NUMA is not set/' \
        -i -e '/CONFIG_AMD_NUMA=y/d' \
        -i -e '/CONFIG_X86_64_ACPI_NUMA=y/d' \
        -i -e '/CONFIG_NODES_SPAN_OTHER_NODES=y/d' \
        -i -e '/# CONFIG_NUMA_EMU is not set/d' \
        -i -e '/CONFIG_NODES_SHIFT=6/d' \
        -i -e '/CONFIG_NEED_MULTIPLE_NODES=y/d' \
        -i -e '/CONFIG_USE_PERCPU_NUMA_NODE_ID=y/d' \
        -i -e '/CONFIG_ACPI_NUMA=y/d' ./.config
  fi

  # merge our changes to arches kernel config
  ./scripts/kconfig/merge_config.sh .config "$srcdir"/pf_defconfig-lf
#  ./scripts/kconfig/merge_config.sh .config "$srcdir"/mono

    echo "CONFIG_UKSM=y"  >> .config
    sed -i 's/CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION='${_name}'/' .config
    #no module compress
    sed -i 's/^CONFIG_MODULE_COMPRESS/#CONFIG_MODULE_COMPRESS/'       .config

}

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
	make INSTALL_MOD_PATH="${pkgdir}/usr" INSTALL_MOD_STRIP=1 modules_install

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

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

	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

