# The LTS kernel includes the nvidia, virtualbox and broadcom drivers
#

## Variables initialisation
#
url="http://www.kernel.org"
description="The long term stable kernel version"
packager="pierre at nutyx dot org, tnut at nutyx dot org"

PKGMK_IGNORE_UNPACK="yes"
PKGMK_NO_STRIP="yes"
PKGMK_GROUPS=(devel doc)

name=kernel-lts
alias=(linux-lts)

version=4.4.48
_version=${version:0:3}

release=1

# Virtualbox
vb_version=5.1.6
buildrelease=110634
[ "`uname -m`" == "i686"   ] && _VBARCH=x86
[ "`uname -m`" == "x86_64"   ] && _VBARCH=amd64

# nvidia
nv_version=361.42
[ "$PKGMK_ARCH" == "i686"   ] && _NVARCH=x86
[ "$PKGMK_ARCH" == "x86_64"   ] && _NVARCH=x86_64


# Broadcom
wl_version=6.30.223.271
[ "`uname -m`" == "x86_64" ] && _wlarch=_64

## Download all the sources
#

source=(\
http://www.kernel.org/pub/linux/kernel/v4.x/linux-${_version}.tar.xz
https://www.kernel.org/pub/linux/kernel/v4.x/patch-$version.xz
http://download.virtualbox.org/virtualbox/${vb_version}/VirtualBox-${vb_version}-${buildrelease}-Linux_${_VBARCH}.run
http://download.nvidia.com/XFree86/Linux-${_NVARCH}/${nv_version}/NVIDIA-Linux-${_NVARCH}-${nv_version}.run
http://www.broadcom.com/docs/linux_sta/hybrid-v35${_wlarch}-nodebug-pcoem-${wl_version//./_}.tar.gz
broadcom-wl.modprobe.d broadcom-wl.license.patch wl_linux.c.patch
$name.config $name.config_64)

## Time to build everything
#

build(){

bsdtar -p -o -C $SRC -xf linux-${_version}.tar.xz

cd linux-${_version}

if [ -f $SRC/patch-$version.xz ]; then
	xz -d -c  $SRC/patch-$version.xz | patch -Np1
fi

make mrproper
case `uname -m` in
	x86_64)
		cp $SRC/kernel-lts.config_64 ./.config;;
	i?86)
		cp $SRC/kernel-lts.config ./.config;
esac

# make menuconfig

make

case `uname -m` in
        x86_64)
		cp .config $SRC/$name.config_64;;
        i?86)
		cp .config $SRC/$name.config;;
esac

## Modules
#
# Kernel modules
cd $SRC/linux-${_version}
make INSTALL_MOD_PATH=$PKG modules_install

KERNEL_VERSION="${version}-NuTyX-lts"

# Module broadcom is broken on 32 bits machine
if [ "$PKGMK_ARCH" == "x86_64" ]; then
  cd $SRC
  bsdtar xf hybrid-v35${_wlarch}-nodebug-pcoem-${wl_version//./_}.tar.gz
  patch -p1 -i broadcom-wl.license.patch
  patch -p1 -i wl_linux.c.patch

  sed -e "/BRCM_WLAN_IFNAME/s:eth:wlan:" \
	-i src/wl/sys/wl_linux.c
  BUILD_NOPEDANTIC=1 make -C $SRC/linux-${_version} M=`pwd`
  install -m 0644 -D wl.ko $PKG/lib/modules/${KERNEL_VERSION}/kernel/drivers/zzzz/wl.ko
  install -Dm644 broadcom-wl.modprobe.d $PKG/etc/modprobe.d/broadcom-wl.conf
fi

# Module nvidia
cd $SRC
sh NVIDIA-Linux-${_NVARCH}-${nv_version}.run --extract-only
cd NVIDIA-Linux-${_NVARCH}-${nv_version}/kernel
SYSSRC=$SRC/linux-${_version} make module
for MODULE in nvidia.ko nvidia-modeset.ko
do
	install -m 0644 -D $MODULE \
	$PKG/lib/modules/${KERNEL_VERSION}/kernel/drivers/zzzz/$MODULE
done
if [ "${_ARCH}" == "x86_64" ]; then
	install -m 0644 -D nvidia-uvm.ko \
	$PKG/lib/modules/${KERNEL_VERSION}/kernel/drivers/zzzz/nvidia-uvm.ko
fi

# Module virtualbox
cd $SRC
sh VirtualBox-${vb_version}-${buildrelease}-Linux_${_VBARCH}.run --target vb --keep --noexec
cd vb
tar xfj VirtualBox.tar.bz2
cd src/vboxhost/
KERNELRELEASE=${version}
KERN_DIR=$SRC/linux-${_version} make

for i in *.ko
do
	install -D -m0644 $i \
	$PKG/lib/modules/${KERNEL_VERSION}/kernel/drivers/zzzz/$i
done

# depmod needed
depmod -b $PKG -a ${KERNEL_VERSION}

# Install config and kernel files
cd $SRC/linux-${_version}

mkdir -p $PKG/boot
case `uname -m` in
        x86_64)
                cp  System.map \
                $PKG/boot/System_64.map-$version
                cp  .config    \
                $PKG/boot/config_64-$version
                cp  arch/x86_64/boot/bzImage \
                $PKG/boot/kernel-$version ;;
        i?86)
                cp  System.map \
                $PKG/boot/System.map-$version
                cp  .config \
                $PKG/boot/config-$version
                cp  arch/i386/boot/bzImage \
                $PKG/boot/kernel-$version ;;
