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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.178 - (hide annotations) (download)
Thu May 26 22:09:26 2005 UTC (8 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.177: +8 -8 lines
remove redundant code in epatch/arch check

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

  ViewVC Help
Powered by ViewVC 1.1.20