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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.194 - (hide annotations) (download)
Tue Aug 9 22:40:39 2005 UTC (8 years, 11 months ago) by vapier
Branch: MAIN
Changes since 1.193: +11 -13 lines
if we failed to create the temp dir, fall back to running with -p option

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

  ViewVC Help
Powered by ViewVC 1.1.20