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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.166 - (hide annotations) (download)
Fri Apr 15 22:01:42 2005 UTC (9 years, 6 months ago) by vapier
Branch: MAIN
Changes since 1.165: +3 -2 lines
export LINGUAS to "" if everything is stripped

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.166 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.165 2005/04/12 01:01:23 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    
1015     [ -z "$1" ] && eerror "make_session_desktop: You must specify the title" && return 1
1016     [ -z "$2" ] && eerror "make_session_desktop: You must specify the command" && return 1
1017    
1018     local title="${1}"
1019     local command="${2}"
1020     local desktop="${T}/${wm}.desktop"
1021    
1022     echo "[Desktop Entry]
1023     Encoding=UTF-8
1024     Name=${title}
1025     Comment=This session logs you into ${title}
1026     Exec=${command}
1027     TryExec=${command}
1028     Type=Application" > "${desktop}"
1029    
1030     insinto /usr/share/xsessions
1031     doins "${desktop}"
1032    
1033     return 0
1034     }
1035    
1036     domenu() {
1037     local i
1038     local j
1039     insinto /usr/share/applications
1040     for i in ${@}
1041     do
1042     if [ -f "${i}" ];
1043     then
1044     doins ${i}
1045     elif [ -d "${i}" ];
1046     then
1047     for j in ${i}/*.desktop
1048     do
1049     doins ${j}
1050     done
1051     fi
1052     done
1053     }
1054    
1055     doicon() {
1056     local i
1057     local j
1058     insinto /usr/share/pixmaps
1059     for i in ${@}
1060     do
1061     if [ -f "${i}" ];
1062     then
1063     doins ${i}
1064     elif [ -d "${i}" ];
1065     then
1066     for j in ${i}/*.png
1067     do
1068     doins ${j}
1069     done
1070     fi
1071     done
1072     }
1073    
1074     ##############################################################
1075     # END: Handle .desktop files and menu entries #
1076     ##############################################################
1077    
1078    
1079 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1080     find_unpackable_file() {
1081 azarah 1.59 local src="$1"
1082     if [ -z "${src}" ]
1083     then
1084 vapier 1.50 src="${DISTDIR}/${A}"
1085     else
1086 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
1087     then
1088 vapier 1.50 src="${DISTDIR}/${src}"
1089 azarah 1.59 elif [ -e "${PWD}/${src}" ]
1090     then
1091 vapier 1.50 src="${PWD}/${src}"
1092 azarah 1.59 elif [ -e "${src}" ]
1093     then
1094 vapier 1.50 src="${src}"
1095     fi
1096     fi
1097 vapier 1.70 [ ! -e "${src}" ] && die "Could not find requested archive ${src}"
1098     echo "${src}"
1099     }
1100    
1101     # Unpack those pesky pdv generated files ...
1102     # They're self-unpacking programs with the binary package stuffed in
1103     # the middle of the archive. Valve seems to use it a lot ... too bad
1104     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1105     #
1106     # Usage: unpack_pdv [file to unpack] [size of off_t]
1107     # - you have to specify the off_t size ... i have no idea how to extract that
1108     # information out of the binary executable myself. basically you pass in
1109     # the size of the off_t type (in bytes) on the machine that built the pdv
1110     # archive. one way to determine this is by running the following commands:
1111     # strings <pdv archive> | grep lseek
1112     # strace -elseek <pdv archive>
1113     # basically look for the first lseek command (we do the strings/grep because
1114     # sometimes the function call is _llseek or something) and steal the 2nd
1115     # parameter. here is an example:
1116     # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1117     # lseek
1118     # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1119     # lseek(3, -4, SEEK_END) = 2981250
1120     # thus we would pass in the value of '4' as the second parameter.
1121     unpack_pdv() {
1122     local src="`find_unpackable_file $1`"
1123     local sizeoff_t="$2"
1124    
1125     [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :("
1126    
1127     local shrtsrc="`basename ${src}`"
1128     echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1129     local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
1130     local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
1131    
1132     # grab metadata for debug reasons
1133 vapier 1.117 local metafile="$(emktemp)"
1134 vapier 1.70 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
1135    
1136     # rip out the final file name from the metadata
1137     local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
1138     datafile="`basename ${datafile}`"
1139    
1140 vapier 1.71 # now lets uncompress/untar the file if need be
1141 vapier 1.117 local tmpfile="$(emktemp)"
1142 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1143 vapier 1.71
1144     local iscompressed="`file -b ${tmpfile}`"
1145     if [ "${iscompressed:0:8}" == "compress" ] ; then
1146     iscompressed=1
1147     mv ${tmpfile}{,.Z}
1148     gunzip ${tmpfile}
1149     else
1150     iscompressed=0
1151     fi
1152     local istar="`file -b ${tmpfile}`"
1153     if [ "${istar:0:9}" == "POSIX tar" ] ; then
1154     istar=1
1155     else
1156     istar=0
1157     fi
1158    
1159     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1160     #dd if=${src} ibs=${metaskip} count=1 \
1161     # | dd ibs=${tailskip} skip=1 \
1162     # | gzip -dc \
1163     # > ${datafile}
1164     if [ ${iscompressed} -eq 1 ] ; then
1165     if [ ${istar} -eq 1 ] ; then
1166     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1167     | head -c $((${metaskip}-${tailskip})) \
1168     | tar -xzf -
1169     else
1170 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1171     | head -c $((${metaskip}-${tailskip})) \
1172     | gzip -dc \
1173     > ${datafile}
1174 vapier 1.71 fi
1175     else
1176     if [ ${istar} -eq 1 ] ; then
1177     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1178     | head -c $((${metaskip}-${tailskip})) \
1179 vapier 1.73 | tar --no-same-owner -xf -
1180 vapier 1.71 else
1181 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1182     | head -c $((${metaskip}-${tailskip})) \
1183     > ${datafile}
1184 vapier 1.71 fi
1185     fi
1186     true
1187     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1188 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1189     }
1190    
1191     # Unpack those pesky makeself generated files ...
1192     # They're shell scripts with the binary package tagged onto
1193     # the end of the archive. Loki utilized the format as does
1194     # many other game companies.
1195     #
1196 vapier 1.112 # Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
1197 vapier 1.70 # - If the file is not specified then unpack will utilize ${A}.
1198     # - If the offset is not specified then we will attempt to extract
1199     # the proper offset from the script itself.
1200     unpack_makeself() {
1201 vapier 1.112 local src="$(find_unpackable_file "$1")"
1202 vapier 1.70 local skip="$2"
1203 vapier 1.112 local exe="$3"
1204 vapier 1.50
1205 vapier 1.112 local shrtsrc="$(basename "${src}")"
1206 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1207 azarah 1.59 if [ -z "${skip}" ]
1208     then
1209 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
1210     local skip=0
1211 vapier 1.112 exe=tail
1212 vapier 1.41 case ${ver} in
1213     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1214 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1215 vapier 1.41 ;;
1216     2.0|2.0.1)
1217 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1218 vapier 1.41 ;;
1219 wolf31o2 1.48 2.1.1)
1220 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1221 wolf31o2 1.48 let skip="skip + 1"
1222     ;;
1223 vapier 1.49 2.1.2)
1224 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1225 vapier 1.49 let skip="skip + 1"
1226     ;;
1227 wolf31o2 1.48 2.1.3)
1228 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1229 vapier 1.41 let skip="skip + 1"
1230     ;;
1231 vapier 1.112 2.1.4)
1232     skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1233     skip=$(head -n ${skip} "${src}" | wc -c)
1234     exe="dd"
1235     ;;
1236 vapier 1.41 *)
1237     eerror "I'm sorry, but I was unable to support the Makeself file."
1238     eerror "The version I detected was '${ver}'."
1239     eerror "Please file a bug about the file ${shrtsrc} at"
1240     eerror "http://bugs.gentoo.org/ so that support can be added."
1241     die "makeself version '${ver}' not supported"
1242     ;;
1243     esac
1244     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1245     fi
1246 vapier 1.112 case ${exe} in
1247     tail) exe="tail -n +${skip} '${src}'";;
1248     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1249     *) die "makeself cant handle exe '${exe}'"
1250     esac
1251 vapier 1.41
1252 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1253 vapier 1.117 local tmpfile="$(emktemp)"
1254 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1255     local filetype="$(file -b "${tmpfile}")"
1256 vapier 1.68 case ${filetype} in
1257     *tar\ archive)
1258 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1259 vapier 1.68 ;;
1260     bzip2*)
1261 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1262 mr_bones_ 1.69 ;;
1263 vapier 1.68 gzip*)
1264 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1265 vapier 1.68 ;;
1266 vapier 1.93 compress*)
1267 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1268 vapier 1.93 ;;
1269 vapier 1.68 *)
1270 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1271 vapier 1.68 false
1272     ;;
1273     esac
1274     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1275 wolf31o2 1.56 }
1276    
1277     # Display a license for user to accept.
1278     #
1279     # Usage: check_license [license]
1280     # - If the file is not specified then ${LICENSE} is used.
1281     check_license() {
1282 vapier 1.60 local lic=$1
1283     if [ -z "${lic}" ] ; then
1284     lic="${PORTDIR}/licenses/${LICENSE}"
1285 wolf31o2 1.56 else
1286 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
1287     lic="${PORTDIR}/licenses/${src}"
1288     elif [ -e "${PWD}/${src}" ] ; then
1289     lic="${PWD}/${src}"
1290     elif [ -e "${src}" ] ; then
1291     lic="${src}"
1292 wolf31o2 1.56 fi
1293     fi
1294 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1295 vapier 1.64 local l="`basename ${lic}`"
1296 wolf31o2 1.56
1297 vapier 1.60 # here is where we check for the licenses the user already
1298     # accepted ... if we don't find a match, we make the user accept
1299 wolf31o2 1.106 local shopts=$-
1300 vapier 1.60 local alic
1301 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1302 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1303 wolf31o2 1.106 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1304     set +o noglob; set -${shopts} #reset old shell opts
1305     return 0
1306     fi
1307 vapier 1.60 done
1308 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1309 vapier 1.60
1310 vapier 1.117 local licmsg="$(emktemp)"
1311 vapier 1.60 cat << EOF > ${licmsg}
1312     **********************************************************
1313     The following license outlines the terms of use of this
1314     package. You MUST accept this license for installation to
1315     continue. When you are done viewing, hit 'q'. If you
1316     CTRL+C out of this, the install will not run!
1317     **********************************************************
1318    
1319     EOF
1320     cat ${lic} >> ${licmsg}
1321     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1322 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1323 vapier 1.60 read alic
1324     case ${alic} in
1325     yes|Yes|y|Y)
1326     return 0
1327     ;;
1328     *)
1329     echo;echo;echo
1330     eerror "You MUST accept the license to continue! Exiting!"
1331     die "Failed to accept license"
1332     ;;
1333     esac
1334 vapier 1.23 }
1335 vapier 1.75
1336     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1337     # the whole 'non-interactive' policy, but damnit I want CD support !
1338     #
1339     # with these cdrom functions we handle all the user interaction and
1340     # standardize everything. all you have to do is call cdrom_get_cds()
1341     # and when the function returns, you can assume that the cd has been
1342     # found at CDROM_ROOT.
1343     #
1344     # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1345     # etc... if you want to give the cds better names, then just export
1346     # the CDROM_NAME_X variables before calling cdrom_get_cds().
1347     #
1348     # for those multi cd ebuilds, see the cdrom_load_next_cd() below.
1349     #
1350     # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...]
1351     # - this will attempt to locate a cd based upon a file that is on
1352     # the cd ... the more files you give this function, the more cds
1353     # the cdrom functions will handle
1354     cdrom_get_cds() {
1355     # first we figure out how many cds we're dealing with by
1356     # the # of files they gave us
1357     local cdcnt=0
1358     local f=
1359     for f in "$@" ; do
1360     cdcnt=$((cdcnt + 1))
1361     export CDROM_CHECK_${cdcnt}="$f"
1362     done
1363     export CDROM_TOTAL_CDS=${cdcnt}
1364     export CDROM_CURRENT_CD=1
1365    
1366     # now we see if the user gave use CD_ROOT ...
1367     # if they did, let's just believe them that it's correct
1368 vapier 1.131 if [[ ! -z ${CD_ROOT} ]] ; then
1369     export CDROM_ROOT=${CD_ROOT}
1370 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1371     return
1372     fi
1373     # do the same for CD_ROOT_X
1374 vapier 1.131 if [[ ! -z ${CD_ROOT_1} ]] ; then
1375 vapier 1.75 local var=
1376     cdcnt=0
1377 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1378 vapier 1.75 cdcnt=$((cdcnt + 1))
1379     var="CD_ROOT_${cdcnt}"
1380 vapier 1.131 if [[ -z ${!var} ]] ; then
1381 vapier 1.75 eerror "You must either use just the CD_ROOT"
1382     eerror "or specify ALL the CD_ROOT_X variables."
1383     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1384     die "could not locate CD_ROOT_${cdcnt}"
1385     fi
1386     export CDROM_ROOTS_${cdcnt}="${!var}"
1387     done
1388     export CDROM_ROOT=${CDROM_ROOTS_1}
1389     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1390     return
1391     fi
1392    
1393 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1394 vapier 1.75 einfon "This ebuild will need the "
1395 vapier 1.131 if [[ -z ${CDROM_NAME} ]] ; then
1396 vapier 1.75 echo "cdrom for ${PN}."
1397     else
1398     echo "${CDROM_NAME}."
1399     fi
1400     echo
1401     einfo "If you do not have the CD, but have the data files"
1402     einfo "mounted somewhere on your filesystem, just export"
1403     einfo "the variable CD_ROOT so that it points to the"
1404     einfo "directory containing the files."
1405     echo
1406 vapier 1.132 einfo "For example:"
1407     einfo "export CD_ROOT=/mnt/cdrom"
1408     echo
1409 vapier 1.75 else
1410     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1411     cdcnt=0
1412 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1413 vapier 1.75 cdcnt=$((cdcnt + 1))
1414     var="CDROM_NAME_${cdcnt}"
1415 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1416 vapier 1.75 done
1417     echo
1418     einfo "If you do not have the CDs, but have the data files"
1419     einfo "mounted somewhere on your filesystem, just export"
1420     einfo "the following variables so they point to the right place:"
1421     einfon ""
1422     cdcnt=0
1423 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1424 vapier 1.75 cdcnt=$((cdcnt + 1))
1425     echo -n " CD_ROOT_${cdcnt}"
1426     done
1427     echo
1428     einfo "Or, if you have all the files in the same place, or"
1429     einfo "you only have one cdrom, you can export CD_ROOT"
1430     einfo "and that place will be used as the same data source"
1431     einfo "for all the CDs."
1432     echo
1433 vapier 1.132 einfo "For example:"
1434     einfo "export CD_ROOT_1=/mnt/cdrom"
1435     echo
1436 vapier 1.75 fi
1437     export CDROM_CURRENT_CD=0
1438     cdrom_load_next_cd
1439     }
1440    
1441     # this is only used when you need access to more than one cd.
1442     # when you have finished using the first cd, just call this function.
1443     # when it returns, CDROM_ROOT will be pointing to the second cd.
1444     # remember, you can only go forward in the cd chain, you can't go back.
1445     cdrom_load_next_cd() {
1446     export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1447     local var=
1448    
1449 vapier 1.131 if [[ ! -z ${CD_ROOT} ]] ; then
1450 vapier 1.79 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1451     return
1452     fi
1453    
1454 vapier 1.75 unset CDROM_ROOT
1455     var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1456 vapier 1.131 if [[ -z ${!var} ]] ; then
1457 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1458     cdrom_locate_file_on_cd ${!var}
1459     else
1460 vapier 1.131 export CDROM_ROOT=${!var}
1461 vapier 1.75 fi
1462    
1463     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1464     }
1465    
1466     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1467     # functions. this should *never* be called from an ebuild.
1468     # all it does is try to locate a give file on a cd ... if the cd isn't
1469     # found, then a message asking for the user to insert the cdrom will be
1470     # displayed and we'll hang out here until:
1471     # (1) the file is found on a mounted cdrom
1472     # (2) the user hits CTRL+C
1473     cdrom_locate_file_on_cd() {
1474 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1475 vapier 1.75 local dir="$(dirname ${@})"
1476     local file="$(basename ${@})"
1477     local mline=""
1478     local showedmsg=0
1479    
1480 vapier 1.131 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do
1481     [[ -d ${mline}/${dir} ]] || continue
1482     [[ ! -z $(find ${mline}/${dir} -iname ${file} -maxdepth 1) ]] \
1483 vapier 1.75 && export CDROM_ROOT=${mline}
1484     done
1485    
1486 vapier 1.131 if [[ -z ${CDROM_ROOT} ]] ; then
1487 vapier 1.75 echo
1488 vapier 1.131 if [[ ${showedmsg} -eq 0 ]] ; then
1489     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1490     if [[ -z ${CDROM_NAME} ]] ; then
1491 vapier 1.75 einfo "Please insert the cdrom for ${PN} now !"
1492     else
1493     einfo "Please insert the ${CDROM_NAME} cdrom now !"
1494     fi
1495     else
1496 vapier 1.131 if [[ -z ${CDROM_NAME_1} ]] ; then
1497 vapier 1.75 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1498     else
1499     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1500     einfo "Please insert+mount the ${!var} cdrom now !"
1501     fi
1502     fi
1503     showedmsg=1
1504     fi
1505     einfo "Press return to scan for the cd again"
1506     einfo "or hit CTRL+C to abort the emerge."
1507     read
1508     fi
1509     done
1510     }
1511 vapier 1.92
1512 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1513 vapier 1.92 # a package can support
1514     #
1515     # usage: strip-linguas <allow LINGUAS>
1516     # strip-linguas -i <directories of .po files>
1517     # strip-linguas -u <directories of .po files>
1518     #
1519     # The first form allows you to specify a list of LINGUAS.
1520 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1521 vapier 1.92 # directories and uses the intersection of the lists.
1522 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1523 vapier 1.92 # directories and uses the union of the lists.
1524     strip-linguas() {
1525     local ls newls
1526 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1527     local op=$1; shift
1528 vapier 1.92 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1529     local d f
1530     for d in "$@" ; do
1531 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1532     newls=${ls}
1533 vapier 1.92 else
1534     newls=""
1535     fi
1536     for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1537 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1538     [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1539 vapier 1.92 else
1540 vapier 1.154 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1541 vapier 1.92 fi
1542     done
1543 vapier 1.154 ls=${newls}
1544 vapier 1.92 done
1545 vapier 1.154 ls=${ls//.po}
1546 vapier 1.92 else
1547 vapier 1.154 ls=$@
1548 vapier 1.92 fi
1549    
1550     ls=" ${ls} "
1551     newls=""
1552     for f in ${LINGUAS} ; do
1553 vapier 1.154 if [[ ${ls/ ${f} /} != ${ls} ]] ; then
1554 vapier 1.120 newls="${newls} ${f}"
1555 vapier 1.92 else
1556     ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1557     fi
1558     done
1559 vapier 1.154 if [[ -z ${newls} ]] ; then
1560 vapier 1.166 export LINGUAS=""
1561 vapier 1.92 else
1562 vapier 1.154 export LINGUAS=${newls:1}
1563 vapier 1.92 fi
1564     }
1565 iggy 1.110
1566     # moved from kernel.eclass since they are generally useful outside of
1567     # kernel.eclass -iggy (20041002)
1568    
1569     # the following functions are useful in kernel module ebuilds, etc.
1570     # for an example see ivtv or drbd ebuilds
1571    
1572     # set's ARCH to match what the kernel expects
1573     set_arch_to_kernel() {
1574 vapier 1.140 i=10
1575     while ((i--)) ; do
1576     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1577     done
1578 iggy 1.110 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1579     case ${ARCH} in
1580     x86) export ARCH="i386";;
1581     amd64) export ARCH="x86_64";;
1582     hppa) export ARCH="parisc";;
1583     mips) export ARCH="mips";;
1584 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!
1585 iggy 1.110 *) export ARCH="${ARCH}";;
1586     esac
1587     }
1588    
1589     # set's ARCH back to what portage expects
1590     set_arch_to_portage() {
1591 vapier 1.140 i=10
1592     while ((i--)) ; do
1593     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1594     done
1595 iggy 1.110 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1596     }
1597 eradicator 1.111
1598     # Jeremy Huddleston <eradicator@gentoo.org>:
1599     # preserve_old_lib /path/to/libblah.so.0
1600     # preserve_old_lib_notify /path/to/libblah.so.0
1601     #
1602     # These functions are useful when a lib in your package changes --soname. Such
1603     # an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1604     # would break packages that link against it. Most people get around this
1605     # by using the portage SLOT mechanism, but that is not always a relevant
1606     # solution, so instead you can add the following to your ebuilds:
1607     #
1608     # src_install() {
1609     # ...
1610     # preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1611     # ...
1612     # }
1613     #
1614     # pkg_postinst() {
1615     # ...
1616     # preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1617     # ...
1618     # }
1619    
1620     preserve_old_lib() {
1621     LIB=$1
1622    
1623     if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1624     SONAME=`basename ${LIB}`
1625     DIRNAME=`dirname ${LIB}`
1626    
1627     dodir ${DIRNAME}
1628     cp ${ROOT}${LIB} ${D}${DIRNAME}
1629     touch ${D}${LIB}
1630     fi
1631     }
1632    
1633     preserve_old_lib_notify() {
1634 seemant 1.134 LIB=$1
1635 eradicator 1.111
1636 seemant 1.134 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1637     SONAME=`basename ${LIB}`
1638 eradicator 1.111
1639     einfo "An old version of an installed library was detected on your system."
1640     einfo "In order to avoid breaking packages that link against is, this older version"
1641     einfo "is not being removed. In order to make full use of this newer version,"
1642     einfo "you will need to execute the following command:"
1643     einfo " revdep-rebuild --soname ${SONAME}"
1644     einfo
1645     einfo "After doing that, you can safely remove ${LIB}"
1646 eradicator 1.116 einfo "Note: 'emerge gentoolkit' to get revdep-rebuild"
1647 seemant 1.134 fi
1648 eradicator 1.111 }
1649 vapier 1.125
1650 ka0ttic 1.143 # Hack for people to figure out if a package was built with
1651 vapier 1.125 # certain USE flags
1652     #
1653 vapier 1.130 # Usage: built_with_use [-a|-o] <DEPEND ATOM> <List of USE flags>
1654 vapier 1.125 # ex: built_with_use xchat gtk2
1655 vapier 1.130 #
1656     # Flags: -a all USE flags should be utilized
1657     # -o at least one USE flag should be utilized
1658     # Note: the default flag is '-a'
1659 vapier 1.125 built_with_use() {
1660 vapier 1.130 local opt=$1
1661     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1662    
1663     local PKG=$(best_version $1)
1664     shift
1665    
1666 vapier 1.125 local USEFILE="${ROOT}/var/db/pkg/${PKG}/USE"
1667     [[ ! -e ${USEFILE} ]] && return 1
1668    
1669     local USE_BUILT=$(<${USEFILE})
1670 vapier 1.130 while [[ $# -gt 0 ]] ; do
1671     if [[ ${opt} = "-o" ]] ; then
1672     has $1 ${USE_BUILT} && return 0
1673     else
1674     has $1 ${USE_BUILT} || return 1
1675     fi
1676 vapier 1.125 shift
1677     done
1678 vapier 1.130 [[ ${opt} = "-a" ]]
1679 vapier 1.125 }
1680 vapier 1.126
1681 ka0ttic 1.143 # Many configure scripts wrongly bail when a C++ compiler
1682 vapier 1.126 # could not be detected. #73450
1683     epunt_cxx() {
1684 vapier 1.127 local dir=$1
1685     [[ -z ${dir} ]] && dir=${S}
1686     ebegin "Removing useless C++ checks"
1687     local f
1688     for f in $(find ${dir} -name configure) ; do
1689     patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1690     done
1691     eend 0
1692 vapier 1.126 }
1693 ka0ttic 1.143
1694 vapier 1.151 # dopamd <file> [more files]
1695 ka0ttic 1.143 #
1696     # Install pam auth config file in /etc/pam.d
1697 vapier 1.151 dopamd() {
1698     [[ -z $1 ]] && die "dopamd requires at least one argument"
1699    
1700     use pam || return 0
1701    
1702     insinto /etc/pam.d
1703     doins "$@" || die "failed to install $@"
1704     }
1705     # newpamd <old name> <new name>
1706 ka0ttic 1.143 #
1707 vapier 1.151 # Install pam file <old name> as <new name> in /etc/pam.d
1708     newpamd() {
1709     [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1710 ka0ttic 1.143
1711     use pam || return 0
1712    
1713     insinto /etc/pam.d
1714 vapier 1.151 newins "$1" "$2" || die "failed to install $1 as $2"
1715 ka0ttic 1.143 }
1716 wolf31o2 1.160
1717     # make a wrapper script ...
1718     # NOTE: this was originally games_make_wrapper, but I noticed other places where
1719     # this could be used, so I have moved it here and made it not games-specific
1720     # -- wolf31o2
1721     # $1 == wrapper name
1722     # $2 == binary to run
1723     # $3 == directory to chdir before running binary
1724     # $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1725 wolf31o2 1.164 # $5 == path for wrapper
1726 wolf31o2 1.160 make_wrapper() {
1727 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1728 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1729     cat << EOF > "${tmpwrapper}"
1730     #!/bin/sh
1731     cd "${chdir}"
1732     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1733     exec ${bin} "\$@"
1734     EOF
1735     chmod go+rx "${tmpwrapper}"
1736 wolf31o2 1.164 if [ -n "${5}" ]
1737     then
1738     exeinto ${5}
1739     newexe "${tmpwrapper}" "${wrapper}"
1740     else
1741     newbin "${tmpwrapper}" "${wrapper}"
1742     fi
1743 wolf31o2 1.160 }

  ViewVC Help
Powered by ViewVC 1.1.20