# Maintainer: sfs <sfslinux@gmail.com>

_kernelname=aufs
pkgbase=linux-${_kernelname}
pkgname=(
    'linux-aufs' 
    'linux-aufs-headers'
)
pkgver=6.19.4
pkgrel=3
arch=('x86_64')
url="https://github.com/sfjro/aufs-linux"
license=('GPL2')
makedepends=(
  bc
  cpio
  gettext
  libelf
#  pahole
  perl
  python
  rust
  rust-bindgen
  rust-src
  tar
  xz
  zstd
)

options=('!strip')
##_srcname=linux-${_stable}
##_major=6.19
##_aufsver=aufs6.19
#_minor=3
#_minor=".3"
#_minorc=$((_minor+1))
#_rcver=rc8
##pkgver=${_major}${_minor}
##_stable=${_major}${_minor}
#_stable=${_major}
#_stablerc=${_major}-${_rcver}
##_srcname=linux-${_stable}
_srcname=linux-${pkgver} #.$pkgrel

source=(
#    "https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/${_srcname}.tar.xz"
#    "https://github.com/sfjro/aufs-linux/archive/refs/heads/aufs${pkgver}.zip"
    "https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/${_srcname}.tar.xz"
    "https://gitlab.com/sirlucjan/kernel-patches/-/raw/master/6.19/aufs-patches/0001-aufs-6.19-merge-v20260223.patch"

    "config"
#  "git+https://github.com.git#branch=aufs6.19"
)
sha256sums=(
    'SKIP' 
    'SKIP' 
    )

