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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.205 - (hide annotations) (download)
Fri Oct 7 15:31:46 2005 UTC (8 years, 6 months ago) by flameeyes
Branch: MAIN
Changes since 1.204: +26 -17 lines
Use case selection on ${CHOST} instead than of using ${USERLAND} variable for users management.

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

  ViewVC Help
Powered by ViewVC 1.1.20