#!/bin/sh
#
# nvidia-driver.SlackBuild
# 2024-05-10
#
# NVIDIA Accelerated Linux Graphics Driver
#
# The location of the files and the creation of symbolic links has been recorded with:
# slacktrack -p nvidia-390.87-x86_64-1.tgz "./NVIDIA-Linux-x86_64-390.87.run --install-libglvnd --glvnd-glx-client --glvnd-egl-client --accept-license"
#
# This driver overwrites files from the following packages:
# mesa
# xorg-server
# ocl-icd
# libglvnd
#

PRGNAM=nvidia-driver
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}

COMPAT32=${COMPAT32:-yes}
GLVND=${GLVND:-yes}

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="libvdpau nvidia-kernel"

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

DESC="NVIDIA Accelerated Linux Graphics Driver

${HOMEPAGE}"

DOCS="$(pwd)/$0 LICENSE NVIDIA_Changelog README.txt html nvidia-persistenced-init.tar.bz2"

# 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 .

LIBDIRSUFFIX=""
if [ "$ARCH" = "x86_64" ]; then
  LIBDIRSUFFIX="64"
fi

# install everything into the package directory
rm -rf $PKG
mkdir -p $PKG/install
mkdir -p \
  $PKG/etc/OpenCL/vendors \
  $PKG/etc/vulkan/icd.d \
  $PKG/usr/bin \
  $PKG/usr/lib${LIBDIRSUFFIX} \
  $PKG/usr/lib${LIBDIRSUFFIX}/tls \
  $PKG/usr/lib${LIBDIRSUFFIX}/vdpau \
  $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules \
  $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules/drivers \
  $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules/extensions \
  $PKG/usr/man/man1 \
  $PKG/usr/share/X11/xorg.conf.d \
  $PKG/usr/share/applications \
  $PKG/usr/share/egl/egl_external_platform.d \
  $PKG/usr/share/glvnd/egl_vendor.d \
  $PKG/usr/share/nvidia \
  $PKG/usr/share/pixmaps

install -m 0644 \
  nvidia.icd \
  $PKG/etc/OpenCL/vendors/
install -m 0755 \
  nvidia-bug-report.sh \
  nvidia-cuda-mps-control \
  nvidia-cuda-mps-server \
  nvidia-debugdump \
  nvidia-installer \
  nvidia-modprobe \
  nvidia-persistenced \
  nvidia-settings \
  nvidia-smi \
  nvidia-xconfig \
  $PKG/usr/bin/
if [ "$GLVND" = "yes" ]; then
  install -m 0755 \
    libEGL.so.1.1.0 \
    libGL.so.1.7.0 \
    $PKG/usr/lib${LIBDIRSUFFIX}/
else
  install -m 0755 \
    libEGL.so.$VERSION \
    libGL.so.$VERSION \
    $PKG/usr/lib${LIBDIRSUFFIX}/
fi
install -m 0755 \
  libEGL_nvidia.so.$VERSION \
  libGLESv1_CM.so.1.2.0 \
  libGLESv1_CM_nvidia.so.$VERSION \
  libGLESv2.so.2.1.0 \
  libGLESv2_nvidia.so.$VERSION \
  libGLX.so.0 \
  libGLX_nvidia.so.$VERSION \
  libGLdispatch.so.0 \
  libOpenCL.so.1.0.0 \
  libOpenGL.so.0 \
  libcuda.so.$VERSION \
  libnvcuvid.so.$VERSION \
  libnvidia-cfg.so.$VERSION \
  libnvidia-compiler.so.$VERSION \
  libnvidia-egl-wayland.so.1.0.2 \
  libnvidia-eglcore.so.$VERSION \
  libnvidia-encode.so.$VERSION \
  libnvidia-fatbinaryloader.so.$VERSION \
  libnvidia-fbc.so.$VERSION \
  libnvidia-glcore.so.$VERSION \
  libnvidia-glsi.so.$VERSION \
  libnvidia-gtk2.so.$VERSION \
  libnvidia-gtk3.so.$VERSION \
  libnvidia-ifr.so.$VERSION \
  libnvidia-ml.so.$VERSION \
  libnvidia-opencl.so.$VERSION \
  libnvidia-ptxjitcompiler.so.$VERSION \
  libnvidia-tls.so.$VERSION \
  $PKG/usr/lib${LIBDIRSUFFIX}/