esac

# Reorgenise the sources
cd $PKG/lib/modules/${KERNEL_VERSION}/

mkdir -p $PKG/usr/src

mv $SRC/linux-${_version} $PKG/usr/src/
rm {build,source}

ln -sv /usr/src/linux-${_version} build
ln -sv /usr/src/linux-${_version} source

mkdir $SRC/linux-${_version}
mv $PKG/usr/src/linux-${_version}/Documentation \
$SRC/linux-${_version}

# Firmware are in linux-firmware
rm -rf $PKG/lib/firmware

# post-install autogen
echo "mkinitramfs ${KERNEL_VERSION}" > $PKGMK_ROOT/$name.post-install
echo "[ -f boot/initrd ] && rm boot/initrd" >> $PKGMK_ROOT/$name.post-install
echo "ln -sf initrd-${KERNEL_VERSION} boot/initrd" >> $PKGMK_ROOT/$name.post-install
echo "ln -sf kernel-$version boot/kernel" >> $PKGMK_ROOT/$name.post-install

# pre-install autogen
cd $SRC
if [ -f aaabasicfs-${AAABASICFS}.tar.xz ]; then
 bsdtar -p -o -C $SRC -xf aaabasicfs-${AAABASICFS}.tar.xz
 echo ". lib/lsb/init-functions" >  $PKGMK_ROOT/$name.pre-install
 for FILE in `tar --list --file aaabasicfs-${AAABASICFS}.tar.xz|grep -v /$`
 do
   echo "log_info_msg \"update $FILE\"" >> $PKGMK_ROOT/$name.pre-install
   echo "cat  > $FILE << \"END_OF_FILE\"" >> $PKGMK_ROOT/$name.pre-install
   cat $SRC/$FILE >> $PKGMK_ROOT/$name.pre-install
   echo "END_OF_FILE" >> $PKGMK_ROOT/$name.pre-install
   echo "evaluate_retval" >> $PKGMK_ROOT/$name.pre-install
 done
fi
}
devel() {

cd $PKG
rm -r usr/src/linux-${_version}/{tools,ipc,init,drivers,firmware,fs,mm,samples,security,sound,virt}
for i in alpha arc arm arm26 arm64 avr32 blackfin c6x \
cris frv h8300 hexagon ia64 m32r m68k m68knommu metag \
mips microblaze mn10300 openrisc parisc powerpc ppc s390 \
score sh sh64 sparc sparc64 tile unicore32 um v850 xtensa
do rm -rf usr/src/linux-${_version}/arch/$i
done

bsdtar -cf \
$PKGMK_PACKAGE_DIR/$name.devel${PKGMK_BUILDVER}any.${PKGMK_PACKAGE_EXT} \
usr/src/linux-${_version}

rm -r usr
}

doc() {

cd $PKG
mkdir -p usr/share/doc
mv $SRC/linux-${_version}/Documentation \
usr/share/doc/linux-$version

bsdtar -cf \
$PKGMK_PACKAGE_DIR/$name.doc${PKGMK_BUILDVER}any.${PKGMK_PACKAGE_EXT} \
usr/share/doc/linux-$version

rm -r usr
}
