# Amlogic
# Original Creator: Oleg Ivanov (150balbes) <balbes-150@yandex.ru>
# Contributor: Spikerguy <shareahack@hotmail.com>
# Maintainer: Dan Johansen <strit@manjaro.org>
# add aufs support 04.03.2021
_name="-au"
pkgbase=linux${_name}
#_commit=72a37a0c7cc4329b1e2b9f43968cf58bfc6eba76
_commit=0c88ca495f8248ca6d69ac9046eaf1fddf90caa9
_srcname=linux-arm-${_commit}
_kernelname=${pkgbase#linux}
_desc="AUFS UKSM Kernel for Khadas Vim Devices"

_major=5.10
#_minor=6
#_lucjanpath="https://raw.githubusercontent.com/sirlucjan/kernel-patches/master/${_major}"
_lucjanpath="https://gitlab.com/sirlucjan/kernel-patches/raw/master/${_major}"
_uksm_path="uksm-patches-v2"
#_uksm_path="https://raw.githubusercontent.com/dolohow/uksm/master/v5.x"
#_uksm_path="https://raw.githubusercontent.com/zaza42/uksm/master"
_uksm_patch="0001-UKSM-for-${_major}.patch"
#https://gitlab.com/sirlucjan/kernel-patches/-/blob/master/5.10/uksm-patches/0001-UKSM-for-5.10.patch
#_gcc_path="cpu-patches-v2-sep"
#_gcc_patch="0001-cpu-${_major}-merge-graysky-s-patchset.patch"

pkgver=${_major}.9
pkgrel=1
aufsver=${_major}
arch=('aarch64')
url="https://github.com/150balbes/linux-arm/tree/master"
license=('GPL2')
makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc' 'git')
options=('!strip')
source=("https://github.com/150balbes/linux-arm/archive/${_commit}.tar.gz"
        'config'
        'linux.preset'
        '60-linux.hook'
        '90-linux.hook'
        '0001-bootsplash.patch'
        '0002-bootsplash.patch'
        '0003-bootsplash.patch'
        '0004-bootsplash.patch'
        '0005-bootsplash.patch'
        '0006-bootsplash.patch'
        '0007-bootsplash.patch'
        '0008-bootsplash.patch'
        '0009-bootsplash.patch'
        '0010-bootsplash.patch'
        '0011-bootsplash.patch'
        '0012-bootsplash.patch'
        'add-beelink-device-and-vim3l.patch'
        's912-dmip-mhz.patch'
        'add-sm1-support.patch'
        'add-ugoos-device.patch'
        'fix-g12-hdmi.patch'
        "https://github.com/sfjro/aufs5-standalone/archive/aufs${aufsver}.zip"
        "${_lucjanpath}/${_uksm_path}/${_uksm_patch}"
        )
md5sums=('SKIP'
         '73f2d4bf50405e46172de39420d03c8b'
         'fbb7f2695efe0c83265cad1c5e6f0a81'
         'ce6c81ad1ad1f8b333fd6077d47abdaf'
         '3dc88030a8f2f5a5f97266d99b149f77'
         'f13cfcd8a4667ecca68bccefee4b8283'
         'b4acd66a564af83b5409738c40b4a566'
         'a6407dceae1838f5aa27450401a91be6'
         'cb78b1c11b917a4d31c4b1567183b76f'
         '3efea575da7f02ba94789d3b6b81e11f'
         '2529ad13791b259d80c9d5d702187a65'
         'efd2367798cc4eab0e15fc0ae44fb003'
         '50255aac36e002afa477e4527a0550af'
         '6b6def41b404422dc04b39e2f1adffc8'
         '1922e3a7727d2bf51641b98d6d354738'
         'd6b7e4e43e42128cf950251e0d0aee23'
         'ecfd8a30c480149005fcf349e4d06f4b'
         'ae4ca58ddc4cc3636835ab24c8457fa3'
         'c6ba2bccc888857a6d31c86c2a91d75d'
         '6d9a93939c87b0bb0a717382524de98f'
         '1b92d7617e60d3c525a4b18ab4351185'
         'SKIP'
         '9de59c2ec5279c1eb6e0751fe66a9e2c'
         'SKIP'
         )

prepare() {
    # aufs install
    echo "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}
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/aufs5-kbuild.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/aufs5-base.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/aufs5-mmap.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/aufs5-standalone.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/aufs5-loopback.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/lockdep-debug.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/tmpfs-idr.patch"
    patch -Np1 -i "${srcdir}/aufs5-standalone-aufs${aufsver}/vfs-ino.patch"
    popd

        patch -Np1 < "../${_uksm_patch}"

    #sed -i s/'EXTRAVERSION = -rc7'/'EXTRAVERSION ='/ "${_srcname}"/Makefile
    cd "${srcdir}/${_srcname}"

    # add upstream patch
    #patch -Np1 -i "${srcdir}/patch-${pkgver}"

    # Manjaro-ARM patches
    # Bootsplash patches

    cat "${srcdir}/config" > ./.config
    echo "CONFIG_UKSM=y"  >> ./.config
    sed 's/CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION='${_name}'/' ./.config
    
    # add pkgrel to extraversion
    sed -ri "s|^(EXTRAVERSION =)(.*)|\1 \2-${pkgrel}|" Makefile

    # don't run depmod on 'make install'. We'll do this ourselves in packaging
    sed -i '2iexit 0' scripts/depmod.sh
  

    # Bootsplash patches
    #  patch -Np1 -i "${srcdir}/0001-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0002-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0003-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0004-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0005-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0006-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0007-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0008-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0009-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0010-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0011-bootsplash.patch"
    # patch -Np1 -i "${srcdir}/0012-bootsplash.patch"

 # Add Beelink Device Support patches
    patch -Np1 -i "${srcdir}/s912-dmip-mhz.patch"
    patch -Np1 -i "${srcdir}/add-beelink-device-and-vim3l.patch"
#    patch -Np1 -i "${srcdir}/add-sm1-support.patch"
#    patch -Np1 -i "${srcdir}/add-ugoos-device.patch"
#    patch -Np1 -i "${srcdir}/fix-g12-hdmi.patch"
    #make menuconfig
    #cp ./.config "${srcdir}/config"
}

build() {
  cd "${srcdir}/${_srcname}"

  # get kernel version
  make prepare

  # load configuration
  # Configure the kernel. Replace the line below with one of your choice.
  #make menuconfig # CLI menu for configuration
  #make nconfig # new CLI menu for configuration
  #make xconfig # X-based configuration
  #make oldconfig # using old config from previous kernel version
  # ... or manually edit .config

  # Copy back our configuration (use with new kernel version)
  #cp ./.config /var/tmp/${pkgbase}.config

  ####################
  # stop here
  # this is useful to configure the kernel
  #msg "Stopping build"
  #return 1
  ####################

  #yes "" | make config

  # build!
  unset LDFLAGS
  make ${MAKEFLAGS} Image Image.gz modules
  # Generate device tree blobs with symbols to support applying device tree overlays in U-Boot
  make ${MAKEFLAGS} DTC_FLAGS="-@" dtbs
}

_package() {
  pkgdesc="The Linux Kernel and modules - ${_desc}"
  depends=('coreutils' 'kmod' 'mkinitcpio>=0.7' 'fbset' 'uboot-tools')
  optdepends=('crda: to set the correct wireless channels of your country')
  provides=('kernel26' "linux=${pkgver}")
  conflicts=('linux')
  backup=("etc/mkinitcpio.d/${pkgbase}.preset")
  install=${pkgname}.install

  cd "${srcdir}/${_srcname}"

  KARCH=arm64

  # get kernel version
  #_kernver="$pkgver-$pkgrel-MANJARO-ARM"
  _kernver="$(make kernelrelease)"
  _basekernel=${_kernver%%-*}
  _basekernel=${_basekernel%.*}

  mkdir -p "${pkgdir}"/{boot,usr/lib/modules}
  make INSTALL_MOD_PATH="${pkgdir}/usr" modules_install
  make INSTALL_DTBS_PATH="${pkgdir}/boot/dtbs" dtbs_install
  cp arch/$KARCH/boot/Image{,.gz} "${pkgdir}/boot"

   # make room for external modules
  local _extramodules="extramodules-${_basekernel}${_kernelname}"
  ln -s "../${_extramodules}" "${pkgdir}/usr/lib/modules/${_kernver}/extramodules"

  # add real version for building modules and running depmod from hook
  echo "${_kernver}" |
    install -Dm644 /dev/stdin "${pkgdir}/usr/lib/modules/${_extramodules}/version"

  # remove build and source links
  rm "${pkgdir}"/usr/lib/modules/${_kernver}/{source,build}

  # now we call depmod...
  depmod -b "${pkgdir}/usr" -F System.map "${_kernver}"

  # sed expression for following substitutions
  local _subst="
    s|%PKGBASE%|${pkgbase}|g
    s|%KERNVER%|${_kernver}|g
    s|%EXTRAMODULES%|${_extramodules}|g
  "

  # install mkinitcpio preset file
  sed "${_subst}" ../linux.preset |
    install -Dm644 /dev/stdin "${pkgdir}/etc/mkinitcpio.d/${pkgbase}.preset"

  # install pacman hooks
  sed "${_subst}" ../60-linux.hook |
    install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/60-${pkgbase}.hook"
  sed "${_subst}" ../90-linux.hook |
    install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/90-${pkgbase}.hook"

}

_package-headers() {
  pkgdesc="Header files and scripts for building modules for linux kernel - ${_desc}"
  provides=("linux-headers=${pkgver}")
  conflicts=('linux-headers')
  cd ${_srcname}
  local _builddir="${pkgdir}/usr/lib/modules/${_kernver}/build"

  install -Dt "${_builddir}" -m644 Makefile .config Module.symvers
  install -Dt "${_builddir}/kernel" -m644 kernel/Makefile

  mkdir "${_builddir}/.tmp_versions"

  cp -t "${_builddir}" -a include scripts

  install -Dt "${_builddir}/arch/${KARCH}" -m644 arch/${KARCH}/Makefile
  install -Dt "${_builddir}/arch/${KARCH}/kernel" -m644 arch/${KARCH}/kernel/asm-offsets.s 
  #arch/$KARCH/kernel/module.lds

  cp -t "${_builddir}/arch/${KARCH}" -a arch/${KARCH}/include

  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

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

  # copy in Kconfig files
  find . -name Kconfig\* -exec install -Dm644 {} "${_builddir}/{}" \;

  # remove unneeded architectures
  local _arch
  for _arch in "${_builddir}"/arch/*/; do
    [[ ${_arch} == */${KARCH}/ ]] && continue
    rm -r "${_arch}"
  done

  # remove files already in linux-docs package
  rm -r "${_builddir}/Documentation"

  # remove now broken symlinks
  find -L "${_builddir}" -type l -printf 'Removing %P\n' -delete

  # Fix permissions
  chmod -R u=rwX,go=rX "${_builddir}"

  # strip scripts directory
  local _binary _strip
  while read -rd '' _binary; do
    case "$(file -bi "${_binary}")" in
      *application/x-sharedlib*)  _strip="${STRIP_SHARED}"   ;; # Libraries (.so)
      *application/x-archive*)    _strip="${STRIP_STATIC}"   ;; # Libraries (.a)
      *application/x-executable*) _strip="${STRIP_BINARIES}" ;; # Binaries
      *) continue ;;
    esac
    /usr/bin/strip ${_strip} "${_binary}"
  done < <(find "${_builddir}/scripts" -type f -perm -u+w -print0 2>/dev/null)
}

pkgname=("${pkgbase}" "${pkgbase}-headers")
for _p in ${pkgname[@]}; do
  eval "package_${_p}() {
    _package${_p#${pkgbase}}
  }"
done
 

