#!/bin/sh
#
# nvidia-kernel.SlackBuild
# 2024-05-10
#

PRGNAM=nvidia-kernel
VERSION=390.157

# automatically determine the architecture
if [ -z "$ARCH" ]; then
  case "$(uname -m)" in
    i686) ARCH=i686 ;;
    x86_64) ARCH=x86_64 ;;
       *) exit 1
  esac
fi

BUILD=${BUILD:-1}
TAG=${TAG:-scr}
PKGTYPE=${PKGTYPE:-txz}

KERNEL=${KERNEL:-$(uname -r)}

HOMEPAGE="https://www.nvidia.com/object/unix.html"
if [ "$ARCH" = "i686" ]; then
  SOURCE="NVIDIA-Linux-x86-${VERSION}.run"
  DOWNLOAD="https://us.download.nvidia.com/XFree86/Linux-x86/${VERSION}/${SOURCE}"
  MD5SUM="0975ee17f9c690555dfb2a342a0138b8"
 elif [ "$ARCH" = "x86_64" ]; then
  SOURCE="NVIDIA-Linux-x86_64-${VERSION}.run"
  DOWNLOAD="https://us.download.nvidia.com/XFree86/Linux-x86_64/${VERSION}/${SOURCE}"
  MD5SUM="d564c4a0f57eb7715a5f11ed8da17b6c"
fi

REQUIRES=""

MAINTAINER="Gernot Walzl"
EMAIL="gernot.walzl@gmx.at"

DESC="nvidia-kernel (kernel interface for the NVIDIA driver)

${HOMEPAGE}"

DOCS="$(pwd)/$0"

# EOF info


# set initial variables
CWD=$(pwd)
TMP=${TMP:-/tmp}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

# exit on error
set -e

# download the source if needed
if [ ! -f $CWD/$SOURCE ]; then
  wget -O $CWD/$SOURCE $DOWNLOAD || exit 1
fi

# check for correct source file
if [ "$(md5sum $CWD/$SOURCE | cut -f 1 -d ' ')" != "$MD5SUM" ]; then
  exit 1
fi

# extract the application source
cd $TMP || exit 1
sh $CWD/$SOURCE --extract-only || exit 1

# change to the application source directory
if [ "$ARCH" = "i686" ]; then
  APPDIR=NVIDIA-Linux-x86-${VERSION}
 elif [ "$ARCH" = "x86_64" ]; then
  APPDIR=NVIDIA-Linux-x86_64-${VERSION}
fi
cd $APPDIR || exit 1

# fix permissions
chown -R root:root .
chmod -R u+w,go+r-w,a-s .

# compile
cd kernel || exit 1
make SYSSRC=/lib/modules/${KERNEL}/build module

# install everything into the package directory
rm -rf $PKG
mkdir -p $PKG/install
mkdir -p $PKG/lib/modules/$KERNEL/kernel/drivers/video
install -m 0664 \
  nvidia.ko \
  nvidia-uvm.ko \
  nvidia-modeset.ko \
  nvidia-drm.ko \
  $PKG/lib/modules/$KERNEL/kernel/drivers/video/
cd $TMP/$APPDIR

# add documentation
if [ "$DOCS" != "" ]; then
  mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
  cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION
  find $PKG/usr/doc/$PRGNAM-$VERSION -type f -exec chmod 644 {} \;
fi

# add some description to the package
if [ "$DESC" != "" ]; then
  echo "$DESC" | sed 's/^/'$PRGNAM': /g' > $PKG/install/slack-desc
fi

# append dependency information to the package
if [ "$REQUIRES" != "" ]; then
  for REQ in $REQUIRES; do
    echo "$REQ" >> $PKG/install/slack-required
  done
fi

# doinst.sh
cat > $PKG/install/doinst.sh <<EOF
#!/bin/sh
/sbin/depmod -a ${KERNEL}
EOF

# build the package
cd $PKG
PKGVERSION=$(echo ${VERSION}_${KERNEL} | tr - _)
makepkg -l y -c n \
  $OUTPUT/$PRGNAM-$PKGVERSION-$ARCH-$BUILD$TAG.$PKGTYPE \
  || exit 1

# make everything clean
cd $CWD
rm -rf $PKG
rm -rf $TMP/$APPDIR