prepare() {
  cd ${_srcname} #aufs-linux-aufs$pkgver
    echo "Setting version..."
    echo "-$pkgrel" > localversion.10-pkgrel
    echo "${pkgbase#linux}" > localversion.20-pkgname

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

AUFS(){
  echo "Интеграция исходного кода AUFS..."
_aufsdir="${srcdir}/aufs-standalone-${_aufsver}"
#  cp -r ../aufs-standalone/fs ./
#  cp -r ../aufs-standalone/include/uapi/linux/aufs_type.h ./include/uapi/linux/
  cp -r ${_aufsdir}/fs ./
  cp -r ${_aufsdir}/include/uapi/linux/aufs_type.h ./include/uapi/linux/
  
  echo "Применение патчей AUFS..."
  # Патчи из aufs-standalone подготавливают kbuild и базовые функции ядра
#  patch -Np1 -i ../aufs-standalone/aufs6-base.patch
#  patch -Np1 -i ../aufs-standalone/aufs6-mmap.patch
#  patch -Np1 -i ../aufs-standalone/aufs6-kbuild.patch
#  patch -Np1 -i ../aufs-standalone/aufs6-standalone.patch

patch -Np1 -i "${_aufsdir}/aufs6-base.patch"
patch -Np1 -i "${_aufsdir}/aufs6-mmap.patch"
patch -Np1 -i "${_aufsdir}/aufs6-loopback.patch"
patch -Np1 -i "${_aufsdir}/vfs-ino.patch"
patch -Np1 -i "${_aufsdir}/tmpfs-idr.patch"
#patch -Np1 -i "${_aufsdir}/aufs6-kbuild.patch"
patch -Np1 -i "${_aufsdir}/aufs6-standalone.patch"

echo "Модификация Kbuild файлов через sed..."
  
  # 1. Вставляем source "fs/aufs/Kconfig" в fs/Kconfig перед последним endif
  # Ищем блок MISC_FILESYSTEMS и вставляем перед завершающим endif этого блока
  sed -i '/vboxsf\/Kconfig/a source "fs/aufs/Kconfig"' fs/Kconfig

  # 2. Добавляем aufs в конец fs/Makefile
  # Используем echo, так как нам просто нужно дописать строку в конец файла
  if ! grep -q "CONFIG_AUFS_FS" fs/Makefile; then
    echo 'obj-$(CONFIG_AUFS_FS) += aufs/' >> fs/Makefile
  fi
}
  msg2 "Подготовка .config..."
  cp ../config .config
  
  scripts/config --enable CONFIG_EROFS_FS
  scripts/config --enable CONFIG_KSM

BTF(){
#Для обычного пользователя:
#- Firefox
#- Steam
#- QEMU
#- Docker (без eBPF фич)
# BTF вообще не требуется.

  # BTF для vmlinux
  scripts/config --enable CONFIG_DEBUG_INFO_BTF
  # BTF для модулей (.ko)
  scripts/config --enable CONFIG_DEBUG_INFO_BTF_MODULES
  # Возможности pahole (обычно auto, но можно явно)
  scripts/config --enable CONFIG_PAHOLE_HAS_SPLIT_BTF
  scripts/config --enable CONFIG_PAHOLE_HAS_LANG_EXCLUDE

  scripts/config --disable CONFIG_DEBUG_INFO_NONE
  # Включаем обычный debug info (обязательно для BTF)
  scripts/config --enable CONFIG_DEBUG_INFO
  scripts/config --enable CONFIG_DEBUG_INFO_DWARF5   # лучше современный вариант
  scripts/config --enable CONFIG_DEBUG_INFO_BTF_MODULES
}
NOBTF(){
# Полностью отключаем debug info (уменьшает размер и время сборки)
scripts/config --disable CONFIG_DEBUG_INFO
scripts/config --disable CONFIG_DEBUG_INFO_BTF
scripts/config --disable CONFIG_DEBUG_INFO_BTF_MODULES
scripts/config --enable  CONFIG_DEBUG_INFO_NONE
}
NOBTF
  # Local version (добавится к версии ядра)
#  scripts/config --set-str CONFIG_LOCALVERSION "-${_kernelname}"
  scripts/config --set-str CONFIG_LOCALVERSION ""
  scripts/config --set-str CONFIG_DEFAULT_HOSTNAME "${_kernelname}"

  scripts/config -d MODULE_COMPRESS
  scripts/config -d MODULE_COMPRESS_ZSTD
  scripts/config -d MODULE_COMPRESS_XZ
  scripts/config -d MODULE_COMPRESS_GZIP

TUN(){
  # Включение AUFS и необходимых опций
  scripts/config --enable CONFIG_AUFS_FS
#  scripts/config --enable CONFIG_AUFS_BRANCH_MAX_127
  scripts/config --enable CONFIG_AUFS_SBILIST # полезно для отладки

########################################################################
# Desktop tuning adjustments (latency / responsiveness / IO behavior)
########################################################################
# 1. Transparent Huge Pages → madvise вместо always
#
# ALWAYS может давать latency spikes и фрагментацию.
# MADVISE = приложения сами решают (лучше для desktop + gaming).
scripts/config --disable CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS
scripts/config --enable  CONFIG_TRANSPARENT_HUGEPAGE_MADVISE

# 2. PSI (Pressure Stall Information)
# Позволяет системе видеть memory/CPU pressure.
# Используется systemd-oomd и помогает избежать фризов.
# Практически без overhead.
scripts/config --enable CONFIG_PSI
scripts/config --disable CONFIG_PSI_DEFAULT_DISABLED

# 3. BFQ IO Scheduler
# Лучший выбор для desktop:
# - лучше интерактивность
# - стабильнее frame pacing
# - хорошо работает с NVMe и HDD
scripts/config --enable CONFIG_IOSCHED_BFQ
scripts/config --disable CONFIG_MQ_IOSCHED_DEADLINE
scripts/config --disable CONFIG_MQ_IOSCHED_KYBER

# 4. TCP BBR как default
# Современный congestion control.
# Лучше latency и throughput, чем cubic.
scripts/config -m CONFIG_TCP_CONG_BBR
scripts/config --set-str CONFIG_DEFAULT_TCP_CONG "bbr"
scripts/config --disable CONFIG_DEFAULT_CUBIC

# 5. UCLAMP (utilization clamping)
# Улучшает поведение schedutil.
# Помогает foreground задачам быстрее буститься.
# Полезно для современных CPU (Intel/AMD).
scripts/config --enable CONFIG_UCLAMP_TASK

# 6. Опционально: включить IO_URING
# Сейчас у тебя отключен.
# Даёт прирост в современных приложениях и играх.
# Почти нет downside.
#
scripts/config --enable CONFIG_IO_URING

# 7. Опционально: включить RSEQ
# Используется glibc, улучшает производительность многопоточных приложений.
scripts/config --enable CONFIG_RSEQ

# 8. Опционально: включить SCHED_CORE
# Полезно только если хочешь SMT isolation.
# Можно оставить выключенным если не нужен.
# scripts/config --enable CONFIG_SCHED_CORE

# Лучше latency в scheduler
scripts/config --enable CONFIG_SCHED_AUTOGROUP
# Улучшение wakeup latency
scripts/config --enable CONFIG_SCHED_CORE

# Современная система управления памятью
scripts/config --enable CONFIG_LRU_GEN
scripts/config --enable CONFIG_LRU_GEN_ENABLED

# ❗ 4. UCLAMP без CONFIG_CPU_FREQ_GOV_SCHEDUTIL
#Если у тебя schedutil выключен — UCLAMP почти бесполезен.
scripts/config --enable CONFIG_CPU_FREQ
scripts/config --enable CONFIG_CPU_FREQ_GOV_SCHEDUTIL
scripts/config --set-str CONFIG_CPU_FREQ_DEFAULT_GOVERNOR "schedutil"
############################################################

# ❗ 3. BFQ — ты выключаешь deadline и kyber
#Это неправильно.
#BFQ не должен заменять их полностью.  
#Пусть будут доступны, просто сделай BFQ default:
scripts/config --enable CONFIG_IOSCHED_BFQ
scripts/config --enable CONFIG_MQ_IOSCHED_DEADLINE
scripts/config --enable CONFIG_MQ_IOSCHED_KYBER
scripts/config --set-str CONFIG_DEFAULT_IOSCHED "bfq"
}
TUN
  # Обновление конфига под новую версию ядра
  make olddefconfig
      ### Prepared version
    make -s kernelrelease > version
    echo "Prepared $pkgbase version $(<version)"
}

