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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.152 - (hide annotations) (download)
Fri Feb 18 18:04:42 2005 UTC (9 years, 8 months ago) by azarah
Branch: MAIN
Changes since 1.151: +3 -1 lines
Fix reverse logic when checking if we should run fix_libtool_files.sh.

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

  ViewVC Help
Powered by ViewVC 1.1.20