#!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /home/cvsd/magellan-cvs/magellan-src/opengl-update/opengl-update.sh,v 1.6 2007-11-14 18:20:10 niro Exp $ # Author: Martin Schlemmer # Further modifications by Donnie Berkholz # Further modifications based off submissions to bug #54984 # Further modifications by Jeremy Huddleston # # hacked for use with magellan-linux # # . /etc/init.d/functions hasq() { local x local me=${1} shift for x in $@ do [[ ${x} = ${me} ]] && return 0 done return 1 } check_user() { if [[ $(id -u) -ne 0 ]] then echo "${0}: Must be run as root." exit 1 fi } get_current_implem() { local implem if [[ -f ${ENV_D} ]] then source ${ENV_D} if [[ -n ${OPENGL_PROFILE} ]] then implem="${OPENGL_PROFILE}" elif [[ -n ${LDPATH} ]] then implem="${LDPATH%%:*}" implem="${implem##*opengl/}" implem="${implem%/lib*}" fi unset LDPATH unset OPENGL_PROFILE fi echo ${implem} } get_implementations() { local implems for dir in ${PREFIX}/lib{,32,64}/opengl/* do if [[ -d ${dir} ]] && [[ ${dir##*/} != global ]] && ! hasq ${dir##*/} ${implems} then implems=${implems:+${implems} }${dir##*/} fi done echo ${implems} } print_version() { echo "opengl-update ${VERSION}" } print_usage() { # Get grammar right in message local IS_ARE IMPLEM_PLURAL if [[ $(echo ${AVAIL_IMPLEMS} | wc -w) -eq 1 ]] then IS_ARE="is" IMPLEM_PLURAL="" else IS_ARE="are" IMPLEM_PLURAL="s" fi print_version cat << FOO Usage: ${0##*/} [] Set the opengl implementation. Valid options: --use-old: If an implementation is already set, use that one. --prefix=: Set the source prefix (default: /usr) --dst-prefix=: Set the destination prefix (default: /usr) --impl-headers: Use headers provided by this implementation to override golbal ones provided by opengl-update. Usage: ${0##*/} --get-implementation Print the current implementaion Notes: --impl-headers was default in /dev/null LIBDIRS="lib32 lib lib64" for LIBDIR in ${LIBDIRS} do # Special case handling of lib32 because it can be a symlink to # emul libs if [[ ${LIBDIR} = lib32 ]] then [[ -d ${PREFIX}/${LIBDIR}/opengl ]] || continue else [[ -d ${PREFIX}/${LIBDIR}/opengl ]] && ! -h ${PREFIX}/${LIBDIR} ]] || continue fi # Fallback on xorg if we don't have this implementation for this LIBDIR. if [[ ! -d ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM} ]] then GL_LOCAL="xorg" else GL_LOCAL="${GL_IMPLEM}" fi mkdir -p ${DST_PREFIX}/${LIBDIR} pushd ${DST_PREFIX}/${LIBDIR} &> /dev/null # First remove old symlinks for file in libGL{,core}.{a,so,la} do [[ -h ${file} ]] && rm -f ${file} done # Note that we don't do .so*, just .so on purpose. The # loader knows to look in the profile dir, and the # linked just needs the .so for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/libGL{,core}.{so,a,la} do [[ -f ${file} ]] || continue [[ -f ${file##*/} ]] && rm -f ${file##*/} # Fix libtool archives (#48297) if [[ ${file%.la} != ${file} ]] then sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/} else ln -s ${file} fi done popd &> /dev/null if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls ]] then mkdir -p ${DST_PREFIX}/${LIBDIR}/tls pushd ${DST_PREFIX}/${LIBDIR}/tls &> /dev/null # First remove old symlinks for file in libGL{,core}.{a,so,la} do [[ -h ${file} ]] && rm -f ${file} done for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls/libGL{,core}.{so,a,la} do [[ -f ${file} ]] || continue [[ -f ${file##*/} ]] && rm -f ${file##*/} # Fix libtool archives (#48297) if [[ ${file%.la} != ${file} ]] then sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/} else ln -s ${file} fi done popd &> /dev/null fi local MODULEDIR if [[ -e ${DST_PREFIX}/${LIBDIR}/xorg/modules ]] then MODULEDIR="xorg/modules" else MODULEDIR="modules" fi if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions ]] then mkdir -p ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions pushd ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions &> /dev/null # First remove old symlinks for file in libglx.so libglx.a do [[ -h ${file} ]] && rm -f ${file} done for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions/*.{so,a,la} do [[ -f ${file} ]] || continue [[ -f ${file##*/} ]] && rm -f ${file##*/} # Fix libtool archives (#48297) if [[ ${file%.la} != ${file} ]] then sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/} else ln -s ${file} fi done popd &> /dev/null fi # Setup the includes mkdir -p ${DST_PREFIX}/include/GL pushd ${DST_PREFIX}/include/GL &> /dev/null for file in gl.h glx.h glxtokens.h glext.h glxext.h glxmd.h glxproto.h do # IMPORTANT # It is preferable currently to use the standard glext.h file # however if an OpenGL provider must use a self produced glext.h # then it should be installed to ${GL_IMPLEM}/include and the user # can add the --impl-headers option to select it. if [[ ${USE_PROFILE_HEADERS} = yes ]] then # Check the profile first. if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} ]] then [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} fi continue fi if [[ -e ${PREFIX}/${LIBDIR}/opengl/global/include/${file} ]] then [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} ln -s ${PREFIX}/${LIBDIR}/opengl/global/include/${file} elif [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} ]] then [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} elif [[ -e ${PREFIX}/${LIBDIR}/opengl/xorg/include/${file} ]] then [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} ln -s ${PREFIX}/${LIBDIR}/opengl/xorg/include/${file} fi done popd &> /dev/null # Setup the $LDPATH ldpath="${ldpath:+${ldpath}:}${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib" done # put only one LDPATH per line! local i for i in $(echo ${ldpath} | sed "s:\::\ :g") do echo "LDPATH=\"${i}\"" >> ${ENV_D} done echo "OPENGL_PROFILE=\"${GL_IMPLEM}\"" >> ${ENV_D} env-rebuild return 0 } ## START PROGRAM ## ENV_D="/etc/env.d/03opengl" NEW_GL_IMPLEM="" ACTION="" PREFIX="/usr" DST_PREFIX="/usr" AVAIL_IMPLEMS=$(get_implementations) CURRENT_GL_IMPLEM=$(get_current_implem) USE_PROFILE_HEADERS="no" VERSION="@@VERSION@@" parse_options ${@} case ${ACTION} in get-implementation) if [[ -n ${CURRENT_GL_IMPLEM} ]] then echo ${CURRENT_GL_IMPLEM} exit 0 else exit 2 fi ;; old-implementation) set-new-implementation ${CURRENT_GL_IMPLEM} exit $? ;; set-implementation) if [[ -n ${NEW_GL_IMPLEM} ]] then set-new-implementation ${NEW_GL_IMPLEM} exit $? else print_usage exit 1 fi ;; version) print_version exit 0 ;; usage) print_usage exit 0 ;; error) print_usage exit 1 ;; *) print_usage exit 1 ;; esac