@ -1,7 +1,7 @@
#!/bin/env bash
#!/bin/env bash
# Compile latest Nvidia drivers on a Debian-based Linux
# Compile latest Nvidia drivers on a Debian-based Linux
# Copyright (C) 2018 Pekka Helenius
# Copyright (C) 2019 Pekka Helenius
#
#
# This program is free software: you can redistribute it and/or modify
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# it under the terms of the GNU General Public License as published by
@ -24,10 +24,10 @@
BASH_CHECK = $( ps | grep ` echo $$ ` | awk '{ print $4 }' )
BASH_CHECK = $( ps | grep ` echo $$ ` | awk '{ print $4 }' )
if [ $BASH_CHECK != "bash" ] ; then
if [ $BASH_CHECK != "bash" ] ; then
echo "
echo "
Please run this script using bash ( /usr/bin/bash) .
Please run this script using bash ( /usr/bin/bash) .
"
exit 1
"
exit 1
fi
fi
########################################################
########################################################
@ -35,7 +35,7 @@ fi
# Just a title & author for this script, used in initialization
# Just a title & author for this script, used in initialization
SCRIPT_TITLE = "\e[1mNvidia drivers package builder & installer\e[0m"
SCRIPT_TITLE = "\e[1mNvidia drivers package builder & installer\e[0m"
SCRIPT_AUTHOR = "Pekka Helenius (~Fincer), 2018 "
SCRIPT_AUTHOR = "Pekka Helenius (~Fincer), 2019 "
########################################################
########################################################
@ -45,12 +45,11 @@ BUILD_MAINDIR=${PWD}/debian_nvidia
_pkgname = "nvidia"
_pkgname = "nvidia"
arch = "x86_64"
arch = "x86_64"
pkgver = 396.5 4
pkgver = 430.1 4
files = (
files = (
"http://archive.ubuntu.com/ubuntu/pool/restricted/n/nvidia-graphics-drivers-390/nvidia-graphics-drivers-390_390.48-0ubuntu3.debian.tar.xz"
" http://us.download.nvidia.com/XFree86/Linux- ${ arch } / ${ pkgver } /NVIDIA-Linux- ${ arch } - ${ pkgver } .run "
"http://archive.ubuntu.com/ubuntu/pool/restricted/n/nvidia-graphics-drivers-418/nvidia-graphics-drivers-418_418.56-0ubuntu1.debian.tar.xz"
" http://us.download.nvidia.com/XFree86/Linux- ${ arch } / ${ pkgver } /NVIDIA-Linux- ${ arch } - ${ pkgver } .run "
)
)
###################
###################
@ -69,25 +68,25 @@ typeset -A library_fixes
# Right side: new library version
# Right side: new library version
#
#
library_fixes = (
library_fixes = (
[ libnvidia-egl-wayland.so.1.0.2] = "libnvidia-egl-wayland.so.1.0.3 "
[ libnvidia-egl-wayland.so.1.0.2] = 'libnvidia-egl-wayland.so.1.0.3 '
)
)
###################
###################
# These are defined build dependencies in debian/control file
# These are defined build dependencies in debian/control file
nvidia_builddeps = (
nvidia_builddeps = (
'dpkg-dev'
'xz-utils'
'dkms'
'libwayland-client0'
'libwayland-server0'
'libxext6'
'quilt'
'po-debconf'
'execstack'
'dh-modaliases'
'xserver-xorg-dev'
'libglvnd-dev'
'dpkg-dev'
'xz-utils'
'dkms'
'libwayland-client0'
'libwayland-server0'
'libxext6'
'quilt'
'po-debconf'
'execstack'
'dh-modaliases'
'xserver-xorg-dev'
'libglvnd-dev'
)
)
###################
###################
@ -96,24 +95,24 @@ nvidia_builddeps=(
nvidia_required_packages = (
nvidia_required_packages = (
# Required by libnvidia-gl
# Required by libnvidia-gl
"libwayland-client0 "
"libwayland-server0 "
'libwayland-client0 '
'libwayland-server0 '
# Required by libnvidia, libnvidia-decode & libnvidia-fbc1
# Required by libnvidia, libnvidia-decode & libnvidia-fbc1
"libx11-6 "
'libx11-6 '
# Required by libnvidia, libnvidia-decode, libnvidia-fbc1 & libnvidia-ifr1
# Required by libnvidia, libnvidia-decode, libnvidia-fbc1 & libnvidia-ifr1
"libxext6 "
'libxext6 '
# Required by libnvidia-fbc1 & libnvidia-ifr1
# Required by libnvidia-fbc1 & libnvidia-ifr1
"libgl1 "
'libgl1 '
# Required by xserver-xorg-video-nvidia
# Required by xserver-xorg-video-nvidia
"xserver-xorg-core "
"xorg-video-abi-23 "
'xserver-xorg-core '
'xorg-video-abi-23 '
# Required by nvidia-compute-utils
# Required by nvidia-compute-utils
"adduser "
'adduser '
)
)
@ -121,25 +120,27 @@ nvidia_required_packages=(
# Nvidia packages. THIS ORDER IS MANDATORY, DO NOT CHANGE!
# Nvidia packages. THIS ORDER IS MANDATORY, DO NOT CHANGE!
nvidia_install_packages = (
nvidia_install_packages = (
# Similar than 'nvidia-dkms' package on Arch Linux
# Similar than 'nvidia-dkms' package on Arch Linux
" nvidia-kernel-source- ${ pkgver_major } "
" nvidia-kernel-source- ${ pkgver_major } "
# Nvidia DKMS
# Nvidia DKMS
" nvidia-kernel-common- ${ pkgver_major } "
" nvidia-dkms- ${ pkgver_major } "
" nvidia-kernel-common- ${ pkgver_major } "
" nvidia-dkms- ${ pkgver_major } "
# Similar than 'nvidia-utils' package on Arch Linux
# Similar than 'nvidia-utils' package on Arch Linux
" libnvidia-common- ${ pkgver_major } "
" libnvidia-gl- ${ pkgver_major } "
" libnvidia-cfg1- ${ pkgver_major } "
" xserver-xorg-video-nvidia- ${ pkgver_major } "
" libnvidia-compute- ${ pkgver_major } "
" libnvidia-decode- ${ pkgver_major } "
" libnvidia-encode- ${ pkgver_major } "
" libnvidia-fbc1- ${ pkgver_major } "
" libnvidia-ifr1- ${ pkgver_major } "
" nvidia-compute-utils- ${ pkgver_major } "
" nvidia-utils- ${ pkgver_major } "
" libnvidia-common- ${ pkgver_major } "
" libnvidia-gl- ${ pkgver_major } "
" libnvidia-cfg1- ${ pkgver_major } "
" xserver-xorg-video-nvidia- ${ pkgver_major } "
" libnvidia-compute- ${ pkgver_major } "
" libnvidia-decode- ${ pkgver_major } "
" libnvidia-encode- ${ pkgver_major } "
" libnvidia-fbc1- ${ pkgver_major } "
" libnvidia-ifr1- ${ pkgver_major } "
" nvidia-compute-utils- ${ pkgver_major } "
" nvidia-utils- ${ pkgver_major } "
)
)
########################################################
########################################################
@ -188,17 +189,17 @@ fi
# If the script is interrupted (Ctrl+C/SIGINT), do the following
# If the script is interrupted (Ctrl+C/SIGINT), do the following
function Nvidia_intCleanup( ) {
function Nvidia_intCleanup( ) {
rm -rf ${ WORKDIR } /{ ${ pkgdir } /{ debian,NVIDIA-Linux,NVIDIA-Linux-amd64,NVIDIA-Linux-x86_64-${ pkgver } ,LICENSE.txt,unpack-stamp} ,compiled_deb,compiled_other}
exit 0
rm -rf ${ WORKDIR } /{ ${ pkgdir }
}
}
# Allow interruption of the script at any time (Ctrl + C)
# Allow interruption of the script at any time (Ctrl + C)
trap "Nvidia_intCleanup" INT
trap "Nvidia_intCleanup && exit 0 " INT
###########################################################
# Error event
#trap "Nvidia_intCleanup && exit 1" ERR
# Remove old build files
# Remove old build files
rm -rf ${ WORKDIR } /{ ${ pkgdir } /{ debian,NVIDIA-Linux,NVIDIA-Linux-amd64,NVIDIA-Linux-x86_64-${ pkgver } ,LICENSE.txt,unpack-stamp} ,compiled_deb,compiled_other}
Nvidia_intCleanup
###########################################################
###########################################################
@ -213,23 +214,22 @@ COMMANDS=(
function checkCommands( ) {
function checkCommands( ) {
if [ [ $( which --help 2>/dev/null) ] ] && [ [ $( echo --help 2>/dev/null) ] ] ; then
local a = 0
for command in ${ @ } ; do
if [ [ ! $( which $command 2>/dev/null) ] ] ; then
local COMMANDS_NOTFOUND[ $a ] = ${ command }
let a++
fi
done
if [ [ $( which --help 2>/dev/null) ] ] && [ [ $( echo --help 2>/dev/null) ] ] ; then
local a = 0
for command in ${ @ } ; do
if [ [ ! $( which $command 2>/dev/null) ] ] ; then
local COMMANDS_NOTFOUND[ $a ] = ${ command }
let a++
fi
done
if [ [ -n $COMMANDS_NOTFOUND ] ] ; then
echo -e " \nError! The following commands could not be found: ${ COMMANDS_NOTFOUND [*] } \nAborting\n "
exit 1
fi
else
exit 1
if [ [ -n $COMMANDS_NOTFOUND ] ] ; then
echo -e " \nError! The following commands could not be found: ${ COMMANDS_NOTFOUND [*] } \nAborting\n "
exit 1
fi
fi
else
exit 1
fi
}
}
checkCommands " ${ COMMANDS [*] } "
checkCommands " ${ COMMANDS [*] } "
@ -265,7 +265,7 @@ if [[ $? -ne 0 ]]; then
echo -e "Cancelling.\n"
echo -e "Cancelling.\n"
exit 1
exit 1
else
else
rm -rv ${ WORKDIR } /*.{ deb,buildinfo,changes} 2>/dev/null
rm -rf v ${ WORKDIR } /*.{ deb,buildinfo,changes} 2>/dev/null
fi
fi
########################################################
########################################################
@ -293,7 +293,7 @@ if [[ $? -eq 0 ]]; then
if [ [ ${ UID } -ne 0 ] ] ; then
if [ [ ${ UID } -ne 0 ] ] ; then
if [ [ $( echo $( sudo -vn & >/dev/null) $? ) -ne 0 ] ] ; then
if [ [ $( echo $( sudo -vn & >/dev/null) $? ) -ne 0 ] ] ; then
echo -e "Installation requires root permissions. Please provide your sudo password now.\n"
echo -e "NV IDIA driver i nstallation requires root permissions. Please provide your sudo password now.\n"
sudo -v
sudo -v
fi
fi
if [ [ $? -eq 0 ] ] ; then
if [ [ $? -eq 0 ] ] ; then
@ -308,20 +308,27 @@ fi
########################################################
########################################################
function pkg_installcheck( ) {
RETURNVALUE = $( echo $( dpkg -s " ${ 1 } " & >/dev/null) $? )
return $RETURNVALUE
}
########################################################
# Check and install package related dependencies if they are missing
# Check and install package related dependencies if they are missing
function pkgdependencies( ) {
function pkgdependencies( ) {
# Generate a list of missing dependencies
# Generate a list of missing dependencies
local a = 0
local a = 0
for p in ${ @ } ; do
for p in ${ @ } ; do
if [ [ $( echo $( dpkg -s ${ p } & >/dev/null) $? ) -ne 0 ] ] ; then
if [ [ $( pkg_installcheck ${ p } ) -ne 0 ] ] ; then
validlist[ $a ] = ${ p }
validlist[ $a ] = ${ p }
let a++
let a++
fi
fi
done
done
if [ [ -n ${ list [*] } ] ] ; then
echo -e "Some build time dependencies are missing. In order to continue, you must install them. "
if [ [ -n ${ valid list[*] } ] ] ; then
echo -e " The following build time dependencies are missing. In order to continue, you must install them:\n $( for i in ${ validlist [@] } ; do echo ${ i } ; done ) \n "
if [ [ ${ UID } -ne 0 ] ] && [ [ $( echo $( sudo -vn & >/dev/null) $? ) -ne 0 ] ] ; then
if [ [ ${ UID } -ne 0 ] ] && [ [ $( echo $( sudo -vn & >/dev/null) $? ) -ne 0 ] ] ; then
echo -e "For that, sudo password is required. Please provide it now.\n"
echo -e "For that, sudo password is required. Please provide it now.\n"
sudo -v
sudo -v
@ -344,10 +351,6 @@ function pkgdependencies() {
exit 1
exit 1
fi
fi
done
done
if [ [ -n ${ validlist [*] } ] ] ; then
# Add empty newline
echo ""
fi
}
}
########################################################
########################################################
@ -360,6 +363,7 @@ function download_files() {
for f in ${ files [@] } ; do
for f in ${ files [@] } ; do
if [ [ ! -f ${ WORKDIR } /${ pkgdir } /${ filebases [ $i ] } ] ] ; then
if [ [ ! -f ${ WORKDIR } /${ pkgdir } /${ filebases [ $i ] } ] ] ; then
echo ${ f }
echo -e " \nDownloading ${ filebases [ $i ] } "
echo -e " \nDownloading ${ filebases [ $i ] } "
wget ${ f } -o /dev/null --show-progress -O " ${ WORKDIR } / ${ pkgdir } / ${ filebases [ $i ] } "
wget ${ f } -o /dev/null --show-progress -O " ${ WORKDIR } / ${ pkgdir } / ${ filebases [ $i ] } "
@ -561,8 +565,8 @@ function install_vulkan() {
########################################################
########################################################
pkgdependencies ${ nvidia_builddeps [*] } && \
download_files && \
download_files && \
pkgdependencies ${ nvidia_builddeps [*] }
prepare_deb_sources && \
prepare_deb_sources && \
compile_nvidia
compile_nvidia
@ -572,7 +576,7 @@ if [[ $? -eq 0 ]] && [[ -v AUTOINSTALL ]]; then
fi
fi
# If any buildtime deps were installed, inform the user
# If any buildtime deps were installed, inform the user
if [ [ -n ${ list [*] } ] ] ; then
if [ [ -n ${ valid list[*] } ] ] ; then
echo -e " The following buildtime dependencies were installed, and they may not be required anymore:\n\n \
echo -e " The following buildtime dependencies were installed, and they may not be required anymore:\n\n \
$( for h in ${ list [*] } ; do echo ${ h } ; done ) \n "
$( for h in ${ valid list[*] } ; do echo ${ h } ; done ) \n "
fi
fi