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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.219 - (hide annotations) (download)
Tue Nov 29 03:37:36 2005 UTC (8 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.218: +24 -37 lines
touchup gen_usr_ldscript and move draw_line() to inside epatch() so no one will use it

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

  ViewVC Help
Powered by ViewVC 1.1.20