# Contributor: Bartek Piotrowski <[email protected]>
# Contributor: Det <nimetonmaili AT gmail dot com>
# Contributor: Dan Vratil <[email protected]>
# Contributor: Ng Oon-Ee <n g o o n e e AT g mail dot com>
# Contributor: Amaury Couste <[email protected]>
# Contributor: James Rayner <[email protected]>
# Contributor: Thomas Baechler <[email protected]>
# Contributor: Nuno Aniceto aka quarkup <[email protected]>
# Contributor: mar77i <mysatyre at gmail dot com>

pkgname='nvidia-all'
true && pkgname=('nvidia-all' 'nvidia-utils')
pkgver='285.05.09'
pkgrel=1
pkgdesc="NVIDIA drivers for all kernels on the system"
url='http://www.nvidia.com/'
arch=('i686' 'x86_64')
license=('custom')

if [ "$CARCH" = "i686" ]; then
_arch='x86'
_pkg="NVIDIA-Linux-${_arch}-${pkgver}"
source=("http://us.download.nvidia.com/XFree86/Linux-${_arch}/${pkgver}/${_pkg}.run")
md5sums=('2d469a90abef50320f548cfa8085e3a0')
elif [ "$CARCH" = "x86_64" ]; then
_arch=$CARCH
_pkg="NVIDIA-Linux-${_arch}-${pkgver}-no-compat32"
source=("http://us.download.nvidia.com/XFree86/Linux-${_arch}/${pkgver}/${_pkg}.run")
md5sums=('2f4a0e78f5560c07220b7ed6fc1e27aa')
fi

_compress=y

