diff options
Diffstat (limited to 'system/nvidia-legacy96-driver/nvidia-switch')
-rw-r--r-- | system/nvidia-legacy96-driver/nvidia-switch | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/system/nvidia-legacy96-driver/nvidia-switch b/system/nvidia-legacy96-driver/nvidia-switch new file mode 100644 index 0000000000..647c6ef2a9 --- /dev/null +++ b/system/nvidia-legacy96-driver/nvidia-switch @@ -0,0 +1,334 @@ +#!/bin/sh + +# *************************************************************************** +# * Copyright (C) 2007-2008 by Heinz Wiesinger * +# * pprkut@liwjatan.at * +# * http://www.liwjatan.at * +# * * +# * 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 * +# * the Free Software Foundation; either version 3 of the License, or * +# * (at your option) any later version. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU General Public License for more details. * +# * * +# * You should have received a copy of the GNU General Public License * +# * along with this program; if not, write to the * +# * Free Software Foundation, Inc., * +# * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +# ***************************************************************************/ +# nvidia-switch utility 0.7.0 +# +# A tool to switch between nvidia-binary-driver and stock xorg-driver +# if both are installed in parallel. + +set -e + +ROOT="/" +CWD=$(pwd) +INC="${ROOT}usr/include/GL" +LIB="${ROOT}usr/lib" +XMOD="${ROOT}usr/lib/xorg/modules" +XLIB="$XMOD/extensions" +NV_VERSION='PKGVERSION' # This will be replaced in the build script +GL_VERSION="1.2" + +remove_link(){ +if [ -L "$1" ]; then + rm -f "$1" +fi +} + +remove_existing(){ +if [ -e "$1" ]; then + rm -f $1 +fi +} + +move_existing(){ +if [ -e "$1" ]; then + mv $1 $2 +fi +} + +setup_link(){ + if [ "$1" = "mv" ]; then + mv "$2" "$3" + else + rm -f $2 + fi + ln -s "$3" "$2" +} + +# Move and rename files in /usr/include +# $1 = from +# $2 = to +incs(){ +cd "$INC" + +if [ "$2" = "cleanup" ]; then + CMD="mv" + THREE="$1" +else + CMD="ln -s" + THREE="$2" +fi + +for i in glxext.h glext.h glx.h gl.h; do + if [ -L "$i" ]; then + rm -f "$i" + $CMD "$i-$THREE" "$i" + elif [ -e "$i" ]; then + if [ "$2" = "cleanup" ]; then + rm -f "$i-$1" + else + mv "$i" "$i-$1" + ln -s "$i-$THREE" "$i" + fi + else + $CMD "$i-$THREE" "$i" + fi +done + +cd "$CWD" +} + +libs(){ +for i in libGLcore.so libGLcore.la libglx.la; do + if [ "$1" = "nvidia" ]; then + #If this library exists, move it to *-xorg + move_existing "$XLIB/$i" "$XLIB/$i-xorg" + else + #If .so does not exist, and *-xorg does, then remove the -xorg + if [ -e "$XLIB/$i" ]; then + remove_existing "$XLIB/$i-xorg" + else + move_existing "$XLIB/$i-xorg" "$XLIB/$i" + fi + fi +done +} + +libs_basic(){ +for i in libGL.so libGLcore.so; do + #if this link exists, remove it, if it's a file, move it to *.nvidia + if [ -L "$LIB/$i.$NV_VERSION" ]; then + rm -f "$LIB/$i.$NV_VERSION" + elif [ -e "$LIB/$i.$NV_VERSION" ]; then + mv "$LIB/$i.$NV_VERSION" "$LIB/$i.$NV_VERSION-nvidia" + fi + remove_link "$LIB/$i.1" +done +} + +libgl_nvidia(){ +#if libGL.so.$GL_VERSION does exist, move it to libGL.so.$GL_VERSION-xorg, as it conflicts if nvidia's libGL.so +# then remove the libGL.so.1 symlink and create a new one pointing to nvidia's libGL.so +if [ -e "$LIB/libGL.so.$GL_VERSION" ]; then + cd "$LIB" + mv libGL.so.$GL_VERSION libGL.so.$GL_VERSION-xorg + setup_link "" "libGL.so.1" "libGL.so.$NV_VERSION" + cd "$CWD" +fi +} + +libgl_xorg(){ +#if libGL.so.$GL_VERSION does not exist and libGL.so.$GL_VERSION-xorg does, move it to libGL.so.$GL_VERSION +# then remove the libGL.so.1 symlink and create a new one pointing to nvidia's libGL.so +if [ -e "$LIB/libGL.so.$GL_VERSION" ]; then + remove_existing "$LIB/libGL.so.$GL_VERSION-xorg" +else + if [ -e "$LIB/libGL.so.$GL_VERSION-xorg" ]; then + cd "$LIB" + mv libGL.so.$GL_VERSION-xorg libGL.so.$GL_VERSION + ln -s libGL.so.$GL_VERSION libGL.so.1 + cd "$CWD" + fi +fi +} + + +libglcore_nvidia(){ +#If libGLcore.so.$NV_VERSION-nvidia does exists, then remove the -nvidia and make it usable that way +if [ -e "$LIB/libGLcore.so.$NV_VERSION-nvidia" ]; then + cd "$LIB" + rm -f libGLcore.so.$NV_VERSION libGLcore.so.1 + ln -s libGLcore.so.$NV_VERSION-nvidia libGLcore.so.$NV_VERSION + ln -s libGLcore.so.$NV_VERSION libGLcore.so.1 + cd "$CWD" +fi +} + +lib_nvidia(){ +for i in libGL.so libglx.so; do + if [ "$i" = "libGL.so" ]; then + cd "$LIB" + elif [ "$i" = "libglx.so" ]; then + cd "$XLIB" + fi + #If libGL.so.$NV_VERSION-nvidia does exists, then remove the -nvidia and make it usable that way + if [ -e "$i.$NV_VERSION-nvidia" ]; then + setup_link "" "$i.$NV_VERSION" "$i.$NV_VERSION-nvidia" + fi + cd "$CWD" +done +} + +libglx_base(){ +for i in $(ls libglx.so* | grep -v -); do + if ! [ "$i" = "libglx.so.$NV_VERSION" ]; then + rm -f $i + fi +done +ln -s libglx.so.$NV_VERSION libglx.so +} + +libglx_nvidia(){ +# if libglx.so is not a link, back it up to *-xorg, and create a symlink to nvidia's one +# if it's a link, then remove it and create a new one. +if ! [ -L "$XLIB/libglx.so" ]; then + cd $XLIB + mv libglx.so libglx.so-xorg + libglx_base +else + cd $XLIB + libglx_base +fi +cd $CWD +} + +libglx_xorg(){ +if [ "$1" = "xorg" ]; then + CMD="ln -s" +else + CMD="mv" +fi + +#if this library exists, move it to *-nvidia +if [ -L "$XLIB/libglx.so.$NV_VERSION" ]; then + rm $XLIB/libglx.so.$NV_VERSION +elif [ -e "$XLIB/libglx.so.$NV_VERSION" ]; then + mv $XLIB/libglx.so.$NV_VERSION $XLIB/libglx.so.$NV_VERSION-nvidia +fi + +# if libglx.so exists and is a link, remove it and create a new one +# If it does exists and is not a link, remove the old one, and create the new one. +# if it does not exist, create a symlink +if [ -L "$XLIB/libglx.so" ]; then + cd $XLIB + rm libglx.so + $CMD libglx.so-xorg libglx.so +elif [ -e "$XLIB/libglx.so" ]; then + if [ "$1" = "xorg" ]; then + cd $XLIB + setup_link "mv" "libglx.so" "libglx.so-xorg" + else + remove_existing "$XLIB/libglx.so-xorg" + fi +else + cd $XLIB + $CMD libglx.so-xorg libglx.so +fi +cd $CWD +} + +libwfb_nvidia(){ +#Recreate the link removed by --xorg +if ! [ -e "$XMOD/libwfb.so" ]; then + cd $XMOD + ln -s libnvidia-wfb.so.1 libwfb.so + cd $CWD +fi +} + +nvidia_ldconfig(){ +/sbin/ldconfig +#Generate correct symink for that lib +/sbin/ldconfig -l $1 + +if [ "$2" = "xorg" ]; then + #Remove so-link, recreated by ldconfig + cd $LIB + remove_link "libGLcore.so.1" + cd $CWD +fi +} + +nvidia(){ + echo $'Switching to nvidia-driver files!\n' + echo "You have to ENABLE the nvidia driver in /etc/X11/xorg.conf." + echo "Otherwise, this may lead to improperly working drivers." + + incs "xorg" "nvidia" + lib_nvidia + libgl_nvidia + libglcore_nvidia + libs "nvidia" + libglx_nvidia + libwfb_nvidia + + LD_NVIDIA="/usr/lib/libGL.so.$NV_VERSION-nvidia" + nvidia_ldconfig $LD_NVIDIA +} + +xorg(){ + echo $'Switching to stock xorg files.\n' + if [ "$1" = "cleanup" ]; then + echo $'Cleaning up symlinks.\n' + fi + echo "You have to DISABLE the nvidia driver in /etc/X11/xorg.conf." + echo "Otherwise, this may lead to improperly working drivers." + + if [ "$1" = "cleanup" ]; then + incs "xorg" "cleanup" + else + incs "xorg" "xorg" + fi + + libs_basic + libgl_xorg + libs "" + if [ "$1" = "cleanup" ]; then + libglx_xorg "" + else + libglx_xorg "xorg" + fi + remove_link "$XMOD/libwfb.so" + + LD_NVIDIA="/usr/lib/libGL.so.1.2" + nvidia_ldconfig $LD_NVIDIA "xorg" +} + +usage(){ + echo "Usage:" + echo " --nvidia Switch to nvidia driver files" + echo " --xorg Switch to stock xorg files" + echo " --cleanup Switch to stock xorg files and remove all created symlinks" + echo " --install Switch to nvidia driver files" + echo " This is used on installation to handle installroot correctly" + echo " Please use --nvidia for after-install switches instead" + echo " --help Show this help message" +} + +if [ "$1" = '--nvidia' ]; then + nvidia +elif [ "$1" = '--install' ]; then + ROOT="" + CWD=$(pwd) + INC="${ROOT}usr/include/GL" + LIB="${ROOT}usr/lib" + XMOD="${ROOT}usr/lib/xorg/modules" + XLIB="$XMOD/extensions" + nvidia +elif [ "$1" = '--xorg' ]; then + xorg "" +elif [ "$1" = '--cleanup' ]; then + xorg "cleanup" +elif [ "$1" = '--help' ]; then + usage +else + usage +fi |