#220104b sfs
#https://build.opensuse.org/package/view_file/home:post-factum:kernels/linux-pf-generic/PKGBUILD?expand=1OH
# pf: Oleksandr Natalenko aka post-factum <oleksandr@natalenko.name>

_suffix2="mg3"
pkgrel=1
#https://forum.porteus.org/viewtopic.php?p=52232#p52232  64bit.config
_basename="linux-pf"
_suffix="generic"
pkgname=(
		"${_basename}-${_suffix2}" "${_basename}-headers-${_suffix2}"
	)
_linux_major=6
_linux_minor=0
_release=2

_basever=${_linux_major}.${_linux_minor}.0-pf${_release}
pkgver=${_linux_major}.${_linux_minor}.${_release}
pkgdesc="pf-kernel-${_suffix2}"
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=-${_suffix2}
_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"
#_lucjanpath2="${_lucjanpath}/${_aufs_path}/${_aufs_patch}"
_lucjanpath2="https://gitlab.com/sirlucjan/kernel-patches/-/raw/master/6.0/aufs-patches/0001-aufs-6.0-merge-v20221010.patch"

#aufsver="5.x-rcN"
#aufsver="6.0"
#_lucjanpath2="https://github.com/sfjro/aufs5-standalone/archive/aufs${aufsver}.zip"
_branch=pf-${_linux_major}.${_linux_minor}
source=(
#		"linux-${_linux_major}.${_linux_minor}.tar.xz"
#	"https://www.kernel.org/pub/linux/kernel/v${_major}.x/linux-${_basekernel}.tar.xz"
	  "$_srcname::git+https://codeberg.org/pf-kernel/linux.git#branch=$_branch"
#		"patch-${_linux_major}.${_linux_minor}-pf${_release}.diff"
        #"${_pfpatchname}::${_pfpatchhome}/v${_basekernel}...v.diff"     # the -pf patchset
#	"patch-${_linux_major}.${_linux_minor}-pf${_release}.diff::https://github.com/pfactum/pf-kernel/compare/v${_linux_major}.${_linux_minor}...pf-${_linux_major}.${_linux_minor}.diff"		"config_arch_${_suffix}"
    "io_uring-bug.patch::https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=0091bfc81741b8d3aeb3b7ab8636f911b2de6e80"
        "${_lucjanpath2}"
lf+.config
pt-y.config
pt-m.config
64bit.config
fs-y.config
fs-m.config
arch.config
lf-m.config
pf+.config
opt-perf.config
opt-size.config
mda9.config
	)

sha256sums=('SKIP'
            'SKIP'
	    SKIP
	    SKIP
	    SKIP
	    SKIP
	    SKIP
	    SKIP
	    SKIP
	    SKIP
	    SKIP
	    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() {
if [ ${_lucjanpath2} = "https://github.com/sfjro/aufs5-standalone/archive/aufs${aufsver}.zip" ] ;then
    msg "Install aufs..."
    cp -r ${srcdir}/aufs5-standalone-aufs${aufsver}/{Documentation,fs,include/uapi/linux/aufs_type.h} ${srcdir}/${_srcname}
    cp ${srcdir}/aufs5-standalone-aufs${aufsver}/include/uapi/linux/aufs_type.h ${srcdir}/${_srcname}/include/uapi/linux

    pushd ${srcdir}/${_srcname}
        for src in `ls -1 ${srcdir}/aufs5-standalone-aufs${aufsver}/*.patch` ; do
        msg "Applying patch $src..."
        patch -Np1 -i "$src"
        done
    popd
fi
	cd "${_srcname}"
	msg "Applying ${pkgdesc} patch..."
#	patch -Np1 -i ${srcdir}/patch-${_linux_major}.${_linux_minor}-pf${_release}.diff

#if [ ${_lucjanpath2} != "https://github.com/sfjro/aufs5-standalone/archive/aufs${aufsver}.zip" ] ;then
        for src in "${source[@]}"; do
            src="${src%%::*}"
            src="${src##*/}"
            [[ $src = *.patch ]] || continue
        echo "Applying patch $src..."
        patch -Np1 < "../$src"
        done
#fi
}

build() {
#echo "${_srcname}" ;ls ;exit
	cd $srcdir
	cd "${_srcname}"

 NUMA(){
    _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
 LF(){
 #максимально  в m :
  ./scripts/kconfig/merge_config.sh .config "$srcdir"/lf-m.config
 #прочие твики :
  ./scripts/kconfig/merge_config.sh -m .config "$srcdir"/lf+.config
 }
	echo "Setting config..."
#	cp "../config_arch_${_suffix}" .config
 CFGpf(){ cp "../pf.config" 	.config ; }
 CFGpt(){ 
    cp "../64bit.config"	.config 
 #твики от pf :
  ./scripts/kconfig/merge_config.sh -m .config "$srcdir"/pf+.config
 }
 CFGmg(){ 
    cp "../mda9.config"	.config 
 #твики от pf :
  ./scripts/kconfig/merge_config.sh -m .config "$srcdir"/pf+.config
 }
 MONOy(){ ./scripts/kconfig/merge_config.sh .config "$srcdir"/pt-y.config ;  }
 MONOm(){ ./scripts/kconfig/merge_config.sh .config "$srcdir"/pt-m.config ;  }
 # FS монолитные  :
 FSm() { ./scripts/kconfig/merge_config.sh -m .config "$srcdir"/fs-m.config ; }
 # FS.ko
 FSy() { ./scripts/kconfig/merge_config.sh -m .config "$srcdir"/fs-y.config ; }
 OPTp(){ ./scripts/kconfig/merge_config.sh .config "$srcdir"/opt-perf.config ; }
 OPTs(){ ./scripts/kconfig/merge_config.sh .config "$srcdir"/opt-size.config ; }

 PfBigMg()	{ CFGmg; MONOm ; FSm ; OPTp ; }
 PfBig()	{ CFGpf; MONOm ; FSm ; OPTp ; }
 PfBigMono()	{ CFGpf; MONOy ; MONOm ; FSy ; OPTp ; }
 Pt()		{ CFGpt; FSy ; OPTs ; }
 Pt()		{ CFGpt; FSy ; OPTp ; }

CFG(){
 ############# CFG ######################### 
 #ln -sf исходный конфиг config_arch_generic
# https://build.opensuse.org/package/show/home:post-factum:kernels/linux-pf-generic
#MONOx # Большой конфиг -> в монолитный (без модулей.ko в initrd), как в porteus. Для puppy, porteus не надо
 #PfBigMono
 #PfBigMg
# Pt
 PfBigMg
 LF
 NUMA # 1 CPU (no multi CPU)


 #    echo "CONFIG_KSM=y"  >> .config
  # get kernel version
	make olddefconfig
	#make menuconfig
	msg "OldConfig end"

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

#  make -s kernelrelease > version
  echo "${_basekernel}.0-${_kernelname}${_pfrel}${_name}" > version
}
CFG
  echo "Prepared $pkgbase version $(<version)"
	__nthreads=$(($(nproc) + 1))
#	__nthreads=$(($(nproc)*2 + 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/-${_suffix2}//g")
	eval "package_${_i}-${_suffix2}() {
		$(declare -f "_package${_i#${_basename}}")
		_package${_i#${_basename}}
	}"
done

