#!/bin/sh

[ -z $PREPKG ] && exit 1

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

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

chmod -R \
  u+w,go-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 \
  nvidia.ko \
  $PREPKG/lib/modules/$KERNEL/kernel/drivers/video/
cd -

# not sure if we really need this. build if it anyway
cd kernel/uvm/
make $MAKEJOBS &> make.output || exit 1

install -p \
  -m 0644 \
  nvidia-uvm.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 manifest keywords:
# CLASSIC		- safe to ignore? ($E)
# COMPAT32		- for 64-bit?
# KERNEL_MODULE_CMD	- ?
# KERNEL_MODULE_SRC	- safe to ignore
# NATIVE		- safe to ignore? ($D)
# NEW			- safe to ingore? ($E)
# TLS_SYMLINK		- presumably handled like VDPAU_SYMLINK
# UVM_MODULE_SRC	- safe to ignore

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
  case "$C" in
    # files
    APPLICATION_PROFILE)
      # must remain as this dir, not /usr/share/$PACKAGE
      DSTDIR=/usr/share/nvidia
      ;;
    CUDA_ICD)
      DSTDIR=/etc/OpenCL/vendors
      ;;
    CUDA_LIB|\
    ENCODEAPI_LIB|\
    LIBGL_LA|\
    NVCUVID_LIB|\
    NVIFR_LIB|\
    OPENGL_LIB|\
    UTILITY_LIB|\
    XLIB_SHARED_LIB|\
    XLIB_STATIC_LIB)
      DSTDIR=/usr/lib/$PACKAGE
      ;;
    DOCUMENTATION)
      # massage base directory name
      # can't just replace it because of the */html/ subdir
      DSTDIR=/usr/doc/${D/NVIDIA_GLX-1.0/$PACKAGE-$VERSION}
      ;;
    DOT_DESKTOP)
      # .manifest apparently wants this in the doc dir. um, no
      DSTDIR=/usr/share/applications
      ;;
    EXPLICIT_PATH|\
    NVIDIA_MODPROBE)
      DSTDIR=$D
      ;;
    GLX_MODULE_SHARED_LIB|\
    XMODULE_SHARED_LIB)
      DSTDIR=/usr/lib/$PACKAGE/xorg/modules/$D
      ;;
    INSTALLER_BINARY|\
    UTILITY_BINARY)
      DSTDIR=/usr/bin
      ;;
    MANPAGE|\
    NVIDIA_MODPROBE_MANPAGE)
      DSTDIR=/usr/man/$D
      ;;
    OPENGL_HEADER)
      DSTDIR=/usr/include/$PACKAGE/$D
      ;;
    TLS_LIB)
      DSTDIR=/usr/lib/$PACKAGE/$F
      ;;
    VDPAU_LIB|\
    VDPAU_WRAPPER_LIB)
      DSTDIR=/usr/lib/$PACKAGE/$E
      ;;
    # symlinks
    CUDA_SYMLINK|\
    VDPAU_SYMLINK|\
    VDPAU_WRAPPER_SYMLINK)
      TARGET=$F
      DSTDIR=/usr/lib/$PACKAGE/$E
      ;;
    GLX_MODULE_SYMLINK|\
    XMODULE_NEWSYM|\
    XMODULE_SYMLINK)
      # keep symlink for reference, but don't actually use it.. otherwise:
      # [ERROR]Cannot access secondary GPU - error: [XORG] (EE) Failed to load /usr/lib/nvidia-bumblebee/xorg/modules/libwfb.so
      [ "$A" == "libwfb.so" ] && A=libwfb.so.dontuse
      TARGET=$E
      DSTDIR=/usr/lib/$PACKAGE/xorg/modules/$D
      ;;
    ENCODEAPI_LIB_SYMLINK|\
    OPENGL_SYMLINK|\
    NVCUVID_LIB_SYMLINK|\
    NVIFR_LIB_SYMLINK|\
    UTILITY_LIB_SYMLINK)
      TARGET=$E
      DSTDIR=/usr/lib/$PACKAGE
      ;;
    UTILITY_BIN_SYMLINK)
      TARGET=$D
      DSTDIR=/usr/bin
      ;;
    XLIB_SYMLINK)
      TARGET=$D
      DSTDIR=/usr/lib/$PACKAGE
      ;;
    # 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,__LIBGL_PATH__,/usr/lib/$PACKAGE," \
  $PREPKG/usr/lib/$PACKAGE/libGL.la
sed -i \
  -e "s,__UTILS_PATH__/\(.*\),optirun \1 -c :8," \
  -e "s,__PIXMAP_PATH__,/usr/doc/$PACKAGE-$VERSION," \
  $PREPKG/usr/share/applications/nvidia-settings.desktop

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
