Magellan Linux

Annotation of /trunk/opengl-update-magellan/opengl-update-2.2.4

Parent Directory Parent Directory | Revision Log Revision Log


Revision 153 - (hide annotations) (download)
Tue May 8 20:52:56 2007 UTC (17 years ago) by niro
File size: 9852 byte(s)
-import

1 niro 153 #!/bin/bash
2     # Copyright 1999-2004 Gentoo Foundation
3     # Distributed under the terms of the GNU General Public License v2
4     # $Header: /root/magellan-cvs/src/opengl-update-magellan/opengl-update-2.2.4,v 1.1 2007-05-08 20:26:04 niro Exp $
5     # Author: Martin Schlemmer <azarah@gentoo.org>
6     # Further modifications by Donnie Berkholz <spyderous@gentoo.org>
7     # Further modifications based off submissions to bug #54984 <cyfred@gentoo.org>
8     # Further modifications by Jeremy Huddleston <eradicator@gentoo.org>
9    
10     . /etc/init.d/functions.sh
11    
12     hasq() {
13     local x
14    
15     local me=${1}
16     shift
17    
18     for x in "${@}"; do
19     if [[ "${x}" == "${me}" ]]; then
20     return 0
21     fi
22     done
23     return 1
24     }
25    
26     check_user() {
27     if [[ $(id -u) -ne 0 ]]; then
28     eerror "${0}: Must be run as root."
29     exit 1
30     fi
31     }
32    
33     check_version() {
34     if portageq has_version / 'x11-base/xorg-x11'; then
35     if ! portageq has_version / '>=x11-base/xorg-x11-6.8.0-r4'; then
36     eerror "This version requires >=x11-base/xorg-x11-6.8.0-r4"
37     exit 1
38     fi
39     fi
40     }
41    
42     get_current_implem() {
43     local implem
44     if [[ -f ${ENV_D} ]]; then
45     source ${ENV_D}
46     if [[ -n "${OPENGL_PROFILE}" ]]; then
47     implem="${OPENGL_PROFILE}"
48     elif [[ -n "${LDPATH}" ]]; then
49     implem="${LDPATH%%:*}"
50     implem="${implem##*opengl/}"
51     implem="${implem%/lib*}"
52     fi
53     unset LDPATH
54     unset OPENGL_PROFILE
55     fi
56    
57     echo ${implem}
58     }
59    
60     get_implementations() {
61     local implems
62     for dir in ${PREFIX}/lib{,32,64}/opengl/*; do
63     if [[ -d "${dir}" && ${dir##*/} != "global" ]] && ! hasq ${dir##*/} ${implems}; then
64     implems=${implems:+${implems} }${dir##*/}
65     fi
66     done
67     echo ${implems}
68     }
69    
70     print_version() {
71     echo "opengl-update ${VERSION}"
72     }
73    
74     print_usage() {
75     # Get grammar right in message
76     local IS_ARE IMPLEM_PLURAL
77     if [[ $(echo ${AVAIL_IMPLEMS} | wc -w) -eq 1 ]]; then
78     IS_ARE="is"
79     IMPLEM_PLURAL=""
80     else
81     IS_ARE="are"
82     IMPLEM_PLURAL="s"
83     fi
84    
85     print_version
86    
87     cat << FOO
88     Usage: ${0##*/} [<options>] <GL implementation>
89     Set the opengl implementation.
90     Valid options:
91     --use-old: If an implementation is already set, use that one.
92     --prefix=<val>: Set the source prefix (default: /usr)
93     --dst-prefix=<val>: Set the destination prefix (default: /usr)
94     --impl-headers: Use headers provided by this implementation to
95     override golbal ones provided by opengl-update.
96    
97     Usage: ${0##*/} --get-implementation
98     Print the current implementaion
99    
100     Notes:
101     --impl-headers was default in <opengl-update-2.2.
102    
103     This utility switches between OpenGL implementations. There ${IS_ARE}
104     $(echo ${AVAIL_IMPLEMS} | wc -w) available implementation${IMPLEM_PLURAL}: ${AVAIL_IMPLEMS}
105    
106     Examples:
107     ${0##*/} xorg-x11
108     This will setup things to use libGL.so from X.org.
109    
110     ${0##*/} nvidia
111     This will setup things to use libGL.so from the nVidia drivers.
112    
113     FOO
114     exit 1
115     }
116    
117     parse_options() {
118     local opt
119     while [[ ${#} -gt 0 ]]; do
120     opt=${1}
121     shift
122     case ${opt} in
123     --use-old)
124     if [[ -n "${ACTION}" ]]; then
125     ACTION="error"
126     eerror "Invalid usage."
127     else
128     if [[ -n "${CURRENT_GL_IMPLEM}" ]] && hasq ${CURRENT_GL_IMPLEM} ${AVAIL_IMPLEMS}; then
129     ACTION="old-implementation"
130     fi
131     fi
132     ;;
133     --get-implementation)
134     if [[ -n "${ACTION}" ]]; then
135     ACTION="error"
136     eerror "Invalid usage."
137     else
138     ACTION="get-implementation"
139     fi
140     ;;
141     --prefix=*)
142     PREFIX=${opt#*=}
143     AVAIL_IMPLEMS=$(get_implementations)
144     ;;
145     --dst-prefix=*)
146     DST_PREFIX=${opt#*=}
147     ;;
148     --impl-headers)
149     USE_PROFILE_HEADERS="yes"
150     ;;
151     --help|-h|-?)
152     ACION="usage"
153     ;;
154     --version)
155     ACTION="version"
156     ;;
157     *)
158     if hasq ${opt} ${AVAIL_IMPLEMS}; then
159     if [[ "${ACTION}" != "old-implementation" ]]; then
160     if [[ -n "${ACTION}" ]]; then
161     ACTION="error"
162     eerror "Invalid usage."
163     else
164     ACTION="set-implementation"
165     NEW_GL_IMPLEM="${opt}"
166     fi
167     fi
168     else
169     eerror "Unrecognized option: ${opt}"
170     ACTION="error"
171     fi
172     ;;
173     esac
174     done
175     }
176    
177     set-new-implementation() {
178     local GL_IMPLEM=${1}
179     local GL_LOCAL
180    
181     check_version
182     check_user
183    
184     # Set a sane umask... bug #83115
185     umask 022
186    
187     if ! hasq ${GL_IMPLEM} ${AVAIL_IMPLEMS}; then
188     eerror "Invalid profile selected."
189     exit 1
190     fi
191    
192     ebegin "Switching to ${GL_IMPLEM} OpenGL interface"
193     rm -f ${ENV_D} &> /dev/null
194    
195     LIBDIRS="lib32 lib lib64"
196     for LIBDIR in ${LIBDIRS}; do
197     # Special case handling of lib32 because it can be a symlink to
198     # emul libs
199     if [[ "${LIBDIR}" = "lib32" ]]; then
200     [[ -d "${PREFIX}/${LIBDIR}/opengl" ]] || continue
201     else
202     [[ -d "${PREFIX}/${LIBDIR}/opengl" && ! -h "${PREFIX}/${LIBDIR}" ]] || continue
203     fi
204    
205     # Fallback on xorg-x11 if we don't have this implementation for this LIBDIR.
206     if [[ ! -d ${PREFIX}/${LIBDIR}/opengl/"${GL_IMPLEM}" ]]; then
207     GL_LOCAL="xorg-x11"
208     else
209     GL_LOCAL="${GL_IMPLEM}"
210     fi
211    
212     mkdir -p ${DST_PREFIX}/${LIBDIR}
213     pushd ${DST_PREFIX}/${LIBDIR} &> /dev/null
214     # First remove old symlinks
215     for file in libGL{,core}.{a,so,la} ; do
216     [[ -h ${file} ]] && rm -f ${file}
217     done
218    
219     # Note that we don't do .so*, just .so on purpose. The
220     # loader knows to look in the profile dir, and the
221     # linked just needs the .so
222     for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/libGL{,core}.{so,a,la}; do
223     [[ -f "${file}" ]] || continue
224     [[ -f "${file##*/}" ]] && rm -f ${file##*/}
225    
226     # Fix libtool archives (#48297)
227     if [[ "${file%.la}" != "${file}" ]]; then
228     sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/}
229     else
230     ln -s ${file}
231     fi
232     done
233     popd &> /dev/null
234    
235     if [[ -e "${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls" ]]; then
236     mkdir -p ${DST_PREFIX}/${LIBDIR}/tls
237     pushd ${DST_PREFIX}/${LIBDIR}/tls &> /dev/null
238     # First remove old symlinks
239     for file in libGL{,core}.{a,so,la} ; do
240     [[ -h ${file} ]] && rm -f ${file}
241     done
242    
243     for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls/libGL{,core}.{so,a,la}; do
244     [[ -f "${file}" ]] || continue
245     [[ -f "${file##*/}" ]] && rm -f ${file##*/}
246    
247     # Fix libtool archives (#48297)
248     if [ "${file%.la}" != "${file}" ]; then
249     sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/}
250     else
251     ln -s ${file}
252     fi
253     done
254     popd &> /dev/null
255     fi
256    
257     local MODULEDIR
258     if [[ -e "${DST_PREFIX}/${LIBDIR}/xorg/modules" ]]; then
259     MODULEDIR="xorg/modules"
260     else
261     MODULEDIR="modules"
262     fi
263    
264     if [[ -e "${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions" ]]; then
265     mkdir -p ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions
266     pushd ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions &> /dev/null
267     # First remove old symlinks
268     for file in libglx.so libglx.a; do
269     [[ -h ${file} ]] && rm -f ${file}
270     done
271    
272     for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions/*.{so,a,la}; do
273     [[ -f "${file}" ]] || continue
274     [[ -f "${file##*/}" ]] && rm -f ${file##*/}
275    
276     # Fix libtool archives (#48297)
277     if [[ "${file%.la}" != "${file}" ]]; then
278     sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/}
279     else
280     ln -s ${file}
281     fi
282     done
283     popd &> /dev/null
284     fi
285    
286     # Setup the includes
287     mkdir -p ${DST_PREFIX}/include/GL
288     pushd ${DST_PREFIX}/include/GL &> /dev/null
289     for file in gl.h glx.h glxtokens.h glext.h glxext.h glxmd.h glxproto.h; do
290     # IMPORTANT
291     # It is preferable currently to use the standard glext.h file
292     # however if an OpenGL provider must use a self produced glext.h
293     # then it should be installed to ${GL_IMPLEM}/include and the user
294     # can add the --impl-headers option to select it.
295    
296     if [[ ${USE_PROFILE_HEADERS} == "yes" ]] ; then
297     # Check the profile first.
298     if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} ]]; then
299     [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
300     ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file}
301     fi
302     continue
303     fi
304    
305     if [[ -e ${PREFIX}/${LIBDIR}/opengl/global/include/${file} ]]; then
306     [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
307     ln -s ${PREFIX}/${LIBDIR}/opengl/global/include/${file}
308     elif [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} ]]; then
309     [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
310     ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file}
311     elif [[ -e ${PREFIX}/${LIBDIR}/opengl/xorg-x11/include/${file} ]]; then
312     [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
313     ln -s ${PREFIX}/${LIBDIR}/opengl/xorg-x11/include/${file}
314     fi
315     done
316     popd &> /dev/null
317    
318     # Setup the $LDPATH
319     ldpath="${ldpath:+${ldpath}:}${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib"
320    
321     done
322    
323     echo "LDPATH=\"${ldpath}\"" > ${ENV_D}
324     echo "OPENGL_PROFILE=\"${GL_IMPLEM}\"" >> ${ENV_D}
325    
326     env-update
327    
328     eend 0
329     }
330    
331     ## START PROGRAM ##
332    
333     ENV_D="/etc/env.d/03opengl"
334     NEW_GL_IMPLEM=""
335     ACTION=""
336     PREFIX="/usr"
337     DST_PREFIX="/usr"
338     AVAIL_IMPLEMS=$(get_implementations)
339     CURRENT_GL_IMPLEM=$(get_current_implem)
340     USE_PROFILE_HEADERS="no"
341     VERSION="2.2.1"
342    
343     parse_options ${@}
344    
345     case ${ACTION} in
346     get-implementation)
347     if [[ -n "${CURRENT_GL_IMPLEM}" ]]; then
348     echo ${CURRENT_GL_IMPLEM}
349     exit 0
350     else
351     exit 2
352     fi
353     ;;
354     old-implementation)
355     set-new-implementation ${CURRENT_GL_IMPLEM}
356     exit $?
357     ;;
358     set-implementation)
359     if [[ -n "${NEW_GL_IMPLEM}" ]]; then
360     set-new-implementation ${NEW_GL_IMPLEM}
361     exit $?
362     else
363     print_usage
364     exit 1
365     fi
366     ;;
367     version)
368     print_version
369     exit 0
370     ;;
371     usage)
372     print_usage
373     exit 0
374     ;;
375     error)
376     print_usage
377     exit 1
378     ;;
379     *)
380     print_usage
381     exit 1
382     ;;
383     esac