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