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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.181 - (hide annotations) (download)
Thu Jun 9 15:25:56 2005 UTC (9 years, 6 months ago) by azarah
Branch: MAIN
Changes since 1.180: +3 -2 lines
sys-apps/shadow is needed for useradd, etc, bug #94745

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

  ViewVC Help
Powered by ViewVC 1.1.20