Contents of /tags/openglupdate-2_3_9/opengl-update.in
Parent Directory | Revision Log
Revision 2200 -
(show annotations)
(download)
Fri Oct 11 12:54:34 2013 UTC (10 years, 11 months ago) by niro
File size: 10509 byte(s)
Fri Oct 11 12:54:34 2013 UTC (10 years, 11 months ago) by niro
File size: 10509 byte(s)
tagged 'openglupdate-2_3_9'
1 | #!/bin/bash |
2 | # Copyright 1999-2004 Gentoo Foundation |
3 | # Distributed under the terms of the GNU General Public License v2 |
4 | # $Header: /home/cvsd/magellan-cvs/magellan-src/opengl-update/opengl-update.sh,v 1.10 2007-11-14 19:19:16 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 | # hacked for use with magellan-linux |
11 | # <niro@magellan-linux.de> |
12 | # |
13 | |
14 | hasq() |
15 | { |
16 | local x |
17 | |
18 | local me=${1} |
19 | shift |
20 | |
21 | for x in $@ |
22 | do |
23 | [[ ${x} = ${me} ]] && return 0 |
24 | done |
25 | |
26 | return 1 |
27 | } |
28 | |
29 | check_user() |
30 | { |
31 | if [[ $(id -u) -ne 0 ]] |
32 | then |
33 | echo "${0}: Must be run as root." |
34 | exit 1 |
35 | fi |
36 | } |
37 | |
38 | get_current_implem() |
39 | { |
40 | local implem |
41 | |
42 | if [[ -f ${ENV_D} ]] |
43 | then |
44 | source ${ENV_D} |
45 | if [[ -n ${OPENGL_PROFILE} ]] |
46 | then |
47 | implem="${OPENGL_PROFILE}" |
48 | elif [[ -n ${LDPATH} ]] |
49 | then |
50 | implem="${LDPATH%%:*}" |
51 | implem="${implem##*opengl/}" |
52 | implem="${implem%/lib*}" |
53 | fi |
54 | unset LDPATH |
55 | unset OPENGL_PROFILE |
56 | fi |
57 | |
58 | echo ${implem} |
59 | } |
60 | |
61 | get_implementations() |
62 | { |
63 | local implems |
64 | |
65 | for dir in ${PREFIX}/lib{,32,64}/opengl/* |
66 | do |
67 | if [[ -d ${dir} ]] && |
68 | [[ ${dir##*/} != global ]] && |
69 | ! hasq ${dir##*/} ${implems} |
70 | then |
71 | implems=${implems:+${implems} }${dir##*/} |
72 | fi |
73 | done |
74 | |
75 | echo ${implems} |
76 | } |
77 | |
78 | print_version() |
79 | { |
80 | echo "opengl-update ${VERSION}" |
81 | } |
82 | |
83 | print_usage() |
84 | { |
85 | # Get grammar right in message |
86 | local IS_ARE IMPLEM_PLURAL |
87 | |
88 | if [[ $(echo ${AVAIL_IMPLEMS} | wc -w) -eq 1 ]] |
89 | then |
90 | IS_ARE="is" |
91 | IMPLEM_PLURAL="" |
92 | else |
93 | IS_ARE="are" |
94 | IMPLEM_PLURAL="s" |
95 | fi |
96 | |
97 | print_version |
98 | |
99 | cat << FOO |
100 | Usage: ${0##*/} [<options>] <GL implementation> |
101 | Set the opengl implementation. |
102 | Valid options: |
103 | --help|-h|-?: Prints this help. |
104 | --version: Shows the version of this utility. |
105 | --use-old: If an implementation is already set, use that one. |
106 | --prefix=<val>: Set the source prefix (default: /usr) |
107 | --dst-prefix=<val>: Set the destination prefix (default: /usr) |
108 | --impl-headers: Use headers provided by this implementation to |
109 | override global ones provided by opengl-update. |
110 | |
111 | Usage: ${0##*/} --get-implementation |
112 | Print the current implementaion |
113 | |
114 | Notes: |
115 | --impl-headers was default in <opengl-update-2.2. |
116 | |
117 | This utility switches between OpenGL implementations. There ${IS_ARE} |
118 | $(echo ${AVAIL_IMPLEMS} | wc -w) available implementation${IMPLEM_PLURAL}: ${AVAIL_IMPLEMS} |
119 | |
120 | Examples: |
121 | ${0##*/} xorg |
122 | This will setup things to use libGL.so from X.org. |
123 | |
124 | ${0##*/} nvidia |
125 | This will setup things to use libGL.so from the nVidia drivers. |
126 | |
127 | FOO |
128 | exit 1 |
129 | } |
130 | |
131 | parse_options() |
132 | { |
133 | local opt |
134 | |
135 | while [[ ${#} -gt 0 ]] |
136 | do |
137 | opt=${1} |
138 | shift |
139 | case ${opt} in |
140 | --use-old) |
141 | if [[ -n ${ACTION} ]] |
142 | then |
143 | ACTION="error" |
144 | echo "Invalid usage." |
145 | else |
146 | if [[ -n "${CURRENT_GL_IMPLEM}" ]] && |
147 | hasq ${CURRENT_GL_IMPLEM} ${AVAIL_IMPLEMS} |
148 | then |
149 | ACTION="old-implementation" |
150 | fi |
151 | fi |
152 | ;; |
153 | |
154 | --get-implementation) |
155 | if [[ -n ${ACTION} ]] |
156 | then |
157 | ACTION="error" |
158 | echo "Invalid usage." |
159 | else |
160 | ACTION="get-implementation" |
161 | fi |
162 | ;; |
163 | |
164 | --prefix=*) |
165 | PREFIX=${opt#*=} |
166 | AVAIL_IMPLEMS=$(get_implementations) |
167 | ;; |
168 | |
169 | --dst-prefix=*) DST_PREFIX=${opt#*=} ;; |
170 | |
171 | --impl-headers) USE_PROFILE_HEADERS="yes" ;; |
172 | |
173 | --help|-h|-?) ACTION="usage" ;; |
174 | |
175 | --version) ACTION="version" ;; |
176 | |
177 | *) |
178 | if hasq ${opt} ${AVAIL_IMPLEMS} |
179 | then |
180 | if [[ ${ACTION} != old-implementation ]] |
181 | then |
182 | if [[ -n ${ACTION} ]] |
183 | then |
184 | ACTION="error" |
185 | echo "Invalid usage." |
186 | else |
187 | ACTION="set-implementation" |
188 | NEW_GL_IMPLEM="${opt}" |
189 | fi |
190 | fi |
191 | else |
192 | echo "Unrecognized option: ${opt}" |
193 | ACTION="error" |
194 | fi |
195 | ;; |
196 | esac |
197 | done |
198 | } |
199 | |
200 | set_new_implementation() |
201 | { |
202 | local GL_IMPLEM=${1} |
203 | local GL_LOCAL |
204 | |
205 | check_user |
206 | |
207 | # Set a sane umask... bug #83115 |
208 | umask 022 |
209 | |
210 | if ! hasq ${GL_IMPLEM} ${AVAIL_IMPLEMS} |
211 | then |
212 | echo "Invalid profile selected." |
213 | exit 1 |
214 | fi |
215 | |
216 | echo "Switching to ${GL_IMPLEM} OpenGL interface" |
217 | |
218 | rm -f ${ENV_D} &> /dev/null |
219 | |
220 | LIBDIRS="lib32 lib lib64" |
221 | for LIBDIR in ${LIBDIRS} |
222 | do |
223 | # Special case handling of lib32 because it can be a symlink to |
224 | # emul libs |
225 | if [[ ${LIBDIR} = lib32 ]] |
226 | then |
227 | [[ -d ${PREFIX}/${LIBDIR}/opengl ]] || continue |
228 | else |
229 | [[ -d ${PREFIX}/${LIBDIR}/opengl ]] && |
230 | [[ ! -h ${PREFIX}/${LIBDIR} ]] || continue |
231 | fi |
232 | |
233 | # Fallback on xorg if we don't have this implementation for this LIBDIR. |
234 | if [[ ! -d ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM} ]] |
235 | then |
236 | GL_LOCAL="xorg" |
237 | else |
238 | GL_LOCAL="${GL_IMPLEM}" |
239 | fi |
240 | |
241 | mkdir -p ${DST_PREFIX}/${LIBDIR} |
242 | pushd ${DST_PREFIX}/${LIBDIR} &> /dev/null |
243 | # First remove old symlinks |
244 | for file in lib{EGL,GL*,OpenVG}{,core}.{so,dylib,a,la} |
245 | do |
246 | # exclude libGLU |
247 | [[ ${file} = libGLU.so ]] && continue |
248 | [[ -h ${file} ]] && rm -f ${file} |
249 | done |
250 | |
251 | # Note that we don't do .so*, just .so on purpose. The |
252 | # loader knows to look in the profile dir, and the |
253 | # linked just needs the .so |
254 | for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/lib{EGL,GL*,OpenVG}{,core}.{so,dylib,a,la} |
255 | do |
256 | [[ -f ${file} ]] || continue |
257 | [[ -f ${file##*/} ]] && rm -f ${file##*/} |
258 | |
259 | # Fix libtool archives (#48297) |
260 | if [[ ${file%.la} != ${file} ]] |
261 | then |
262 | sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/} |
263 | else |
264 | ln -s ${file} |
265 | fi |
266 | done |
267 | popd &> /dev/null |
268 | |
269 | if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls ]] |
270 | then |
271 | mkdir -p ${DST_PREFIX}/${LIBDIR}/tls |
272 | pushd ${DST_PREFIX}/${LIBDIR}/tls &> /dev/null |
273 | # First remove old symlinks |
274 | for file in lib{EGL,GL*,OpenVG}{,core}.{so,dylib,a,la} |
275 | do |
276 | # exclude libGLU |
277 | [[ ${file} = libGLU.so ]] && continue |
278 | [[ -h ${file} ]] && rm -f ${file} |
279 | done |
280 | |
281 | for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls/lib{EGL,GL*,OpenVG}{,core}.{so,dylib,a,la} |
282 | do |
283 | [[ -f ${file} ]] || continue |
284 | [[ -f ${file##*/} ]] && rm -f ${file##*/} |
285 | |
286 | # Fix libtool archives (#48297) |
287 | if [[ ${file%.la} != ${file} ]] |
288 | then |
289 | sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/} |
290 | else |
291 | ln -s ${file} |
292 | fi |
293 | done |
294 | popd &> /dev/null |
295 | fi |
296 | |
297 | local MODULEDIR |
298 | if [[ -e ${DST_PREFIX}/${LIBDIR}/xorg/modules ]] |
299 | then |
300 | MODULEDIR="xorg/modules" |
301 | else |
302 | MODULEDIR="modules" |
303 | fi |
304 | |
305 | if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions ]] |
306 | then |
307 | mkdir -p ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions |
308 | pushd ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions &> /dev/null |
309 | # First remove old symlinks |
310 | for file in lib{wfb,glx,dri,dri2}.{so,dylib,a} |
311 | do |
312 | [[ -h ${file} ]] && rm -f ${file} |
313 | done |
314 | |
315 | for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions/*.{so,a,la} |
316 | do |
317 | [[ -f ${file} ]] || continue |
318 | [[ -f ${file##*/} ]] && rm -f ${file##*/} |
319 | |
320 | # Fix libtool archives (#48297) |
321 | if [[ ${file%.la} != ${file} ]] |
322 | then |
323 | sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/} |
324 | else |
325 | ln -s ${file} |
326 | fi |
327 | done |
328 | popd &> /dev/null |
329 | fi |
330 | |
331 | # Setup the includes |
332 | local -A headers |
333 | headers[GL]="gl.h glx.h glxtokens.h glext.h glxext.h glxmd.h glxproto.h" |
334 | headers[GLES]="egl.h gl_extensions.h glext.h gl.h glplatform.h" |
335 | headers[GLES2]="gl2ext.h gl2.h gl2platform.h" |
336 | headers[GLES3]="gl3ext.h gl3.h gl3platform.h" |
337 | headers[EGL]="eglext.h egl.h eglmesaext.h eglplatform.h" |
338 | headers[KHR]="khrplatform.h" |
339 | headers[VG]="openvg.h vgext.h vgplatform.h vgu.h" |
340 | for incl_dir in EGL GL GLES GLES2 GLES3 KHR VG |
341 | do |
342 | mkdir -p ${DST_PREFIX}/include/${incl_dir} |
343 | pushd ${DST_PREFIX}/include/${incl_dir} &> /dev/null |
344 | for file in ${headers[${incl_dir}]} |
345 | do |
346 | # IMPORTANT |
347 | # It is preferable currently to use the standard glext.h file |
348 | # however if an OpenGL provider must use a self produced glext.h |
349 | # then it should be installed to ${GL_IMPLEM}/include and the user |
350 | # can add the --impl-headers option to select it. |
351 | if [[ ${USE_PROFILE_HEADERS} = yes ]] |
352 | then |
353 | # Check the profile first. |
354 | if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${incl_dir}/${file} ]] |
355 | then |
356 | [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} |
357 | ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${incl_dir}/${file} |
358 | fi |
359 | continue |
360 | fi |
361 | |
362 | if [[ -e ${PREFIX}/${LIBDIR}/opengl/global/include/${incl_dir}/${file} ]] |
363 | then |
364 | [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} |
365 | ln -s ${PREFIX}/${LIBDIR}/opengl/global/include/${incl_dir}/${file} |
366 | elif [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${incl_dir}/${file} ]] |
367 | then |
368 | [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} |
369 | ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${incl_dir}/${file} |
370 | elif [[ -e ${PREFIX}/${LIBDIR}/opengl/xorg/include/${incl_dir}/${file} ]] |
371 | then |
372 | [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file} |
373 | ln -s ${PREFIX}/${LIBDIR}/opengl/xorg/include/${incl_dir}/${file} |
374 | fi |
375 | done |
376 | popd &> /dev/null |
377 | done |
378 | |
379 | # Setup the $LDPATH |
380 | ldpath="${ldpath:+${ldpath}:}${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib" |
381 | |
382 | done |
383 | |
384 | # put only one LDPATH per line! |
385 | local i |
386 | for i in $(echo ${ldpath} | sed "s:\::\ :g") |
387 | do |
388 | echo "LDPATH=\"${i}\"" >> ${ENV_D} |
389 | done |
390 | echo "OPENGL_PROFILE=\"${GL_IMPLEM}\"" >> ${ENV_D} |
391 | |
392 | env-rebuild |
393 | |
394 | return 0 |
395 | } |
396 | |
397 | ## START PROGRAM ## |
398 | |
399 | ENV_D="/etc/env.d/03opengl" |
400 | NEW_GL_IMPLEM="" |
401 | ACTION="" |
402 | PREFIX="/usr" |
403 | DST_PREFIX="/usr" |
404 | AVAIL_IMPLEMS=$(get_implementations) |
405 | CURRENT_GL_IMPLEM=$(get_current_implem) |
406 | USE_PROFILE_HEADERS="no" |
407 | VERSION="@@VERSION@@" |
408 | |
409 | parse_options ${@} |
410 | |
411 | case ${ACTION} in |
412 | get-implementation) |
413 | if [[ -n ${CURRENT_GL_IMPLEM} ]] |
414 | then |
415 | echo ${CURRENT_GL_IMPLEM} |
416 | exit 0 |
417 | else |
418 | exit 2 |
419 | fi |
420 | ;; |
421 | |
422 | old-implementation) |
423 | set_new_implementation ${CURRENT_GL_IMPLEM} |
424 | exit $? |
425 | ;; |
426 | |
427 | set-implementation) |
428 | if [[ -n ${NEW_GL_IMPLEM} ]] |
429 | then |
430 | set_new_implementation ${NEW_GL_IMPLEM} |
431 | exit $? |
432 | else |
433 | print_usage |
434 | exit 1 |
435 | fi |
436 | ;; |
437 | |
438 | version) |
439 | print_version |
440 | exit 0 |
441 | ;; |
442 | |
443 | usage) |
444 | print_usage |
445 | exit 0 |
446 | ;; |
447 | |
448 | error) |
449 | print_usage |
450 | exit 1 |
451 | ;; |
452 | |
453 | *) |
454 | print_usage |
455 | exit 1 |
456 | ;; |
457 | esac |