install -m 0755 \
  tls/libnvidia-tls.so.$VERSION \
  $PKG/usr/lib${LIBDIRSUFFIX}/tls/
install -m 0755 \
  libvdpau_nvidia.so.$VERSION \
  $PKG/usr/lib${LIBDIRSUFFIX}/vdpau/
install -m 0755 \
  libnvidia-wfb.so.$VERSION \
  $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules/
install -m 0755 \
  nvidia_drv.so \
  $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules/drivers/
install -m 0755 \
  libglx.so.$VERSION \
  $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules/extensions/
install -m 0644 \
  nvidia-cuda-mps-control.1.gz \
  nvidia-installer.1.gz \
  nvidia-modprobe.1.gz \
  nvidia-persistenced.1.gz \
  nvidia-settings.1.gz \
  nvidia-smi.1.gz \
  nvidia-xconfig.1.gz \
  $PKG/usr/man/man1/
install -m 0644 \
  nvidia-drm-outputclass.conf \
  $PKG/usr/share/X11/xorg.conf.d/
install -m 0644 \
  10_nvidia_wayland.json \
  $PKG/usr/share/egl/egl_external_platform.d/
install -m 0644 \
  10_nvidia.json \
  $PKG/usr/share/glvnd/egl_vendor.d/
install -m 0644 \
  nvidia-application-profiles-$VERSION-key-documentation \
  nvidia-application-profiles-$VERSION-rc \
  $PKG/usr/share/nvidia/
install -m 0644 \
  nvidia-settings.png \
  $PKG/usr/share/pixmaps/

sed -e "s#__LIBGL_PATH__#/usr/lib${LIBDIRSUFFIX}#" libGL.la \
  > $PKG/usr/lib${LIBDIRSUFFIX}/libGL.la

sed -e 's#__UTILS_PATH__#/usr/bin#' \
  -e 's#__PIXMAP_PATH__#/usr/share/pixmaps#' \
  nvidia-settings.desktop \
  > $PKG/usr/share/applications/nvidia-settings.desktop

sed -e 's#__NV_VK_ICD__#libGLX_nvidia.so.0#' nvidia_icd.json.template \
  > $PKG/etc/vulkan/icd.d/nvidia_icd.json

