#!/bin/sh

[ -z $PREPKG ] && exit 1

PACKAGE=nvidia
VERSION=352.41
KERNEL=$(uname -r)
FILES=$(cd $(dirname $0) ; pwd)

sh $FILES/NVIDIA-Linux-x86-$VERSION.run -x

chmod -R \
  u+w .
cd NVIDIA-Linux-x86-$VERSION/

# 'make -C kernel' doesn't work. descend & build
cd kernel/
make $MAKEJOBS module &> make.output || exit 1

install -d \
  $PREPKG/lib/modules/$KERNEL/kernel/drivers/video/
install -p \
  -m 0644 \
  $PACKAGE.ko \
  $PREPKG/lib/modules/$KERNEL/kernel/drivers/video/
cd -

# completely revamped file copying
# if .manifest is good enough for nvidia-installer, it's good enough for us

# currently unhandled/ignored manifest keywords:
# CLASSIC		- $E
# COMPAT32		- for 64-bit
# KERNEL_MODULE_CMD	- ?
# KERNEL_MODULE_SRC	- $C
# NATIVE		- $D
# NEW			- $E
# TLS_SYMLINK		- presumably handled like VDPAU_SYMLINK
# UVM_MODULE_SRC	- ?

cat .manifest | \
while { read A B C D E F ; } ; do

  # untidy permissions. harmless tweak
  [ "$B" == "0444" ] && B=0644

  # yes, this looks scary at first glance. it's actually quite straightforward
  # ordered by filetype, $DSTDIR, & keyword for easy reading
  case "$C" in
    # files
    EXPLICIT_PATH|\
    NVIDIA_MODPROBE)
      DSTDIR=$D
      ;;
    CUDA_ICD)
      DSTDIR=/etc/OpenCL/vendors
      ;;
    INSTALLER_BINARY|\
    UTILITY_BINARY)
      DSTDIR=/usr/bin
      ;;
    DOCUMENTATION)
      # massage base directory name
      # can't just replace it because of the various subdirs
      DSTDIR=/usr/doc/${D/NVIDIA_GLX-1.0/$PACKAGE-$VERSION}
      ;;
    XORG_OUTPUTCLASS_CONFIG)
      # when in doubt, treat this as a sample config
      DSTDIR=/usr/doc/$PACKAGE-$VERSION/sample
      ;;
    OPENGL_HEADER)
      DSTDIR=/usr/include/$D
      ;;
    CUDA_LIB|\
    ENCODEAPI_LIB|\
    LIBGL_LA|\
    NVCUVID_LIB|\
    NVIFR_LIB|\
    OPENGL_LIB|\
    UTILITY_LIB|\
    XLIB_SHARED_LIB|\
    XLIB_STATIC_LIB)
      DSTDIR=/usr/lib
      ;;
    OPENCL_LIB|\
    OPENCL_WRAPPER_LIB|\
    VDPAU_LIB|\
    VDPAU_WRAPPER_LIB)
      DSTDIR=/usr/lib/$E
      ;;
    TLS_LIB)
      DSTDIR=/usr/lib/$F
      ;;
    GLX_MODULE_SHARED_LIB|\
    XMODULE_SHARED_LIB)
      DSTDIR=/usr/lib/xorg/modules/$D
      ;;
    MANPAGE|\
    NVIDIA_MODPROBE_MANPAGE)
      DSTDIR=/usr/man/$D
      ;;
    DOT_DESKTOP)
      # .manifest apparently wants this in the doc dir. um, no
      DSTDIR=/usr/share/applications
      ;;
    APPLICATION_PROFILE)
      DSTDIR=/usr/share/$PACKAGE
      ;;
    # symlinks
    UTILITY_BIN_SYMLINK)
      TARGET=$D
      DSTDIR=/usr/bin
      ;;
    XLIB_SYMLINK)
      TARGET=$D
      DSTDIR=/usr/lib
      ;;
    ENCODEAPI_LIB_SYMLINK|\
    OPENGL_SYMLINK|\
    NVCUVID_LIB_SYMLINK|\
    NVIFR_LIB_SYMLINK|\
    UTILITY_LIB_SYMLINK)
      TARGET=$E
      DSTDIR=/usr/lib
      ;;
    CUDA_SYMLINK|\
    OPENCL_LIB_SYMLINK|\
    OPENCL_WRAPPER_SYMLINK|\
    VDPAU_SYMLINK|\
    VDPAU_WRAPPER_SYMLINK)
      TARGET=$F
      DSTDIR=/usr/lib/$E
      ;;
    GLX_MODULE_SYMLINK|\
    XMODULE_NEWSYM|\
    XMODULE_SYMLINK)
      # used by X to perform software rendering on GeForce 8 series GPUs
      # keep symlink for reference, but don't actually use it.. otherwise:
      # [ERROR]Cannot access secondary GPU - error: [XORG] (EE) Failed to load /usr/lib/xorg/modules/libwfb.so
      [ "$A" == "libwfb.so" ] && A=libwfb.so.dontuse
      TARGET=$E
      DSTDIR=/usr/lib/xorg/modules/$D
      ;;
    # unhandled entries: ignore
    *)
      unset A B C D E F DSTDIR TARGET
      ;;
  esac

  # skip unhandled entries
  [ -z $A ] && continue

  install -d \
    $PREPKG/$DSTDIR/
  if [ "$B" == "0000" ] ; then
    ln -s \
      $TARGET \
      $PREPKG/$DSTDIR/$A
  else
    install -p \
      -m $B \
      $A \
      $PREPKG/$DSTDIR/
  fi
done

# necessary touchups
sed -i \
  -e "s,__GENERATED_BY__,$PACKAGE-installer: $VERSION," \
  -e "s,__LIBGL_PATH__,/usr/lib," \
  $PREPKG/usr/lib/libGL.la
sed -i \
  -e "s,__UTILS_PATH__,/usr/bin," \
  -e "s,__PIXMAP_PATH__,/usr/doc/$PACKAGE-$VERSION," \
  $PREPKG/usr/share/applications/$PACKAGE-settings.desktop

# prevent nvidia files from overwriting stock files
# ordered by regular files & symlinks (of nvidia files) for easy reading
# fixme: verify every rebuild!
for i in \
usr/include/GL/gl.h \
usr/include/GL/glext.h \
usr/include/GL/glx.h \
usr/include/GL/glxext.h \
usr/lib/libGL.la \
\
usr/lib/libEGL.so \
usr/lib/libEGL.so.1 \
usr/lib/libGL.so \
usr/lib/libGL.so.1 \
usr/lib/xorg/modules/extensions/libglx.so
do
  [ -e $PREPKG/$i ] && mv $PREPKG/$i{,-$PACKAGE}
done

# extra step for non-clobber of xorg symlinks
rm \
  $PREPKG/usr/lib/libEGL.so-$PACKAGE
ln -s \
  libEGL.so.1-$PACKAGE \
  $PREPKG/usr/lib/libEGL.so-$PACKAGE
rm \
  $PREPKG/usr/lib/libGL.so-$PACKAGE
ln -s \
  libGL.so.1-$PACKAGE \
  $PREPKG/usr/lib/libGL.so-$PACKAGE

# file switching script for the above files
install -d \
  $PREPKG/usr/sbin/
install \
  -m 0755 \
  $FILES/$PACKAGE-overlap \
  $PREPKG/usr/sbin/

install -d \
  $PREPKG/install/
install \
  -m 0644 \
  $FILES/{doinst.sh,slack-desc} \
  $PREPKG/install/
sed -i \
  -e "s,@KERNEL@,$KERNEL,g" \
  $PREPKG/install/doinst.sh