_KERNEL_DIRS=(/usr/src/*)
_KERNELS=()
for dir in "${_KERNEL_DIRS[@]}"; do
[[ $dir == /usr/src/linux-* ]] && dir="${dir##*/}" && _KERNELS+=("${dir#*-}" )
done

build() {
rm -rf "${_pkg}"
# Extract the nvidia drivers
sh "${_pkg}.run" --extract-only

# Loop through all detected kernels and build modules
for _kernver in "${_KERNELS[@]}"; do
cd "${srcdir}/${_pkg}"
cp -a kernel "kernel-${_kernver}"
cd "kernel-${_kernver}"
msg "Found kernel: $_kernver"
msg2 "Building module..."
make "SYSSRC=/usr/src/linux-${_kernver}" module &> /dev/null
done
}

package_nvidia-utils() {
pkgdesc='NVIDIA drivers utilities and libraries'
depends=('xorg-server' 'libxvmc')
optdepends=('gtk2: nvidia-settings')
conflicts=('libgl')
provides=('libgl' 'libcl')
install='nvidia-utils.install'

cd "${_pkg}"
install -D -m755 nvidia_drv.so "$pkgdir/usr/lib/xorg/modules/drivers/nvidia_drv.so"
# GLX extension module for X
install -D -m755 "libglx.so.$pkgver" "$pkgdir/usr/lib/xorg/modules/extensions/libglx.so.$pkgver"
ln -s "libglx.so.$pkgver" "$pkgdir/usr/lib/xorg/modules/extensions/libglx.so" # X doesn't find glx otherwise
# OpenGL library
install -D -m755 "libGL.so.$pkgver" "$pkgdir/usr/lib/libGL.so.$pkgver"
# OpenGL core library
install -D -m755 "libnvidia-glcore.so.$pkgver" "$pkgdir/usr/lib/libnvidia-glcore.so.$pkgver"
# XvMC
install -D -m644 libXvMCNVIDIA.a "$pkgdir/usr/lib/libXvMCNVIDIA.a"
install -D -m755 "libXvMCNVIDIA.so.$pkgver" "$pkgdir/usr/lib/libXvMCNVIDIA.so.$pkgver"
# VDPAU
install -D -m755 "libvdpau_nvidia.so.$pkgver" "$pkgdir/usr/lib/vdpau/libvdpau_nvidia.so.$pkgver"
# CUDA
install -D -m755 "libcuda.so.$pkgver" "$pkgdir/usr/lib/libcuda.so.$pkgver"
install -D -m755 "libnvcuvid.so.$pkgver" "$pkgdir/usr/lib/libnvcuvid.so.$pkgver"
# nvidia-tls library
install -D -m755 "tls/libnvidia-tls.so.$pkgver" "$pkgdir/usr/lib/libnvidia-tls.so.$pkgver"
# OpenCL
install -D -m755 "libnvidia-compiler.so.$pkgver" "$pkgdir/usr/lib/libnvidia-compiler.so.$pkgver"
install -D -m755 libOpenCL.so.1.0.0 "$pkgdir/usr/lib/libOpenCL.so.1.0.0"
install -D -m644 nvidia.icd "$pkgdir/etc/OpenCL/vendors/nvidia.icd"

install -D -m755 "libnvidia-cfg.so.$pkgver" "$pkgdir/usr/lib/libnvidia-cfg.so.$pkgver"
install -D -m755 "libnvidia-ml.so.$pkgver" "$pkgdir/usr/lib/libnvidia-ml.so.$pkgver"

# create soname links - in an unbelievably ugly fashion.
while read -d '' _lib; do
_soname="$(dirname ${_lib})/$(readelf -d "$_lib" | sed -nr 's/.*Library soname: \[(.*)\].*/\1/p')"
[[ -e "${_soname}" ]] || ln -s "$(basename ${_lib})" "${_soname}"
[[ -e "${_soname/.[0-9]*/}" ]] || ln -s "$(basename ${_soname})" "${_soname/.[0-9]*/}"
done < <(find "$pkgdir" -type f -name '*.so*' -print0)

# nvidia-xconfig
install -D -m755 nvidia-xconfig "$pkgdir/usr/bin/nvidia-xconfig"
install -D -m644 nvidia-xconfig.1.gz "$pkgdir/usr/share/man/man1/nvidia-xconfig.1.gz"
# nvidia-settings
install -D -m755 nvidia-settings "$pkgdir/usr/bin/nvidia-settings"
install -D -m644 nvidia-settings.1.gz "$pkgdir/usr/share/man/man1/nvidia-settings.1.gz"
install -D -m644 nvidia-settings.desktop "$pkgdir/usr/share/applications/nvidia-settings.desktop"
install -D -m644 nvidia-settings.png "$pkgdir/usr/share/pixmaps/nvidia-settings.png"
sed -i 's:__UTILS_PATH__:/usr/bin:; s:__PIXMAP_PATH__:/usr/share/pixmaps:' \
"$pkgdir/usr/share/applications/nvidia-settings.desktop"
# nvidia-bug-report
install -D -m755 nvidia-bug-report.sh "$pkgdir/usr/bin/nvidia-bug-report.sh"
# nvidia-smi
install -D -m755 nvidia-smi "$pkgdir/usr/bin/nvidia-smi"
install -D -m644 nvidia-smi.1.gz "$pkgdir/usr/share/man/man1/nvidia-smi.1.gz"

install -D -m644 LICENSE "$pkgdir/usr/share/licenses/nvidia/LICENSE"
ln -s nvidia "$pkgdir/usr/share/licenses/nvidia-utils"
install -D -m644 README.txt "$pkgdir/usr/share/doc/nvidia/README"
install -D -m644 NVIDIA_Changelog "$pkgdir/usr/share/doc/nvidia/NVIDIA_Changelog"
ln -s nvidia "$pkgdir/usr/share/doc/nvidia-utils"
}

package_nvidia-all(){
pkgdesc='NVIDIA drivers for all kernels on the system'
conflicts=('nvidia-71xx' 'nvidia-96xx' 'nvidia-173xx' 'nvidia-legacy' 'nvidia')
depends=("nvidia-utils")
makedepends=('kernel26-headers')
provides=("nvidia")
install='nvidia-all.install'
options=(!strip)
_modname="nvidia.ko"

for _kernver in "${_KERNELS[@]}"; do
if [ $_compress = "y" ]; then
msg2 "Compressing module with gzip..."
gzip -9 "${_pkg}/kernel-${_kernver}/nvidia.ko"
_modname="nvidia.ko.gz"
fi
msg2 "Installing module..."
install -D -m644 "${_pkg}/kernel-${_kernver}/$_modname" \
"${pkgdir}/lib/modules/${_kernver}/kernel/drivers/video/$_modname"
done

# Blacklist the Nouveau driver (avoiding possible conflicts by appending the -all suffix)
install -d -m755 "${pkgdir}/etc/modprobe.d"
echo "blacklist nouveau" > "${pkgdir}/etc/modprobe.d/nouveau_blacklist-all.conf"
}