( cd $PKG/usr/lib${LIBDIRSUFFIX}
  if [ "$GLVND" = "yes" ]; then
    ln -s libEGL.so.1.1.0 libEGL.so.1
    ln -s libGL.so.1.7.0 libGL.so.1
  else
    ln -s libEGL.so.$VERSION libEGL.so.1
    ln -s libGL.so.$VERSION libGL.so.1
  fi
  ln -s libEGL.so.1 libEGL.so
  ln -s libEGL_nvidia.so.$VERSION libEGL_nvidia.so.0
  ln -s libGL.so.1 libGL.so
  ln -s libGLESv1_CM.so.1.2.0 libGLESv1_CM.so.1
  ln -s libGLESv1_CM.so.1 libGLESv1_CM.so
  ln -s libGLESv1_CM_nvidia.so.$VERSION libGLESv1_CM_nvidia.so.1
  ln -s libGLESv2.so.2.1.0 libGLESv2.so.2
  ln -s libGLESv2.so.2 libGLESv2.so
  ln -s libGLESv2_nvidia.so.$VERSION libGLESv2_nvidia.so.2
  ln -s libGLX.so.0 libGLX.so
  ln -s libGLX_nvidia.so.$VERSION libGLX_indirect.so.0
  ln -s libGLX_nvidia.so.$VERSION libGLX_nvidia.so.0
  ln -s libGLdispatch.so.0 libGLdispatch.so
  ln -s libOpenCL.so.1.0.0 libOpenCL.so.1.0
  ln -s libOpenCL.so.1.0 libOpenCL.so.1
  ln -s libOpenCL.so.1 libOpenCL.so
  ln -s libOpenGL.so.0 libOpenGL.so
  ln -s libcuda.so.$VERSION libcuda.so.1
  ln -s libcuda.so.1 libcuda.so
  ln -s libnvcuvid.so.$VERSION libnvcuvid.so.1
  ln -s libnvcuvid.so.1 libnvcuvid.so
  ln -s libnvidia-cfg.so.$VERSION libnvidia-cfg.so.1
  ln -s libnvidia-cfg.so.1 libnvidia-cfg.so
  ln -s libnvidia-egl-wayland.so.1.0.2 libnvidia-egl-wayland.so.1
  ln -s libnvidia-encode.so.$VERSION libnvidia-encode.so.1
  ln -s libnvidia-encode.so.1 libnvidia-encode.so
  ln -s libnvidia-fbc.so.$VERSION libnvidia-fbc.so.1
  ln -s libnvidia-fbc.so.1 libnvidia-fbc.so
  ln -s libnvidia-ifr.so.$VERSION libnvidia-ifr.so.1
  ln -s libnvidia-ifr.so.1 libnvidia-ifr.so
  ln -s libnvidia-ml.so.$VERSION libnvidia-ml.so.1
  ln -s libnvidia-ml.so.1 libnvidia-ml.so
  ln -s libnvidia-opencl.so.$VERSION libnvidia-opencl.so.1
  ln -s libnvidia-ptxjitcompiler.so.$VERSION libnvidia-ptxjitcompiler.so.1
  ln -s libnvidia-ptxjitcompiler.so.1 libnvidia-ptxjitcompiler.so
  ln -s vdpau/libvdpau_nvidia.so.$VERSION libvdpau_nvidia.so

  # FIX for ldconfig: /usr/lib[64]/lib*.so.0 is not a symboic link
  mv libGLX.so.0 libGLX.so.0.0.0
  mv libGLdispatch.so.0 libGLdispatch.so.0.0.0
  mv libOpenGL.so.0 libOpenGL.so.0.0.0
  ln -s libGLX.so.0.0.0 libGLX.so.0
  ln -s libGLdispatch.so.0.0.0 libGLdispatch.so.0
  ln -s libOpenGL.so.0.0.0 libOpenGL.so.0
)
( cd $PKG/usr/lib${LIBDIRSUFFIX}/vdpau
  ln -s libvdpau_nvidia.so.$VERSION libvdpau_nvidia.so.1
)
( cd $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules
  ln -s libnvidia-wfb.so.$VERSION libnvidia-wfb.so.1
)
( cd $PKG/usr/lib${LIBDIRSUFFIX}/xorg/modules/extensions
  ln -s libglx.so.$VERSION libglx.so
)

