/[gentoo-x86]/eclass/eutils.eclass
Gentoo

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.230 - (hide annotations) (download)
Fri Mar 17 23:23:30 2006 UTC (8 years, 8 months ago) by vapier
Branch: MAIN
Changes since 1.229: +3 -2 lines
add -E to default epatch opts

1 vapier 1.154 # Copyright 1999-2005 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.230 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.229 2006/03/16 03:44:54 agriffis Exp $
4 vapier 1.18 #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@gentoo.org>
6 vapier 1.18 #
7 azarah 1.1 # This eclass is for general purpose functions that most ebuilds
8 vapier 1.7 # have to implement themselves.
9 azarah 1.1 #
10     # NB: If you add anything, please comment it!
11    
12 flameeyes 1.197 inherit multilib portability
13 azarah 1.1
14 azarah 1.185 DEPEND="!bootstrap? ( sys-devel/patch )"
15 azarah 1.181 # sys-apps/shadow is needed for useradd, etc, bug #94745.
16 azarah 1.1
17 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
18 azarah 1.1
19 ciaranm 1.98 # Wait for the supplied number of seconds. If no argument is supplied, defaults
20     # to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
21     # outputting to a terminal, don't wait. For compatability purposes, the argument
22     # must be an integer greater than zero.
23     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
24     epause() {
25     if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
26     sleep ${1:-5}
27     fi
28     }
29    
30     # Beep the specified number of times (defaults to five). If our output
31     # is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
32     # don't beep.
33     # Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
34     ebeep() {
35     local n
36     if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
37     for ((n=1 ; n <= ${1:-5} ; n++)) ; do
38     echo -ne "\a"
39     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
40     echo -ne "\a"
41     sleep 1
42     done
43     fi
44     }
45    
46 azarah 1.1 # This function generate linker scripts in /usr/lib for dynamic
47     # libs in /lib. This is to fix linking problems when you have
48     # the .so in /lib, and the .a in /usr/lib. What happens is that
49     # in some cases when linking dynamic, the .a in /usr/lib is used
50     # instead of the .so in /lib due to gcc/libtool tweaking ld's
51     # library search path. This cause many builds to fail.
52     # See bug #4411 for more info.
53     #
54     # To use, simply call:
55     #
56     # gen_usr_ldscript libfoo.so
57     #
58     # Note that you should in general use the unversioned name of
59     # the library, as ldconfig should usually update it correctly
60     # to point to the latest version of the library present.
61     #
62     # <azarah@gentoo.org> (26 Oct 2002)
63     #
64     gen_usr_ldscript() {
65 vapier 1.219 local lib libdir=$(get_libdir)
66 azarah 1.1 # Just make sure it exists
67 vapier 1.109 dodir /usr/${libdir}
68 danarmak 1.32
69 eradicator 1.163 for lib in "${@}" ; do
70     cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
71 vapier 1.161 /* GNU ld script
72 swegener 1.190 Since Gentoo has critical dynamic libraries
73     in /lib, and the static versions in /usr/lib,
74 vapier 1.161 we need to have a "fake" dynamic lib in /usr/lib,
75     otherwise we run into linking problems.
76 swegener 1.190
77 vapier 1.161 See bug http://bugs.gentoo.org/4411 for more info.
78     */
79 eradicator 1.163 GROUP ( /${libdir}/${lib} )
80 vapier 1.161 END_LDSCRIPT
81 vapier 1.219 fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
82 vapier 1.161 done
83 azarah 1.2 }
84    
85    
86     # Default directory where patches are located
87     EPATCH_SOURCE="${WORKDIR}/patch"
88     # Default extension for patches
89     EPATCH_SUFFIX="patch.bz2"
90     # Default options for patch
91 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
92 vapier 1.170 # Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
93 vapier 1.230 # Set -E to automatically remove empty files.
94     EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
95 azarah 1.6 # List of patches not to apply. Not this is only file names,
96     # and not the full path ..
97     EPATCH_EXCLUDE=""
98 azarah 1.9 # Change the printed message for a single patch.
99     EPATCH_SINGLE_MSG=""
100 vapier 1.173 # Change the printed message for multiple patches.
101     EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
102 azarah 1.29 # Force applying bulk patches even if not following the style:
103     #
104     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
105     #
106     EPATCH_FORCE="no"
107 azarah 1.2
108     # This function is for bulk patching, or in theory for just one
109     # or two patches.
110     #
111     # It should work with .bz2, .gz, .zip and plain text patches.
112     # Currently all patches should be the same format.
113     #
114     # You do not have to specify '-p' option to patch, as it will
115     # try with -p0 to -p5 until it succeed, or fail at -p5.
116     #
117     # Above EPATCH_* variables can be used to control various defaults,
118     # bug they should be left as is to ensure an ebuild can rely on
119     # them for.
120     #
121 azarah 1.3 # Patches are applied in current directory.
122     #
123     # Bulk Patches should preferibly have the form of:
124 azarah 1.2 #
125     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
126     #
127     # For example:
128     #
129     # 01_all_misc-fix.patch.bz2
130     # 02_sparc_another-fix.patch.bz2
131     #
132     # This ensures that there are a set order, and you can have ARCH
133     # specific patches.
134     #
135 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
136     # single patch that need to be applied if its a file. If on the other
137     # hand its a directory, it will set EPATCH_SOURCE to this.
138     #
139 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
140     #
141     epatch() {
142 agriffis 1.229 _epatch_draw_line() {
143     [[ -z $1 ]] && set "$(printf "%65s" '')"
144     echo "${1//?/=}"
145 vapier 1.219 }
146 vapier 1.208 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
147 azarah 1.2 local PIPE_CMD=""
148     local STDERR_TARGET="${T}/$$.out"
149 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
150     local PATCH_SUFFIX=""
151 azarah 1.3 local SINGLE_PATCH="no"
152 azarah 1.4 local x=""
153 azarah 1.3
154 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
155    
156 azarah 1.3 if [ "$#" -gt 1 ]
157     then
158 vapier 1.94 local m=""
159     for m in "$@" ; do
160     epatch "${m}"
161     done
162     return 0
163 azarah 1.3 fi
164    
165     if [ -n "$1" -a -f "$1" ]
166     then
167     SINGLE_PATCH="yes"
168 danarmak 1.32
169 azarah 1.4 local EPATCH_SOURCE="$1"
170     local EPATCH_SUFFIX="${1##*\.}"
171 danarmak 1.32
172 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
173     then
174 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
175     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
176     then
177     local EPATCH_SOURCE="$1/*"
178     else
179     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
180     fi
181 azarah 1.3 else
182 vapier 1.123 if [ ! -d ${EPATCH_SOURCE} ] || [ -n "$1" ]
183 azarah 1.8 then
184 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
185     then
186     EPATCH_SOURCE="$1"
187     fi
188    
189 azarah 1.8 echo
190 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
191     eerror
192     eerror " ${EPATCH_SOURCE}"
193 vapier 1.139 eerror " ( ${EPATCH_SOURCE##*/} )"
194 azarah 1.8 echo
195     die "Cannot find \$EPATCH_SOURCE!"
196     fi
197 danarmak 1.32
198 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
199 azarah 1.3 fi
200 azarah 1.2
201     case ${EPATCH_SUFFIX##*\.} in
202     bz2)
203     PIPE_CMD="bzip2 -dc"
204 azarah 1.8 PATCH_SUFFIX="bz2"
205 azarah 1.2 ;;
206 azarah 1.6 gz|Z|z)
207 azarah 1.2 PIPE_CMD="gzip -dc"
208 azarah 1.8 PATCH_SUFFIX="gz"
209 azarah 1.2 ;;
210 azarah 1.6 ZIP|zip)
211 azarah 1.2 PIPE_CMD="unzip -p"
212 azarah 1.8 PATCH_SUFFIX="zip"
213 azarah 1.2 ;;
214     *)
215     PIPE_CMD="cat"
216 azarah 1.8 PATCH_SUFFIX="patch"
217 azarah 1.2 ;;
218     esac
219    
220 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
221     then
222 vapier 1.173 einfo "${EPATCH_MULTI_MSG}"
223 azarah 1.3 fi
224     for x in ${EPATCH_SOURCE}
225 azarah 1.2 do
226 vapier 1.121 # New ARCH dependant patch naming scheme ...
227 azarah 1.2 #
228     # ???_arch_foo.patch
229     #
230     if [ -f ${x} ] && \
231 vapier 1.178 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
232 azarah 1.29 [ "${EPATCH_FORCE}" = "yes" ])
233 azarah 1.2 then
234     local count=0
235     local popts="${EPATCH_OPTS}"
236 eradicator 1.150 local patchname=${x##*/}
237 azarah 1.6
238     if [ -n "${EPATCH_EXCLUDE}" ]
239     then
240 eradicator 1.150 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
241 azarah 1.6 then
242     continue
243     fi
244     fi
245 danarmak 1.32
246 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
247     then
248 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
249     then
250     einfo "${EPATCH_SINGLE_MSG}"
251     else
252 eradicator 1.150 einfo "Applying ${patchname} ..."
253 azarah 1.9 fi
254 azarah 1.3 else
255 eradicator 1.150 einfo " ${patchname} ..."
256 azarah 1.3 fi
257 azarah 1.2
258 eradicator 1.150 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
259     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
260 azarah 1.2
261     # Allow for prefix to differ ... im lazy, so shoot me :/
262     while [ "${count}" -lt 5 ]
263     do
264 azarah 1.5 # Generate some useful debug info ...
265 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
266 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
267 azarah 1.8
268     if [ "${PATCH_SUFFIX}" != "patch" ]
269     then
270 eradicator 1.150 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
271     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
272 azarah 1.8 else
273     PATCH_TARGET="${x}"
274     fi
275 danarmak 1.32
276 eradicator 1.150 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
277     echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
278 danarmak 1.32
279 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
280 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
281 azarah 1.8
282     if [ "${PATCH_SUFFIX}" != "patch" ]
283     then
284 eradicator 1.150 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
285 azarah 1.8 then
286     echo
287     eerror "Could not extract patch!"
288     #die "Could not extract patch!"
289     count=5
290     break
291     fi
292     fi
293 danarmak 1.32
294 vapier 1.208 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
295 azarah 1.2 then
296 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
297 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
298     echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
299     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
300 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
301 azarah 1.8
302 eradicator 1.150 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
303 vapier 1.208 _epatch_assert
304 azarah 1.8
305     if [ "$?" -ne 0 ]
306     then
307 eradicator 1.150 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
308 azarah 1.8 echo
309     eerror "A dry-run of patch command succeeded, but actually"
310     eerror "applying the patch failed!"
311     #die "Real world sux compared to the dreamworld!"
312     count=5
313     fi
314    
315 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
316 danarmak 1.32
317 azarah 1.2 break
318     fi
319    
320     count=$((count + 1))
321     done
322    
323 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
324     then
325     rm -f ${PATCH_TARGET}
326     fi
327    
328 azarah 1.2 if [ "${count}" -eq 5 ]
329     then
330 azarah 1.8 echo
331 vapier 1.158 eerror "Failed Patch: ${patchname} !"
332     eerror " ( ${PATCH_TARGET} )"
333 azarah 1.2 eerror
334     eerror "Include in your bugreport the contents of:"
335     eerror
336 eradicator 1.150 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
337 azarah 1.8 echo
338 eradicator 1.150 die "Failed Patch: ${patchname}!"
339 azarah 1.2 fi
340 azarah 1.8
341 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
342 azarah 1.3
343     eend 0
344 azarah 1.2 fi
345     done
346 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
347     then
348     einfo "Done with patching"
349 azarah 1.10 fi
350 azarah 1.26 }
351    
352 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
353 vapier 1.80 # does not exist on the users system
354 vapier 1.52 # vapier@gentoo.org
355     #
356 vapier 1.117 # Takes just 1 optional parameter (the directory to create tmpfile in)
357     emktemp() {
358 vapier 1.119 local exe="touch"
359 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
360     local topdir=$1
361 mr_bones_ 1.100
362 vapier 1.194 if [[ -z ${topdir} ]] ; then
363     [[ -z ${T} ]] \
364 vapier 1.117 && topdir="/tmp" \
365 vapier 1.194 || topdir=${T}
366 vapier 1.117 fi
367    
368 vapier 1.194 if [[ -z $(type -p mktemp) ]] ; then
369 vapier 1.117 local tmp=/
370 vapier 1.194 while [[ -e ${tmp} ]] ; do
371     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
372 vapier 1.117 done
373 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
374 vapier 1.117 echo "${tmp}"
375 vapier 1.52 else
376 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
377     [[ ${USERLAND} == "GNU" ]] \
378 flameeyes 1.225 && mktemp -p "${topdir}" \
379     || TMPDIR="${topdir}" mktemp -t tmp
380 flameeyes 1.223 else
381     [[ ${USERLAND} == "GNU" ]] \
382 flameeyes 1.225 && mktemp -d "${topdir}" \
383     || TMPDIR="${topdir}" mktemp -dt tmp
384 flameeyes 1.223 fi
385 vapier 1.52 fi
386     }
387    
388 ka0ttic 1.108 # Small wrapper for getent (Linux), nidump (Mac OS X),
389     # and pw (FreeBSD) used in enewuser()/enewgroup()
390 usata 1.91 # Joe Jezak <josejx@gmail.com> and usata@gentoo.org
391 ka0ttic 1.108 # FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
392 usata 1.91 #
393     # egetent(database, key)
394     egetent() {
395 flameeyes 1.205 case ${CHOST} in
396     *-darwin*)
397 usata 1.91 case "$2" in
398 flameeyes 1.205 *[!0-9]*) # Non numeric
399 usata 1.91 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
400     ;;
401 flameeyes 1.205 *) # Numeric
402 usata 1.91 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
403     ;;
404     esac
405 flameeyes 1.205 ;;
406 flameeyes 1.220 *-freebsd*|*-dragonfly*)
407 ka0ttic 1.203 local opts action="user"
408     [[ $1 == "passwd" ]] || action="group"
409    
410     # lookup by uid/gid
411     if [[ $2 == [[:digit:]]* ]] ; then
412     [[ ${action} == "user" ]] && opts="-u" || opts="-g"
413 ka0ttic 1.108 fi
414 ka0ttic 1.203
415     pw show ${action} ${opts} "$2" -q
416 flameeyes 1.205 ;;
417 flameeyes 1.218 *-netbsd*|*-openbsd*)
418 flameeyes 1.206 grep "$2:\*:" /etc/$1
419     ;;
420 flameeyes 1.205 *)
421     type -p nscd >& /dev/null && nscd -i "$1"
422 vapier 1.107 getent "$1" "$2"
423 flameeyes 1.205 ;;
424     esac
425 usata 1.91 }
426    
427 vapier 1.23 # Simplify/standardize adding users to the system
428     # vapier@gentoo.org
429     #
430     # enewuser(username, uid, shell, homedir, groups, extra options)
431     #
432     # Default values if you do not specify any:
433     # username: REQUIRED !
434     # uid: next available (see useradd(8))
435 vapier 1.27 # note: pass -1 to get default behavior
436 vapier 1.23 # shell: /bin/false
437     # homedir: /dev/null
438     # groups: none
439     # extra: comment of 'added by portage for ${PN}'
440     enewuser() {
441     # get the username
442 vapier 1.182 local euser=$1; shift
443     if [[ -z ${euser} ]] ; then
444 vapier 1.23 eerror "No username specified !"
445     die "Cannot call enewuser without a username"
446     fi
447    
448 vapier 1.84 # lets see if the username already exists
449 vapier 1.182 if [[ ${euser} == $(egetent passwd "${euser}" | cut -d: -f1) ]] ; then
450 vapier 1.23 return 0
451     fi
452 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
453 vapier 1.23
454     # options to pass to useradd
455 azarah 1.59 local opts=
456 vapier 1.23
457     # handle uid
458 vapier 1.182 local euid=$1; shift
459     if [[ ! -z ${euid} ]] && [[ ${euid} != "-1" ]] ; then
460     if [[ ${euid} -gt 0 ]] ; then
461     if [[ ! -z $(egetent passwd ${euid}) ]] ; then
462 vapier 1.84 euid="next"
463 vapier 1.82 fi
464 vapier 1.23 else
465     eerror "Userid given but is not greater than 0 !"
466     die "${euid} is not a valid UID"
467     fi
468     else
469 vapier 1.84 euid="next"
470     fi
471 vapier 1.182 if [[ ${euid} == "next" ]] ; then
472 flameeyes 1.197 for euid in $(seq 101 999) ; do
473 vapier 1.182 [[ -z $(egetent passwd ${euid}) ]] && break
474 vapier 1.84 done
475 vapier 1.23 fi
476 vapier 1.84 opts="${opts} -u ${euid}"
477 vapier 1.23 einfo " - Userid: ${euid}"
478    
479     # handle shell
480 vapier 1.182 local eshell=$1; shift
481     if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
482 vapier 1.221 if [[ ! -e ${ROOT}${eshell} ]] ; then
483 vapier 1.23 eerror "A shell was specified but it does not exist !"
484 vapier 1.221 die "${eshell} does not exist in ${ROOT}"
485     fi
486     if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
487     eerror "Do not specify ${eshell} yourself, use -1"
488     die "Pass '-1' as the shell parameter"
489 vapier 1.23 fi
490     else
491 vapier 1.204 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
492     [[ -x ${ROOT}${shell} ]] && break
493 flameeyes 1.198 done
494    
495 vapier 1.204 if [[ ${shell} == "/dev/null" ]] ; then
496 flameeyes 1.198 eerror "Unable to identify the shell to use"
497     die "Unable to identify the shell to use"
498     fi
499    
500     eshell=${shell}
501 vapier 1.23 fi
502     einfo " - Shell: ${eshell}"
503     opts="${opts} -s ${eshell}"
504    
505     # handle homedir
506 vapier 1.182 local ehome=$1; shift
507     if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
508 azarah 1.59 ehome="/dev/null"
509 vapier 1.23 fi
510     einfo " - Home: ${ehome}"
511     opts="${opts} -d ${ehome}"
512    
513     # handle groups
514 vapier 1.182 local egroups=$1; shift
515     if [[ ! -z ${egroups} ]] ; then
516     local oldifs=${IFS}
517 vapier 1.107 local defgroup="" exgroups=""
518    
519 vapier 1.23 export IFS=","
520 vapier 1.182 for g in ${egroups} ; do
521     export IFS=${oldifs}
522     if [[ -z $(egetent group "${g}") ]] ; then
523 vapier 1.85 eerror "You must add group ${g} to the system first"
524 vapier 1.23 die "${g} is not a valid GID"
525     fi
526 vapier 1.182 if [[ -z ${defgroup} ]] ; then
527     defgroup=${g}
528 vapier 1.107 else
529     exgroups="${exgroups},${g}"
530     fi
531 usata 1.115 export IFS=","
532 vapier 1.23 done
533 vapier 1.182 export IFS=${oldifs}
534 vapier 1.107
535     opts="${opts} -g ${defgroup}"
536 vapier 1.182 if [[ ! -z ${exgroups} ]] ; then
537 vapier 1.107 opts="${opts} -G ${exgroups:1}"
538     fi
539 vapier 1.23 else
540     egroups="(none)"
541     fi
542     einfo " - Groups: ${egroups}"
543    
544     # handle extra and add the user
545 vapier 1.182 local oldsandbox=${SANDBOX_ON}
546 vapier 1.23 export SANDBOX_ON="0"
547 flameeyes 1.205 case ${CHOST} in
548     *-darwin*)
549 usata 1.91 ### Make the user
550 vapier 1.182 if [[ -z $@ ]] ; then
551 usata 1.91 dscl . create /users/${euser} uid ${euid}
552     dscl . create /users/${euser} shell ${eshell}
553     dscl . create /users/${euser} home ${ehome}
554     dscl . create /users/${euser} realname "added by portage for ${PN}"
555     ### Add the user to the groups specified
556 vapier 1.182 local oldifs=${IFS}
557 usata 1.115 export IFS=","
558 vapier 1.182 for g in ${egroups} ; do
559 usata 1.91 dscl . merge /groups/${g} users ${euser}
560     done
561 vapier 1.182 export IFS=${oldifs}
562 usata 1.91 else
563 vapier 1.182 einfo "Extra options are not supported on Darwin yet"
564 usata 1.91 einfo "Please report the ebuild along with the info below"
565 vapier 1.182 einfo "eextra: $@"
566 usata 1.91 die "Required function missing"
567     fi
568 vapier 1.182 ;;
569 flameeyes 1.220 *-freebsd*|*-dragonfly*)
570 vapier 1.182 if [[ -z $@ ]] ; then
571 ka0ttic 1.108 pw useradd ${euser} ${opts} \
572     -c "added by portage for ${PN}" \
573     die "enewuser failed"
574     else
575 vapier 1.182 einfo " - Extra: $@"
576 ka0ttic 1.108 pw useradd ${euser} ${opts} \
577 vapier 1.182 "$@" || die "enewuser failed"
578 ka0ttic 1.108 fi
579 vapier 1.182 ;;
580 flameeyes 1.207
581     *-netbsd*)
582     if [[ -z $@ ]] ; then
583     useradd ${opts} ${euser} || die "enewuser failed"
584     else
585     einfo " - Extra: $@"
586     useradd ${opts} ${euser} "$@" || die "enewuser failed"
587     fi
588     ;;
589 flameeyes 1.218
590     *-openbsd*)
591     if [[ -z $@ ]] ; then
592     useradd -u ${euid} -s ${eshell} \
593     -d ${ehome} -c "Added by portage for ${PN}" \
594     -g ${egroups} ${euser} || die "enewuser failed"
595     else
596     einfo " - Extra: $@"
597     useradd -u ${euid} -s ${eshell} \
598     -d ${ehome} -c "Added by portage for ${PN}" \
599     -g ${egroups} ${euser} "$@" || die "enewuser failed"
600     fi
601     ;;
602    
603 vapier 1.182 *)
604     if [[ -z $@ ]] ; then
605 usata 1.91 useradd ${opts} ${euser} \
606     -c "added by portage for ${PN}" \
607     || die "enewuser failed"
608     else
609 vapier 1.182 einfo " - Extra: $@"
610     useradd ${opts} ${euser} "$@" \
611 usata 1.91 || die "enewuser failed"
612     fi
613 vapier 1.182 ;;
614     esac
615 vapier 1.23
616 vapier 1.193 if [[ ! -e ${ROOT}/${ehome} ]] ; then
617     einfo " - Creating ${ehome} in ${ROOT}"
618     mkdir -p "${ROOT}/${ehome}"
619     chown ${euser} "${ROOT}/${ehome}"
620     chmod 755 "${ROOT}/${ehome}"
621 vapier 1.23 fi
622 vapier 1.193
623     export SANDBOX_ON=${oldsandbox}
624 vapier 1.23 }
625    
626     # Simplify/standardize adding groups to the system
627     # vapier@gentoo.org
628     #
629     # enewgroup(group, gid)
630     #
631     # Default values if you do not specify any:
632     # groupname: REQUIRED !
633     # gid: next available (see groupadd(8))
634     # extra: none
635     enewgroup() {
636     # get the group
637     local egroup="$1"; shift
638 azarah 1.59 if [ -z "${egroup}" ]
639     then
640 vapier 1.23 eerror "No group specified !"
641     die "Cannot call enewgroup without a group"
642     fi
643    
644     # see if group already exists
645 usata 1.91 if [ "${egroup}" == "`egetent group \"${egroup}\" | cut -d: -f1`" ]
646 azarah 1.59 then
647 vapier 1.23 return 0
648     fi
649 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
650 vapier 1.23
651     # options to pass to useradd
652 azarah 1.59 local opts=
653 vapier 1.23
654     # handle gid
655     local egid="$1"; shift
656 azarah 1.59 if [ ! -z "${egid}" ]
657     then
658     if [ "${egid}" -gt 0 ]
659     then
660 usata 1.91 if [ -z "`egetent group ${egid}`" ]
661 vapier 1.83 then
662 flameeyes 1.205 if [[ "${CHOST}" == *-darwin* ]]; then
663 usata 1.91 opts="${opts} ${egid}"
664     else
665     opts="${opts} -g ${egid}"
666     fi
667 vapier 1.83 else
668 vapier 1.84 egid="next available; requested gid taken"
669 vapier 1.83 fi
670 vapier 1.23 else
671     eerror "Groupid given but is not greater than 0 !"
672     die "${egid} is not a valid GID"
673     fi
674     else
675     egid="next available"
676     fi
677     einfo " - Groupid: ${egid}"
678    
679     # handle extra
680     local eextra="$@"
681     opts="${opts} ${eextra}"
682    
683     # add the group
684 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
685 vapier 1.23 export SANDBOX_ON="0"
686 flameeyes 1.205 case ${CHOST} in
687     *-darwin*)
688 usata 1.91 if [ ! -z "${eextra}" ];
689     then
690 vapier 1.179 einfo "Extra options are not supported on Darwin/OS X yet"
691 usata 1.91 einfo "Please report the ebuild along with the info below"
692     einfo "eextra: ${eextra}"
693     die "Required function missing"
694     fi
695 mr_bones_ 1.100
696 usata 1.91 # If we need the next available
697     case ${egid} in
698 flameeyes 1.205 *[!0-9]*) # Non numeric
699 flameeyes 1.197 for egid in $(seq 101 999); do
700 usata 1.91 [ -z "`egetent group ${egid}`" ] && break
701     done
702     esac
703     dscl . create /groups/${egroup} gid ${egid}
704 mr_bones_ 1.100 dscl . create /groups/${egroup} passwd '*'
705 flameeyes 1.205 ;;
706    
707 flameeyes 1.220 *-freebsd*|*-dragonfly*)
708 ka0ttic 1.108 case ${egid} in
709     *[!0-9]*) # Non numeric
710 flameeyes 1.197 for egid in $(seq 101 999); do
711 ka0ttic 1.108 [ -z "`egetent group ${egid}`" ] && break
712     done
713     esac
714     pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
715 flameeyes 1.205 ;;
716 flameeyes 1.206
717     *-netbsd*)
718     case ${egid} in
719     *[!0-9]*) # Non numeric
720     for egid in $(seq 101 999); do
721     [ -z "`egetent group ${egid}`" ] && break
722     done
723     esac
724 flameeyes 1.207 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
725 flameeyes 1.206 ;;
726    
727 flameeyes 1.205 *)
728 usata 1.91 groupadd ${opts} ${egroup} || die "enewgroup failed"
729 flameeyes 1.205 ;;
730     esac
731 vapier 1.23 export SANDBOX_ON="${oldsandbox}"
732 vapier 1.24 }
733    
734     # Simple script to replace 'dos2unix' binaries
735     # vapier@gentoo.org
736     #
737 vapier 1.121 # edos2unix(file, <more files> ...)
738 vapier 1.24 edos2unix() {
739 vapier 1.61 for f in "$@"
740 azarah 1.59 do
741 vapier 1.61 cp "${f}" ${T}/edos2unix
742     sed 's/\r$//' ${T}/edos2unix > "${f}"
743 vapier 1.24 done
744 vapier 1.39 }
745    
746 lanius 1.133
747     ##############################################################
748     # START: Handle .desktop files and menu entries #
749     # maybe this should be separated into a new eclass some time #
750     # lanius@gentoo.org #
751     ##############################################################
752    
753 vapier 1.39 # Make a desktop file !
754     # Great for making those icons in kde/gnome startmenu !
755     # Amaze your friends ! Get the women ! Join today !
756     #
757     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
758     #
759     # binary: what binary does the app run with ?
760     # name: the name that will show up in the menu
761     # icon: give your little like a pretty little icon ...
762 vapier 1.118 # this can be relative (to /usr/share/pixmaps) or
763     # a full path to an icon
764 vapier 1.39 # type: what kind of application is this ? for categories:
765 vapier 1.192 # http://www.freedesktop.org/Standards/desktop-entry-spec
766 vapier 1.39 # path: if your app needs to startup in a specific dir
767     make_desktop_entry() {
768 vapier 1.158 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
769 vapier 1.39
770 vapier 1.158 local exec=${1}
771     local name=${2:-${PN}}
772     local icon=${3:-${PN}.png}
773     local type=${4}
774     local path=${5}
775    
776     if [[ -z ${type} ]] ; then
777     local catmaj=${CATEGORY%%-*}
778     local catmin=${CATEGORY##*-}
779     case ${catmaj} in
780     app)
781     case ${catmin} in
782     admin) type=System;;
783     cdr) type=DiscBurning;;
784     dicts) type=Dictionary;;
785     editors) type=TextEditor;;
786     emacs) type=TextEditor;;
787     emulation) type=Emulator;;
788     laptop) type=HardwareSettings;;
789     office) type=Office;;
790     vim) type=TextEditor;;
791     xemacs) type=TextEditor;;
792     *) type=;;
793     esac
794 azarah 1.59 ;;
795 vapier 1.158
796     dev)
797 vapier 1.159 type="Development"
798 vapier 1.158 ;;
799    
800     games)
801     case ${catmin} in
802     action) type=ActionGame;;
803     arcade) type=ArcadeGame;;
804     board) type=BoardGame;;
805     kid) type=KidsGame;;
806     emulation) type=Emulator;;
807     puzzle) type=LogicGame;;
808     rpg) type=RolePlaying;;
809     roguelike) type=RolePlaying;;
810     simulation) type=Simulation;;
811     sports) type=SportsGame;;
812     strategy) type=StrategyGame;;
813     *) type=;;
814     esac
815 vapier 1.159 type="Game;${type}"
816 vapier 1.158 ;;
817    
818     mail)
819 vapier 1.159 type="Network;Email"
820 vapier 1.158 ;;
821    
822     media)
823     case ${catmin} in
824     gfx) type=Graphics;;
825     radio) type=Tuner;;
826     sound) type=Audio;;
827     tv) type=TV;;
828     video) type=Video;;
829     *) type=;;
830     esac
831 vapier 1.159 type="AudioVideo;${type}"
832 wolf31o2 1.65 ;;
833 vapier 1.158
834     net)
835     case ${catmin} in
836     dialup) type=Dialup;;
837     ftp) type=FileTransfer;;
838     im) type=InstantMessaging;;
839     irc) type=IRCClient;;
840     mail) type=Email;;
841     news) type=News;;
842     nntp) type=News;;
843     p2p) type=FileTransfer;;
844     *) type=;;
845     esac
846 vapier 1.159 type="Network;${type}"
847 vapier 1.158 ;;
848    
849     sci)
850     case ${catmin} in
851 mr_bones_ 1.216 astro*) type=Astronomy;;
852 vapier 1.158 bio*) type=Biology;;
853     calc*) type=Calculator;;
854     chem*) type=Chemistry;;
855     geo*) type=Geology;;
856     math*) type=Math;;
857     *) type=;;
858 vapier 1.159 esac
859     type="Science;${type}"
860 vapier 1.158 ;;
861    
862     www)
863     case ${catmin} in
864     client) type=WebBrowser;;
865     *) type=;;
866     esac
867 vapier 1.159 type="Network"
868 azarah 1.59 ;;
869 vapier 1.158
870 azarah 1.59 *)
871     type=
872     ;;
873 vapier 1.39 esac
874     fi
875 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
876     local desktop_name="${PN}"
877     else
878     local desktop_name="${PN}-${SLOT}"
879     fi
880     local desktop=${T}/${exec%% *}-${desktop_name}.desktop
881 vapier 1.39
882     echo "[Desktop Entry]
883     Encoding=UTF-8
884     Version=0.9.2
885     Name=${name}
886     Type=Application
887     Comment=${DESCRIPTION}
888     Exec=${exec}
889     Path=${path}
890     Icon=${icon}
891 vapier 1.99 Categories=Application;${type};" > "${desktop}"
892 vapier 1.39
893 vapier 1.204 (
894     # wrap the env here so that the 'insinto' call
895     # doesn't corrupt the env of the caller
896     insinto /usr/share/applications
897     doins "${desktop}"
898     )
899 danarmak 1.32 }
900    
901 lanius 1.133 # Make a GDM/KDM Session file
902     #
903     # make_desktop_entry(<title>, <command>)
904     # title: File to execute to start the Window Manager
905     # command: Name of the Window Manager
906    
907     make_session_desktop() {
908 vapier 1.167 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
909     [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
910 lanius 1.133
911 vapier 1.167 local title=$1
912     local command=$2
913     local desktop=${T}/${wm}.desktop
914 lanius 1.133
915     echo "[Desktop Entry]
916     Encoding=UTF-8
917     Name=${title}
918     Comment=This session logs you into ${title}
919     Exec=${command}
920     TryExec=${command}
921     Type=Application" > "${desktop}"
922    
923     insinto /usr/share/xsessions
924     doins "${desktop}"
925     }
926    
927     domenu() {
928 vapier 1.167 local i j
929 lanius 1.133 insinto /usr/share/applications
930 vapier 1.167 for i in "$@" ; do
931     if [[ -f ${i} ]] ; then
932     doins "${i}"
933     elif [[ -d ${i} ]] ; then
934     for j in "${i}"/*.desktop ; do
935     doins "${j}"
936 lanius 1.133 done
937 swegener 1.190 fi
938 lanius 1.133 done
939     }
940 vapier 1.167 newmenu() {
941     insinto /usr/share/applications
942     newins "$1" "$2"
943     }
944 lanius 1.133
945     doicon() {
946 vapier 1.167 local i j
947 lanius 1.133 insinto /usr/share/pixmaps
948 vapier 1.167 for i in "$@" ; do
949     if [[ -f ${i} ]] ; then
950     doins "${i}"
951     elif [[ -d ${i} ]] ; then
952     for j in "${i}"/*.png ; do
953     doins "${j}"
954 lanius 1.133 done
955 swegener 1.190 fi
956 lanius 1.133 done
957     }
958 vapier 1.167 newicon() {
959     insinto /usr/share/pixmaps
960     newins "$1" "$2"
961     }
962 lanius 1.133
963     ##############################################################
964     # END: Handle .desktop files and menu entries #
965     ##############################################################
966    
967    
968 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
969     find_unpackable_file() {
970 vapier 1.196 local src=$1
971     if [[ -z ${src} ]] ; then
972     src=${DISTDIR}/${A}
973 vapier 1.50 else
974 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
975     src=${DISTDIR}/${src}
976     elif [[ -e ${PWD}/${src} ]] ; then
977     src=${PWD}/${src}
978     elif [[ -e ${src} ]] ; then
979     src=${src}
980 vapier 1.50 fi
981     fi
982 vapier 1.196 [[ ! -e ${src} ]] && return 1
983 vapier 1.70 echo "${src}"
984     }
985    
986     # Unpack those pesky pdv generated files ...
987     # They're self-unpacking programs with the binary package stuffed in
988     # the middle of the archive. Valve seems to use it a lot ... too bad
989     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
990     #
991     # Usage: unpack_pdv [file to unpack] [size of off_t]
992     # - you have to specify the off_t size ... i have no idea how to extract that
993     # information out of the binary executable myself. basically you pass in
994     # the size of the off_t type (in bytes) on the machine that built the pdv
995     # archive. one way to determine this is by running the following commands:
996     # strings <pdv archive> | grep lseek
997     # strace -elseek <pdv archive>
998     # basically look for the first lseek command (we do the strings/grep because
999     # sometimes the function call is _llseek or something) and steal the 2nd
1000     # parameter. here is an example:
1001     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1002     # lseek
1003     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1004     # lseek(3, -4, SEEK_END) = 2981250
1005     # thus we would pass in the value of '4' as the second parameter.
1006     unpack_pdv() {
1007 vapier 1.196 local src=$(find_unpackable_file $1)
1008     local sizeoff_t=$2
1009 vapier 1.70
1010 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1011     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1012 vapier 1.70
1013 vapier 1.212 local shrtsrc=$(basename "${src}")
1014 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1015     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1016     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1017    
1018     # grab metadata for debug reasons
1019 vapier 1.117 local metafile="$(emktemp)"
1020 vapier 1.70 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
1021    
1022     # rip out the final file name from the metadata
1023     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
1024     datafile="`basename ${datafile}`"
1025    
1026 vapier 1.71 # now lets uncompress/untar the file if need be
1027 vapier 1.117 local tmpfile="$(emktemp)"
1028 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1029 vapier 1.71
1030     local iscompressed="`file -b ${tmpfile}`"
1031     if [ "${iscompressed:0:8}" == "compress" ] ; then
1032     iscompressed=1
1033     mv ${tmpfile}{,.Z}
1034     gunzip ${tmpfile}
1035     else
1036     iscompressed=0
1037     fi
1038     local istar="`file -b ${tmpfile}`"
1039     if [ "${istar:0:9}" == "POSIX tar" ] ; then
1040     istar=1
1041     else
1042     istar=0
1043     fi
1044    
1045     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1046     #dd if=${src} ibs=${metaskip} count=1 \
1047     # | dd ibs=${tailskip} skip=1 \
1048     # | gzip -dc \
1049     # > ${datafile}
1050     if [ ${iscompressed} -eq 1 ] ; then
1051     if [ ${istar} -eq 1 ] ; then
1052     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1053     | head -c $((${metaskip}-${tailskip})) \
1054     | tar -xzf -
1055     else
1056 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1057     | head -c $((${metaskip}-${tailskip})) \
1058     | gzip -dc \
1059     > ${datafile}
1060 vapier 1.71 fi
1061     else
1062     if [ ${istar} -eq 1 ] ; then
1063     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1064     | head -c $((${metaskip}-${tailskip})) \
1065 vapier 1.73 | tar --no-same-owner -xf -
1066 vapier 1.71 else
1067 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1068     | head -c $((${metaskip}-${tailskip})) \
1069     > ${datafile}
1070 vapier 1.71 fi
1071     fi
1072     true
1073     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1074 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1075     }
1076    
1077     # Unpack those pesky makeself generated files ...
1078     # They're shell scripts with the binary package tagged onto
1079     # the end of the archive. Loki utilized the format as does
1080     # many other game companies.
1081     #
1082 vapier 1.112 # Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1083 vapier 1.70 # - If the file is not specified then unpack will utilize ${A}.
1084     # - If the offset is not specified then we will attempt to extract
1085     # the proper offset from the script itself.
1086     unpack_makeself() {
1087 vapier 1.217 local src_input=${1:-${A}}
1088     local src=$(find_unpackable_file "${src_input}")
1089 vapier 1.196 local skip=$2
1090     local exe=$3
1091    
1092 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1093 vapier 1.50
1094 vapier 1.196 local shrtsrc=$(basename "${src}")
1095 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1096 vapier 1.212 if [[ -z ${skip} ]] ; then
1097     local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1098 vapier 1.41 local skip=0
1099 vapier 1.112 exe=tail
1100 vapier 1.41 case ${ver} in
1101     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1102 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1103 vapier 1.41 ;;
1104     2.0|2.0.1)
1105 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1106 vapier 1.41 ;;
1107 wolf31o2 1.48 2.1.1)
1108 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1109 wolf31o2 1.48 let skip="skip + 1"
1110     ;;
1111 vapier 1.49 2.1.2)
1112 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1113 vapier 1.49 let skip="skip + 1"
1114     ;;
1115 wolf31o2 1.48 2.1.3)
1116 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1117 vapier 1.41 let skip="skip + 1"
1118     ;;
1119 wolf31o2 1.211 2.1.4|2.1.5)
1120 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1121     skip=$(head -n ${skip} "${src}" | wc -c)
1122     exe="dd"
1123     ;;
1124 vapier 1.41 *)
1125     eerror "I'm sorry, but I was unable to support the Makeself file."
1126     eerror "The version I detected was '${ver}'."
1127     eerror "Please file a bug about the file ${shrtsrc} at"
1128     eerror "http://bugs.gentoo.org/ so that support can be added."
1129     die "makeself version '${ver}' not supported"
1130     ;;
1131     esac
1132     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1133     fi
1134 vapier 1.112 case ${exe} in
1135     tail) exe="tail -n +${skip} '${src}'";;
1136     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1137     *) die "makeself cant handle exe '${exe}'"
1138     esac
1139 vapier 1.41
1140 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1141 vapier 1.117 local tmpfile="$(emktemp)"
1142 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1143     local filetype="$(file -b "${tmpfile}")"
1144 vapier 1.68 case ${filetype} in
1145     *tar\ archive)
1146 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1147 vapier 1.68 ;;
1148     bzip2*)
1149 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1150 mr_bones_ 1.69 ;;
1151 vapier 1.68 gzip*)
1152 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1153 vapier 1.68 ;;
1154 vapier 1.93 compress*)
1155 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1156 vapier 1.93 ;;
1157 vapier 1.68 *)
1158 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1159 vapier 1.68 false
1160     ;;
1161     esac
1162     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1163 wolf31o2 1.56 }
1164    
1165     # Display a license for user to accept.
1166     #
1167     # Usage: check_license [license]
1168     # - If the file is not specified then ${LICENSE} is used.
1169     check_license() {
1170 vapier 1.60 local lic=$1
1171     if [ -z "${lic}" ] ; then
1172     lic="${PORTDIR}/licenses/${LICENSE}"
1173 wolf31o2 1.56 else
1174 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1175     lic="${PORTDIR}/licenses/${lic}"
1176     elif [ -e "${PWD}/${lic}" ] ; then
1177     lic="${PWD}/${lic}"
1178     elif [ -e "${lic}" ] ; then
1179     lic="${lic}"
1180 wolf31o2 1.56 fi
1181     fi
1182 wolf31o2 1.200 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1183 vapier 1.64 local l="`basename ${lic}`"
1184 wolf31o2 1.56
1185 vapier 1.60 # here is where we check for the licenses the user already
1186     # accepted ... if we don't find a match, we make the user accept
1187 wolf31o2 1.106 local shopts=$-
1188 vapier 1.60 local alic
1189 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1190 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1191 wolf31o2 1.106 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1192     set +o noglob; set -${shopts} #reset old shell opts
1193     return 0
1194     fi
1195 vapier 1.60 done
1196 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1197 vapier 1.60
1198 vapier 1.117 local licmsg="$(emktemp)"
1199 vapier 1.60 cat << EOF > ${licmsg}
1200     **********************************************************
1201     The following license outlines the terms of use of this
1202     package. You MUST accept this license for installation to
1203     continue. When you are done viewing, hit 'q'. If you
1204     CTRL+C out of this, the install will not run!
1205     **********************************************************
1206    
1207     EOF
1208     cat ${lic} >> ${licmsg}
1209     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1210 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1211 vapier 1.60 read alic
1212     case ${alic} in
1213     yes|Yes|y|Y)
1214     return 0
1215     ;;
1216     *)
1217     echo;echo;echo
1218     eerror "You MUST accept the license to continue! Exiting!"
1219     die "Failed to accept license"
1220     ;;
1221     esac
1222 vapier 1.23 }
1223 vapier 1.75
1224     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1225     # the whole 'non-interactive' policy, but damnit I want CD support !
1226     #
1227     # with these cdrom functions we handle all the user interaction and
1228     # standardize everything. all you have to do is call cdrom_get_cds()
1229     # and when the function returns, you can assume that the cd has been
1230     # found at CDROM_ROOT.
1231     #
1232     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1233     # etc... if you want to give the cds better names, then just export
1234     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1235     #
1236     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1237     #
1238     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1239     # - this will attempt to locate a cd based upon a file that is on
1240     # the cd ... the more files you give this function, the more cds
1241     # the cdrom functions will handle
1242     cdrom_get_cds() {
1243     # first we figure out how many cds we're dealing with by
1244     # the # of files they gave us
1245     local cdcnt=0
1246     local f=
1247     for f in "$@" ; do
1248 vapier 1.214 ((++cdcnt))
1249 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1250     done
1251     export CDROM_TOTAL_CDS=${cdcnt}
1252     export CDROM_CURRENT_CD=1
1253    
1254     # now we see if the user gave use CD_ROOT ...
1255     # if they did, let's just believe them that it's correct
1256 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1257 vapier 1.75 local var=
1258     cdcnt=0
1259 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1260 vapier 1.214 ((++cdcnt))
1261 vapier 1.75 var="CD_ROOT_${cdcnt}"
1262 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1263 vapier 1.131 if [[ -z ${!var} ]] ; then
1264 vapier 1.75 eerror "You must either use just the CD_ROOT"
1265     eerror "or specify ALL the CD_ROOT_X variables."
1266     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1267     die "could not locate CD_ROOT_${cdcnt}"
1268     fi
1269     done
1270 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1271 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1272 vapier 1.215 export CDROM_SET=-1
1273     for f in ${CDROM_CHECK_1//:/ } ; do
1274     ((++CDROM_SET))
1275     [[ -e ${CD_ROOT}/${f} ]] && break
1276     done
1277     export CDROM_MATCH=${f}
1278 vapier 1.75 return
1279     fi
1280    
1281 vapier 1.215 # User didn't help us out so lets make sure they know they can
1282     # simplify the whole process ...
1283 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1284 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1285 vapier 1.75 echo
1286     einfo "If you do not have the CD, but have the data files"
1287     einfo "mounted somewhere on your filesystem, just export"
1288     einfo "the variable CD_ROOT so that it points to the"
1289     einfo "directory containing the files."
1290     echo
1291 vapier 1.132 einfo "For example:"
1292     einfo "export CD_ROOT=/mnt/cdrom"
1293     echo
1294 vapier 1.75 else
1295     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1296     cdcnt=0
1297 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1298 vapier 1.214 ((++cdcnt))
1299 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1300 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1301 vapier 1.75 done
1302     echo
1303     einfo "If you do not have the CDs, but have the data files"
1304     einfo "mounted somewhere on your filesystem, just export"
1305     einfo "the following variables so they point to the right place:"
1306     einfon ""
1307     cdcnt=0
1308 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1309 vapier 1.214 ((++cdcnt))
1310 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1311     done
1312     echo
1313     einfo "Or, if you have all the files in the same place, or"
1314     einfo "you only have one cdrom, you can export CD_ROOT"
1315     einfo "and that place will be used as the same data source"
1316     einfo "for all the CDs."
1317     echo
1318 vapier 1.132 einfo "For example:"
1319     einfo "export CD_ROOT_1=/mnt/cdrom"
1320     echo
1321 vapier 1.75 fi
1322 vapier 1.215
1323 vapier 1.214 export CDROM_SET=""
1324 vapier 1.75 export CDROM_CURRENT_CD=0
1325     cdrom_load_next_cd
1326     }
1327    
1328     # this is only used when you need access to more than one cd.
1329     # when you have finished using the first cd, just call this function.
1330     # when it returns, CDROM_ROOT will be pointing to the second cd.
1331     # remember, you can only go forward in the cd chain, you can't go back.
1332     cdrom_load_next_cd() {
1333 vapier 1.215 local var
1334     ((++CDROM_CURRENT_CD))
1335 vapier 1.79
1336 vapier 1.75 unset CDROM_ROOT
1337 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1338     [[ -z ${!var} ]] && var="CD_ROOT"
1339 vapier 1.131 if [[ -z ${!var} ]] ; then
1340 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1341 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1342 vapier 1.75 else
1343 vapier 1.131 export CDROM_ROOT=${!var}
1344 vapier 1.75 fi
1345    
1346     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1347     }
1348    
1349     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1350     # functions. this should *never* be called from an ebuild.
1351     # all it does is try to locate a give file on a cd ... if the cd isn't
1352     # found, then a message asking for the user to insert the cdrom will be
1353     # displayed and we'll hang out here until:
1354     # (1) the file is found on a mounted cdrom
1355     # (2) the user hits CTRL+C
1356 vapier 1.215 _cdrom_locate_file_on_cd() {
1357 vapier 1.214 local mline=""
1358     local showedmsg=0
1359    
1360 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1361 vapier 1.214 local i=0
1362     local -a cdset=(${*//:/ })
1363     if [[ -n ${CDROM_SET} ]] ; then
1364     cdset=(${cdset[${CDROM_SET}]})
1365     fi
1366    
1367     while [[ -n ${cdset[${i}]} ]] ; do
1368     local dir=$(dirname ${cdset[${i}]})
1369     local file=$(basename ${cdset[${i}]})
1370    
1371     for mline in $(mount | gawk '/(iso|cdrom|fs=cdfss)/ {print $3}') ; do
1372     [[ -d ${mline}/${dir} ]] || continue
1373     if [[ -n $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] ; then
1374     export CDROM_ROOT=${mline}
1375     export CDROM_SET=${i}
1376     export CDROM_MATCH=${cdset[${i}]}
1377     return
1378     fi
1379     done
1380    
1381     ((++i))
1382 vapier 1.75 done
1383    
1384 vapier 1.214 echo
1385     if [[ ${showedmsg} -eq 0 ]] ; then
1386     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1387     if [[ -z ${CDROM_NAME} ]] ; then
1388     einfo "Please insert+mount the cdrom for ${PN} now !"
1389     else
1390     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1391     fi
1392     else
1393     if [[ -z ${CDROM_NAME_1} ]] ; then
1394     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1395 vapier 1.75 else
1396 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1397     einfo "Please insert+mount the ${!var} cdrom now !"
1398 vapier 1.75 fi
1399     fi
1400 vapier 1.214 showedmsg=1
1401 vapier 1.75 fi
1402 vapier 1.214 einfo "Press return to scan for the cd again"
1403     einfo "or hit CTRL+C to abort the emerge."
1404     echo
1405     einfo "If you are having trouble with the detection"
1406     einfo "of your CD, it is possible that you do not have"
1407     einfo "Joliet support enabled in your kernel. Please"
1408     einfo "check that CONFIG_JOLIET is enabled in your kernel."
1409 vapier 1.222 read || die "something is screwed with your system"
1410 vapier 1.75 done
1411     }
1412 vapier 1.92
1413 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1414 vapier 1.92 # a package can support
1415     #
1416     # usage: strip-linguas <allow LINGUAS>
1417     # strip-linguas -i <directories of .po files>
1418     # strip-linguas -u <directories of .po files>
1419     #
1420     # The first form allows you to specify a list of LINGUAS.
1421 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1422 vapier 1.92 # directories and uses the intersection of the lists.
1423 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1424 vapier 1.92 # directories and uses the union of the lists.
1425     strip-linguas() {
1426     local ls newls
1427 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1428     local op=$1; shift
1429 flameeyes 1.226 ls=" $(find "$1" -name '*.po' -exec basename {} \;) "; shift
1430 vapier 1.92 local d f
1431     for d in "$@" ; do
1432 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1433     newls=${ls}
1434 vapier 1.92 else
1435     newls=""
1436     fi
1437 flameeyes 1.226 for f in $(find "$d" -name '*.po' -exec basename {} \;) ; do
1438 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1439     [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1440 vapier 1.92 else
1441 vapier 1.154 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1442 vapier 1.92 fi
1443     done
1444 vapier 1.154 ls=${newls}
1445 vapier 1.92 done
1446 vapier 1.154 ls=${ls//.po}
1447 vapier 1.92 else
1448 vapier 1.154 ls=$@
1449 vapier 1.92 fi
1450    
1451     ls=" ${ls} "
1452     newls=""
1453     for f in ${LINGUAS} ; do
1454 vapier 1.154 if [[ ${ls/ ${f} /} != ${ls} ]] ; then
1455 vapier 1.120 newls="${newls} ${f}"
1456 vapier 1.92 else
1457     ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1458     fi
1459     done
1460 vapier 1.154 if [[ -z ${newls} ]] ; then
1461 vapier 1.166 export LINGUAS=""
1462 vapier 1.92 else
1463 vapier 1.154 export LINGUAS=${newls:1}
1464 vapier 1.92 fi
1465     }
1466 iggy 1.110
1467     # moved from kernel.eclass since they are generally useful outside of
1468     # kernel.eclass -iggy (20041002)
1469    
1470     # the following functions are useful in kernel module ebuilds, etc.
1471     # for an example see ivtv or drbd ebuilds
1472    
1473     # set's ARCH to match what the kernel expects
1474     set_arch_to_kernel() {
1475 vapier 1.140 i=10
1476     while ((i--)) ; do
1477     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1478     done
1479 iggy 1.110 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1480     case ${ARCH} in
1481 vapier 1.178 x86) export ARCH="i386";;
1482     amd64) export ARCH="x86_64";;
1483     hppa) export ARCH="parisc";;
1484     mips) export ARCH="mips";;
1485     sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one!
1486     *) export ARCH="${ARCH}";;
1487 iggy 1.110 esac
1488     }
1489    
1490     # set's ARCH back to what portage expects
1491     set_arch_to_portage() {
1492 vapier 1.140 i=10
1493     while ((i--)) ; do
1494     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1495     done
1496 iggy 1.110 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1497     }
1498 eradicator 1.111
1499     # Jeremy Huddleston <eradicator@gentoo.org>:
1500     # preserve_old_lib /path/to/libblah.so.0
1501     # preserve_old_lib_notify /path/to/libblah.so.0
1502     #
1503 carlo 1.227 # These functions are useful when a lib in your package changes --library. Such
1504 eradicator 1.111 # an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1505     # would break packages that link against it. Most people get around this
1506     # by using the portage SLOT mechanism, but that is not always a relevant
1507     # solution, so instead you can add the following to your ebuilds:
1508     #
1509     # src_install() {
1510     # ...
1511     # preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1512     # ...
1513     # }
1514     #
1515     # pkg_postinst() {
1516     # ...
1517     # preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1518     # ...
1519     # }
1520    
1521     preserve_old_lib() {
1522     LIB=$1
1523    
1524     if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1525     SONAME=`basename ${LIB}`
1526     DIRNAME=`dirname ${LIB}`
1527    
1528     dodir ${DIRNAME}
1529     cp ${ROOT}${LIB} ${D}${DIRNAME}
1530     touch ${D}${LIB}
1531     fi
1532     }
1533    
1534     preserve_old_lib_notify() {
1535 seemant 1.134 LIB=$1
1536 eradicator 1.111
1537 seemant 1.134 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1538     SONAME=`basename ${LIB}`
1539 eradicator 1.111
1540 eradicator 1.191 ewarn "An old version of an installed library was detected on your system."
1541     ewarn "In order to avoid breaking packages that link against it, this older version"
1542     ewarn "is not being removed. In order to make full use of this newer version,"
1543     ewarn "you will need to execute the following command:"
1544 carlo 1.227 ewarn " revdep-rebuild --library ${SONAME}"
1545 eradicator 1.191 ewarn
1546     ewarn "After doing that, you can safely remove ${LIB}"
1547     ewarn "Note: 'emerge gentoolkit' to get revdep-rebuild"
1548 seemant 1.134 fi
1549 eradicator 1.111 }
1550 vapier 1.125
1551 ka0ttic 1.143 # Hack for people to figure out if a package was built with
1552 vapier 1.125 # certain USE flags
1553     #
1554 vapier 1.130 # Usage: built_with_use [-a|-o] <DEPEND ATOM> <List of USE flags>
1555 vapier 1.125 # ex: built_with_use xchat gtk2
1556 vapier 1.130 #
1557     # Flags: -a all USE flags should be utilized
1558     # -o at least one USE flag should be utilized
1559     # Note: the default flag is '-a'
1560 vapier 1.125 built_with_use() {
1561 vapier 1.130 local opt=$1
1562     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1563    
1564     local PKG=$(best_version $1)
1565     shift
1566    
1567 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1568    
1569     # if the USE file doesnt exist, assume the $PKG is either
1570     # injected or package.provided
1571     [[ ! -e ${USEFILE} ]] && return 0
1572 vapier 1.125
1573     local USE_BUILT=$(<${USEFILE})
1574 vapier 1.130 while [[ $# -gt 0 ]] ; do
1575     if [[ ${opt} = "-o" ]] ; then
1576     has $1 ${USE_BUILT} && return 0
1577     else
1578     has $1 ${USE_BUILT} || return 1
1579     fi
1580 vapier 1.125 shift
1581     done
1582 vapier 1.130 [[ ${opt} = "-a" ]]
1583 vapier 1.125 }
1584 vapier 1.126
1585 ka0ttic 1.143 # Many configure scripts wrongly bail when a C++ compiler
1586 vapier 1.126 # could not be detected. #73450
1587     epunt_cxx() {
1588 vapier 1.127 local dir=$1
1589     [[ -z ${dir} ]] && dir=${S}
1590     ebegin "Removing useless C++ checks"
1591     local f
1592     for f in $(find ${dir} -name configure) ; do
1593     patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1594     done
1595     eend 0
1596 vapier 1.126 }
1597 ka0ttic 1.143
1598 vapier 1.151 # dopamd <file> [more files]
1599 ka0ttic 1.143 #
1600     # Install pam auth config file in /etc/pam.d
1601 vapier 1.151 dopamd() {
1602     [[ -z $1 ]] && die "dopamd requires at least one argument"
1603    
1604     use pam || return 0
1605    
1606 vapier 1.172 INSDESTTREE=/etc/pam.d \
1607 vapier 1.151 doins "$@" || die "failed to install $@"
1608     }
1609     # newpamd <old name> <new name>
1610 ka0ttic 1.143 #
1611 vapier 1.151 # Install pam file <old name> as <new name> in /etc/pam.d
1612     newpamd() {
1613     [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1614 ka0ttic 1.143
1615     use pam || return 0
1616    
1617 vapier 1.172 INSDESTTREE=/etc/pam.d \
1618 vapier 1.151 newins "$1" "$2" || die "failed to install $1 as $2"
1619 ka0ttic 1.143 }
1620 wolf31o2 1.160
1621     # make a wrapper script ...
1622     # NOTE: this was originally games_make_wrapper, but I noticed other places where
1623     # this could be used, so I have moved it here and made it not games-specific
1624     # -- wolf31o2
1625     # $1 == wrapper name
1626     # $2 == binary to run
1627     # $3 == directory to chdir before running binary
1628     # $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1629 wolf31o2 1.164 # $5 == path for wrapper
1630 wolf31o2 1.160 make_wrapper() {
1631 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1632 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1633 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1634     # things as $bin ... "./someprog --args"
1635 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1636     #!/bin/sh
1637 vapier 1.201 cd "${chdir:-.}"
1638 vapier 1.210 if [ -n "${libdir}" ] ; then
1639     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1640     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1641     else
1642     export LD_LIBRARY_PATH="${libdir}"
1643     fi
1644 vapier 1.201 fi
1645 vapier 1.202 exec ${bin} "\$@"
1646 wolf31o2 1.160 EOF
1647     chmod go+rx "${tmpwrapper}"
1648 vapier 1.201 if [[ -n ${path} ]] ; then
1649     exeinto "${path}"
1650 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1651     else
1652     newbin "${tmpwrapper}" "${wrapper}"
1653     fi
1654 wolf31o2 1.160 }

  ViewVC Help
Powered by ViewVC 1.1.20