build() {
#  cd aufs-linux-aufs$pkgver
  cd ${_srcname} #aufs-linux-aufs$pkgver
  make all
  # required when DEBUG_INFO_BTF_MODULES is enabled
##  [ "`grep DEBUG_INFO_BTF_MODULES .config`" ] &&   make -C tools/bpf/bpftool vmlinux.h feature-clang-bpf-co-re=1
}

package_linux-aufs() {
    pkgdesc="The $pkgdesc kernel and modules"
    depends=('coreutils' 'kmod' 'initramfs')
    optdepends=('wireless-regdb: to set the correct wireless channels of your country'
                'linux-firmware: firmware images needed for some devices'
                'modprobed-db: Keeps track of EVERY kernel module that has ever been probed - useful for those of us who make localmodconfig'
                'scx-scheds: to use sched-ext schedulers')
    provides=(VIRTUALBOX-GUEST-MODULES WIREGUARD-MODULE KSMBD-MODULE V4L2LOOPBACK-MODULE NTSYNC-MODULE VHBA-MODULE ADIOS-MODULE)
    # Replace LTO kernel with the default kernel
#    cd aufs-linux-aufs$pkgver
  cd ${_srcname} #aufs-linux-aufs$pkgver

    local modulesdir="$pkgdir/usr/lib/modules/$(<version)"

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

    echo "Installing modules..."
    ZSTD_CLEVEL=19 make "${BUILD_FLAGS[@]}" INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 \
        DEPMOD=/doesnt/exist  modules_install  # Suppress depmod

    # remove build links
    rm "$modulesdir"/build
}

package_linux-aufs-headers() {
   cd ${_srcname} #aufs-linux-aufs$pkgver
# cd aufs-linux-aufs$pkgver
  pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel"
  depends=(pahole)

  local builddir="$pkgdir/usr/lib/modules/$(<version)/build"

  echo "Installing build files..."
  install -Dt "$builddir" -m644 .config Makefile Module.symvers System.map \
    localversion.* version vmlinux 
  [ "`grep DEBUG_INFO_BTF_MODULES .config`" ] && install -Dt "$builddir" -m644     tools/bpf/bpftool/vmlinux.h
  install -Dt "$builddir/kernel" -m644 kernel/Makefile
  install -Dt "$builddir/arch/x86" -m644 arch/x86/Makefile
  cp -t "$builddir" -a scripts
  ln -srt "$builddir" "$builddir/scripts/gdb/vmlinux-gdb.py"

  # required when STACK_VALIDATION is enabled
  install -Dt "$builddir/tools/objtool" tools/objtool/objtool

  # required when DEBUG_INFO_BTF_MODULES is enabled
  [ "`grep DEBUG_INFO_BTF_MODULES .config`" ] && install -Dt "$builddir/tools/bpf/resolve_btfids" tools/bpf/resolve_btfids/resolve_btfids

  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

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

  # https://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

  # https://bugs.archlinux.org/task/71392
  install -Dt "$builddir/drivers/iio/common/hid-sensors" -m644 drivers/iio/common/hid-sensors/*.h

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

  echo "Installing Rust files..."
    # Install .rmeta files if they exist
    if compgen -G "rust/*.rmeta" 1>/dev/null; then
        install -Dt "$builddir/rust" -m644 rust/*.rmeta
    fi

    # Install .so files if they exist
    if compgen -G "rust/*.so" 1>/dev/null; then
        install -Dt "$builddir/rust" rust/*.so
    fi

  echo "Installing unstripped VDSO..."
  make INSTALL_MOD_PATH="$pkgdir/usr" vdso_install \
    link=  # Suppress build-id symlinks

  echo "Removing 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 -Sib "$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 "Stripping vmlinux..."
  strip -v $STRIP_STATIC "$builddir/vmlinux"

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