if [ "$ARCH" = "x86_64" -a "$COMPAT32" = "yes" ]; then
  cd 32

  mkdir -p \
    $PKG/usr/lib \
    $PKG/usr/lib/tls \
    $PKG/usr/lib/vdpau

  if [ "$GLVND" = "yes" ]; then
    install -m 0755 \
      libEGL.so.1.1.0 \
      libGL.so.1.7.0 \
      $PKG/usr/lib/
  else
    install -m 0755 \
      libEGL.so.$VERSION \
      libGL.so.$VERSION \
      $PKG/usr/lib/
  fi
  install -m 0755 \
    libEGL_nvidia.so.$VERSION \
    libGLESv1_CM.so.1.2.0 \
    libGLESv1_CM_nvidia.so.$VERSION \
    libGLESv2.so.2.1.0 \
    libGLESv2_nvidia.so.$VERSION \
    libGLX.so.0 \
    libGLX_nvidia.so.$VERSION \
    libGLdispatch.so.0 \
    libOpenCL.so.1.0.0 \
    libOpenGL.so.0 \
    libcuda.so.$VERSION \
    libnvcuvid.so.$VERSION \
    libnvidia-compiler.so.$VERSION \
    libnvidia-eglcore.so.$VERSION \
    libnvidia-encode.so.$VERSION \
    libnvidia-fatbinaryloader.so.$VERSION \
    libnvidia-fbc.so.$VERSION \
    libnvidia-glcore.so.$VERSION \
    libnvidia-glsi.so.$VERSION \
    libnvidia-ifr.so.$VERSION \
    libnvidia-ml.so.$VERSION \
    libnvidia-opencl.so.$VERSION \
    libnvidia-ptxjitcompiler.so.$VERSION \
    libnvidia-tls.so.$VERSION \
    $PKG/usr/lib/
  install -m 0755 \
    tls/libnvidia-tls.so.$VERSION \
    $PKG/usr/lib/tls/
  install -m 0755 \
    libvdpau_nvidia.so.$VERSION \
    $PKG/usr/lib/vdpau/

  sed -e "s#__LIBGL_PATH__#/usr/lib#" libGL.la \
    > $PKG/usr/lib/libGL.la

  ( cd $PKG/usr/lib
    if [ "$GLVND" = "yes" ]; then
      ln -s libEGL.so.1.1.0 libEGL.so.1
      ln -s libGL.so.1.7.0 libGL.so.1
    else
      ln -s libEGL.so.$VERSION libEGL.so.1
      ln -s libGL.so.$VERSION libGL.so.1
    fi
    ln -s libEGL.so.1 libEGL.so
    ln -s libEGL_nvidia.so.$VERSION libEGL_nvidia.so.0
    ln -s libGL.so.1 libGL.so
    ln -s libGLESv1_CM.so.1.2.0 libGLESv1_CM.so.1
    ln -s libGLESv1_CM.so.1 libGLESv1_CM.so
    ln -s libGLESv1_CM_nvidia.so.$VERSION libGLESv1_CM_nvidia.so.1
    ln -s libGLESv2.so.2.1.0 libGLESv2.so.2
    ln -s libGLESv2.so.2 libGLESv2.so
    ln -s libGLESv2_nvidia.so.$VERSION libGLESv2_nvidia.so.2
    ln -s libGLX.so.0 libGLX.so
    ln -s libGLX_nvidia.so.$VERSION libGLX_indirect.so.0
    ln -s libGLX_nvidia.so.$VERSION libGLX_nvidia.so.0
    ln -s libGLdispatch.so.0 libGLdispatch.so
    ln -s libOpenCL.so.1.0.0 libOpenCL.so.1.0
    ln -s libOpenCL.so.1.0 libOpenCL.so.1
    ln -s libOpenCL.so.1 libOpenCL.so
    ln -s libOpenGL.so.0 libOpenGL.so
    ln -s libcuda.so.$VERSION libcuda.so.1
    ln -s libcuda.so.1 libcuda.so
    ln -s libnvcuvid.so.$VERSION libnvcuvid.so.1
    ln -s libnvcuvid.so.1 libnvcuvid.so
    ln -s libnvidia-encode.so.$VERSION libnvidia-encode.so.1
    ln -s libnvidia-encode.so.1 libnvidia-encode.so
    ln -s libnvidia-fbc.so.$VERSION libnvidia-fbc.so.1
    ln -s libnvidia-fbc.so.1 libnvidia-fbc.so
    ln -s libnvidia-ifr.so.$VERSION libnvidia-ifr.so.1
    ln -s libnvidia-ifr.so.1 libnvidia-ifr.so
    ln -s libnvidia-ml.so.$VERSION libnvidia-ml.so.1
    ln -s libnvidia-ml.so.1 libnvidia-ml.so
    ln -s libnvidia-opencl.so.$VERSION libnvidia-opencl.so.1
    ln -s libnvidia-ptxjitcompiler.so.$VERSION libnvidia-ptxjitcompiler.so.1
    ln -s libnvidia-ptxjitcompiler.so.1 libnvidia-ptxjitcompiler.so
    ln -s vdpau/libvdpau_nvidia.so.$VERSION libvdpau_nvidia.so

    # FIX for ldconfig: /usr/lib[64]/lib*.so.0 is not a symboic link
    mv libGLX.so.0 libGLX.so.0.0.0
    mv libGLdispatch.so.0 libGLdispatch.so.0.0.0
    mv libOpenGL.so.0 libOpenGL.so.0.0.0
    ln -s libGLX.so.0.0.0 libGLX.so.0
    ln -s libGLdispatch.so.0.0.0 libGLdispatch.so.0
    ln -s libOpenGL.so.0.0.0 libOpenGL.so.0
  )
  ( cd $PKG/usr/lib/vdpau
    ln -s libvdpau_nvidia.so.$VERSION libvdpau_nvidia.so.1
  )

  cd ..
fi

# 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

# build the package
cd $PKG
makepkg -l y -c n \
  $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE \
  || exit 1

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