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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.171 - (hide annotations) (download)
Fri May 13 00:30:33 2005 UTC (9 years, 4 months ago) by vapier
Branch: MAIN
Changes since 1.170: +1 -46 lines
have_NPTL isnt used anymore

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

  ViewVC Help
Powered by ViewVC 1.1.20