Magellan Linux

Contents of /trunk/opengl-update/opengl-update.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 620 - (show annotations) (download) (as text)
Wed Nov 14 18:18:47 2007 UTC (16 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 9595 byte(s)
-fixed env.d file generation for multilib systems

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.5 2007-11-14 18:18:47 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 . /etc/init.d/functions
15
16 hasq()
17 {
18 local x
19
20 local me=${1}
21 shift
22
23 for x in $@
24 do
25 [[ ${x} = ${me} ]] && return 0
26 done
27
28 return 1
29 }
30
31 check_user()
32 {
33 if [[ $(id -u) -ne 0 ]]
34 then
35 echo "${0}: Must be run as root."
36 exit 1
37 fi
38 }
39
40 get_current_implem()
41 {
42 local implem
43
44 if [[ -f ${ENV_D} ]]
45 then
46 source ${ENV_D}
47 if [[ -n ${OPENGL_PROFILE} ]]
48 then
49 implem="${OPENGL_PROFILE}"
50 elif [[ -n ${LDPATH} ]]
51 then
52 implem="${LDPATH%%:*}"
53 implem="${implem##*opengl/}"
54 implem="${implem%/lib*}"
55 fi
56 unset LDPATH
57 unset OPENGL_PROFILE
58 fi
59
60 echo ${implem}
61 }
62
63 get_implementations()
64 {
65 local implems
66
67 for dir in ${PREFIX}/lib{,32,64}/opengl/*
68 do
69 if [[ -d ${dir} ]] &&
70 [[ ${dir##*/} != global ]]
71 && ! hasq ${dir##*/} ${implems}
72 then
73 implems=${implems:+${implems} }${dir##*/}
74 fi
75 done
76
77 echo ${implems}
78 }
79
80 print_version()
81 {
82 echo "opengl-update ${VERSION}"
83 }
84
85 print_usage()
86 {
87 # Get grammar right in message
88 local IS_ARE IMPLEM_PLURAL
89
90 if [[ $(echo ${AVAIL_IMPLEMS} | wc -w) -eq 1 ]]
91 then
92 IS_ARE="is"
93 IMPLEM_PLURAL=""
94 else
95 IS_ARE="are"
96 IMPLEM_PLURAL="s"
97 fi
98
99 print_version
100
101 cat << FOO
102 Usage: ${0##*/} [<options>] <GL implementation>
103 Set the opengl implementation.
104 Valid options:
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 golbal 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 libGL{,core}.{a,so,la}
245 do
246 [[ -h ${file} ]] && rm -f ${file}
247 done
248
249 # Note that we don't do .so*, just .so on purpose. The
250 # loader knows to look in the profile dir, and the
251 # linked just needs the .so
252 for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/libGL{,core}.{so,a,la}
253 do
254 [[ -f ${file} ]] || continue
255 [[ -f ${file##*/} ]] && rm -f ${file##*/}
256
257 # Fix libtool archives (#48297)
258 if [[ ${file%.la} != ${file} ]]
259 then
260 sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/}
261 else
262 ln -s ${file}
263 fi
264 done
265 popd &> /dev/null
266
267 if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls ]]
268 then
269 mkdir -p ${DST_PREFIX}/${LIBDIR}/tls
270 pushd ${DST_PREFIX}/${LIBDIR}/tls &> /dev/null
271 # First remove old symlinks
272 for file in libGL{,core}.{a,so,la}
273 do
274 [[ -h ${file} ]] && rm -f ${file}
275 done
276
277 for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib/tls/libGL{,core}.{so,a,la}
278 do
279 [[ -f ${file} ]] || continue
280 [[ -f ${file##*/} ]] && rm -f ${file##*/}
281
282 # Fix libtool archives (#48297)
283 if [[ ${file%.la} != ${file} ]]
284 then
285 sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/}
286 else
287 ln -s ${file}
288 fi
289 done
290 popd &> /dev/null
291 fi
292
293 local MODULEDIR
294 if [[ -e ${DST_PREFIX}/${LIBDIR}/xorg/modules ]]
295 then
296 MODULEDIR="xorg/modules"
297 else
298 MODULEDIR="modules"
299 fi
300
301 if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions ]]
302 then
303 mkdir -p ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions
304 pushd ${DST_PREFIX}/${LIBDIR}/${MODULEDIR}/extensions &> /dev/null
305 # First remove old symlinks
306 for file in libglx.so libglx.a
307 do
308 [[ -h ${file} ]] && rm -f ${file}
309 done
310
311 for file in ${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/extensions/*.{so,a,la}
312 do
313 [[ -f ${file} ]] || continue
314 [[ -f ${file##*/} ]] && rm -f ${file##*/}
315
316 # Fix libtool archives (#48297)
317 if [[ ${file%.la} != ${file} ]]
318 then
319 sed "s:${PREFIX}/[^/]*/opengl/[^/]*/lib:${DST_PREFIX}/${LIBDIR}:g" ${file} > ${file##*/}
320 else
321 ln -s ${file}
322 fi
323 done
324 popd &> /dev/null
325 fi
326
327 # Setup the includes
328 mkdir -p ${DST_PREFIX}/include/GL
329 pushd ${DST_PREFIX}/include/GL &> /dev/null
330 for file in gl.h glx.h glxtokens.h glext.h glxext.h glxmd.h glxproto.h
331 do
332 # IMPORTANT
333 # It is preferable currently to use the standard glext.h file
334 # however if an OpenGL provider must use a self produced glext.h
335 # then it should be installed to ${GL_IMPLEM}/include and the user
336 # can add the --impl-headers option to select it.
337
338 if [[ ${USE_PROFILE_HEADERS} = yes ]]
339 then
340 # Check the profile first.
341 if [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} ]]
342 then
343 [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
344 ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file}
345 fi
346 continue
347 fi
348
349 if [[ -e ${PREFIX}/${LIBDIR}/opengl/global/include/${file} ]]
350 then
351 [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
352 ln -s ${PREFIX}/${LIBDIR}/opengl/global/include/${file}
353 elif [[ -e ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file} ]]
354 then
355 [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
356 ln -s ${PREFIX}/${LIBDIR}/opengl/${GL_IMPLEM}/include/${file}
357 elif [[ -e ${PREFIX}/${LIBDIR}/opengl/xorg/include/${file} ]]
358 then
359 [[ -f "${file}" || ( -L "${file}" && ! -e "${file}" ) ]] && rm -f ${file}
360 ln -s ${PREFIX}/${LIBDIR}/opengl/xorg/include/${file}
361 fi
362 done
363 popd &> /dev/null
364
365 # Setup the $LDPATH
366 ldpath="${ldpath:+${ldpath}:}${PREFIX}/${LIBDIR}/opengl/${GL_LOCAL}/lib"
367
368 done
369
370 local i
371 for i in $(echo ${ldpath} | sed "s:\::\ :g")
372 do
373 echo "LDPATH=\"${i}\"" >> ${ENV_D}
374 done
375 echo "OPENGL_PROFILE=\"${GL_IMPLEM}\"" >> ${ENV_D}
376
377 env-rebuild
378
379 return 0
380 }
381
382 ## START PROGRAM ##
383
384 ENV_D="/etc/env.d/03opengl"
385 NEW_GL_IMPLEM=""
386 ACTION=""
387 PREFIX="/usr"
388 DST_PREFIX="/usr"
389 AVAIL_IMPLEMS=$(get_implementations)
390 CURRENT_GL_IMPLEM=$(get_current_implem)
391 USE_PROFILE_HEADERS="no"
392 VERSION="@@VERSION@@"
393
394 parse_options ${@}
395
396 case ${ACTION} in
397 get-implementation)
398 if [[ -n ${CURRENT_GL_IMPLEM} ]]
399 then
400 echo ${CURRENT_GL_IMPLEM}
401 exit 0
402 else
403 exit 2
404 fi
405 ;;
406
407 old-implementation)
408 set-new-implementation ${CURRENT_GL_IMPLEM}
409 exit $?
410 ;;
411
412 set-implementation)
413 if [[ -n ${NEW_GL_IMPLEM} ]]
414 then
415 set-new-implementation ${NEW_GL_IMPLEM}
416 exit $?
417 else
418 print_usage
419 exit 1
420 fi
421 ;;
422
423 version)
424 print_version
425 exit 0
426 ;;
427
428 usage)
429 print_usage
430 exit 0
431 ;;
432
433 error)
434 print_usage
435 exit 1
436 ;;
437
438 *)
439 print_usage
440 exit 1
441 ;;
442 esac