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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.167 - (hide annotations) (download)
Sat Apr 16 07:05:45 2005 UTC (9 years, 5 months ago) by vapier
Branch: MAIN
Changes since 1.166: +28 -33 lines
add newicon / newmenu #88983

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

  ViewVC Help
Powered by ViewVC 1.1.20