#!/bin/bash
#
# Versioning
# Major.Minor.Point
# Major - complete rewrites
# Minor - new GL provider added/removed
# Point - bugfixes/filelist changes and so on
#
GL_SELECT_VERSION="2.0.5"
GL_LIBS="$(ls ${TRACK_ROOT}/usr/lib/.{mesa,nvidia,ati}/libGL.so 2>/dev/null \
  | awk -F"/" '{print $4}')"
. /etc/sysconfig/gl_select

. /var/lib/sorcery/modules/libmedia
LOCAL_MEDIA_CONFIG=/etc/sorcery/local/media source /etc/sorcery/media
function message() {
  echo -e "$@"
}

function gl_list() {
  message "Available GL Libraries on the system"
  ls -1 --color=none ${TRACK_ROOT}/usr/lib/.{mesa,nvidia,ati}/libGL.so 2>/dev/null \
             | awk -F"/" '{print $4}' | sed -e "s:\.::"
  exit 0
}

function gl_link_libs() {
  fromdir=$1
  todir=$2
  ln -sf $(ls $fromdir/*.* | grep -v '.la$') $todir/ 2>/dev/null  
}

function gl_pick() {
  local gl_lib=$1
  local file_list="
                    /usr/lib/libGL.so
                    /usr/lib/libGL.so.*
                    /usr/lib/libEGL.so
                    /usr/lib/libEGL.so.*
                    /usr/lib/xorg/modules/extensions/libdri.la
                    /usr/lib/xorg/modules/extensions/libdri.so
                    /usr/lib/xorg/modules/extensions/libglx.la
                    /usr/lib/xorg/modules/extensions/libglx.so*
                    /usr/include/GL/gl.h
                    /usr/include/GL/glext.h
                    /usr/include/GL/glx.h
                    /usr/include/GL/glxext.h
                   "
  local dir_list=( \
                  "/usr/lib/.ati" \
                  "/usr/lib/.nvidia" \
                  "/usr/lib/.mesa" \
                  "/usr/include/GL/.ati" \
                  "/usr/include/GL/.nvidia" \
                  "/usr/include/GL/.mesa" \
                  "/usr/lib/xorg/modules/extensions/.ati" \
                  "/usr/lib/xorg/modules/extensions/.nvidia" \
                  "/usr/lib/xorg/modules/extensions/.mesa" \
                 )
  local rm_file orig_dir
  local gl_lib=$1
  message "Selecting $gl_lib as the default system GL library"
  if [[ -L ${INSTALL_ROOT}/usr/lib/libGL.so ]] ||
     [[ ! -e ${INSTALL_ROOT}/usr/lib/libGL.so ]]
  then
    message "Cleaning all previous GL providers..."
    for rm_file in $file_list
    do
      rm -f $rm_file
      echo -n "."
    done
    echo -n "."
    echo ""
    message "Done."
    message "Setting up new GL provider $gl_lib..."
    case "$1" in
   ati) 
        [[ -e ${INSTALL_ROOT}${dir_list[0]}/libGL.so ]] &&
        gl_link_libs  ${INSTALL_ROOT}${dir_list[0]} \
                      ${INSTALL_ROOT}/usr/lib
        [[ -e ${INSTALL_ROOT}${dir_list[3]}/gl.h ]] &&
        ln -sf ${INSTALL_ROOT}${dir_list[3]}/* \
               ${INSTALL_ROOT}/usr/include/GL/ 2>/dev/null
        [[ -e ${INSTALL_ROOT}${dir_list[6]}/libglx.so ]] &&
        gl_link_libs  ${INSTALL_ROOT}${dir_list[6]} \
                      ${INSTALL_ROOT}/usr/lib/xorg/modules/extensions
        echo -n "."
        ;;
  mesa) 
        [[ -e ${INSTALL_ROOT}${dir_list[2]}/libGL.so ]] &&
        gl_link_libs ${INSTALL_ROOT}${dir_list[2]} \
                     ${INSTALL_ROOT}/usr/lib
        [[ -e ${INSTALL_ROOT}${dir_list[5]}/gl.h ]] &&
        ln -sf ${INSTALL_ROOT}${dir_list[5]}/* \
               ${INSTALL_ROOT}/usr/include/GL/ 2>/dev/null
        [[ -e ${INSTALL_ROOT}${dir_list[8]}/libglx.so ]] &&
        gl_link_libs ${INSTALL_ROOT}${dir_list[8]} \
                     ${INSTALL_ROOT}/usr/lib/xorg/modules/extensions
        echo -n "."
        ;;
nvidia) 
        [[ -e ${INSTALL_ROOT}${dir_list[1]}/libGL.so ]] &&
        gl_link_libs ${INSTALL_ROOT}${dir_list[1]} \
                     ${INSTALL_ROOT}/usr/lib
        [[ -e ${INSTALL_ROOT}${dir_list[4]}/gl.h ]] &&
        ln -sf ${INSTALL_ROOT}${dir_list[4]}/* \
               ${INSTALL_ROOT}/usr/include/GL/ 2>/dev/null
        [[ -e ${INSTALL_ROOT}${dir_list[7]}/libglx.so ]] &&
        gl_link_libs ${INSTALL_ROOT}${dir_list[7]} \
                     ${INSTALL_ROOT}/usr/lib/xorg/modules/extensions
        echo -n "."
        ;;
     *) message "Unknown secondary files so I only linked the libGL.so"
        ln -fs ${INSTALL_ROOT}/usr/lib/$gl_lib/libGL.so* \
               ${INSTALL_ROOT}/usr/lib/ 2>/dev/null
        ;;
      esac
    echo -e "\nDone."
    message "You can manage the libGL providers at runtime by using"
    message "either smgl-gl_select or manually by symlinking the files"
    message "from their respective directories i.e.:"
    message "/usr/lib/.[nvidia|ati|mesa]/libGL.so"
    message "/usr/lib/xorg/modules/extensions/.[nvidia,ati,mesa]/lib{glx,dri}.so"
    message "/usr/include/GL/.[nvidia|ati|mesa]/gl{x,xext,ext}.h"
    message ""
    message "To:"
    message "/usr/lib/libGL.so"
    message "/usr/lib/xorg/modules/extensions/lib{glx,dri}.so"
    message "/usr/include/GL/gl{x,xext,ext}.h"
    message ""
    return 0
  else
    message "Error ${INSTALL_ROOT}/usr/lib/libGL.so is not a symlink"
    message "unable to proceed!!!"
    message "Please recast:"
    message "mesalib, xorg-server and whatever GL driver you use."
    message ""
    message "If this continues to happen please file a bug."
    message ""
    return 1
  fi
}

function gl_help() {
  message "gl_select -$GL_SELECT_VERSION
Copyright (C) 2006-2015 Source Mage
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
"
  gl_usage
  exit 0
}

function gl_usage() {
  message "USAGE: gl_select OPTIONS

OPTIONS:
  --default, -d            Use the default GL Library defined in config.
  --list, -l               List available GL Libraries on the system.
  --select, -s <PARAM>     Select a GL Library that's available.
  --help, -h               Print the help message.

FILES:
  /etc/sysconfig/gl_select"
  exit 0
}

while  [[  -n  "$1"  ]];  do
  if  echo  "" $1  |  grep  -q  "^ -";  then
    case  $1  in
      --list|-l)gl_list ;;
      --help|-h)gl_help ;;
    --select|-s)gl_pick $2 ; shift 2 ;;
   --default|-d)export GL_LIB ; shift ; gl_pick $GL_LIB ;;
              *)gl_usage ;;
    esac
  else
    shift
  fi
done

