#!/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.1 2007-11-14 18:01:25 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 if [[ "${x}" == "${me}" ]]; then return 0 fi 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 echo "LDPATH=\"${ldpath}\"" > ${ENV_D} 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="2.2.4" 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