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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.317 - (hide annotations) (download)
Sun Mar 1 08:06:00 2009 UTC (5 years, 5 months ago) by vapier
Branch: MAIN
Changes since 1.316: +5 -1 lines
add xz support by Brandon Berhent #260653

1 nyhm 1.281 # Copyright 1999-2007 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.317 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.316 2009/02/27 01:49:41 vapier Exp $
4 vapier 1.283
5     # @ECLASS: eutils.eclass
6     # @MAINTAINER:
7     # base-system@gentoo.org
8     # @BLURB: many extra (but common) functions that are used in ebuilds
9     # @DESCRIPTION:
10     # The eutils eclass contains a suite of functions that complement
11     # the ones that ebuild.sh already contain. The idea is that the functions
12     # are not required in all ebuilds but enough utilize them to have a common
13     # home rather than having multiple ebuilds implementing the same thing.
14 swegener 1.286 #
15 vapier 1.283 # Due to the nature of this eclass, some functions may have maintainers
16     # different from the overall eclass!
17 azarah 1.1
18 flameeyes 1.197 inherit multilib portability
19 azarah 1.1
20 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
21 azarah 1.1
22 vapier 1.283 # @FUNCTION: epause
23     # @USAGE: [seconds]
24     # @DESCRIPTION:
25     # Sleep for the specified number of seconds (default of 5 seconds). Useful when
26     # printing a message the user should probably be reading and often used in
27     # conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set,
28     # don't wait at all.
29 ciaranm 1.98 epause() {
30 vapier 1.245 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
31 ciaranm 1.98 }
32    
33 vapier 1.283 # @FUNCTION: ebeep
34     # @USAGE: [number of beeps]
35     # @DESCRIPTION:
36     # Issue the specified number of beeps (default of 5 beeps). Useful when
37     # printing a message the user should probably be reading and often used in
38     # conjunction with the epause function. If the EBEEP_IGNORE env var is set,
39     # don't beep at all.
40 ciaranm 1.98 ebeep() {
41     local n
42 vapier 1.245 if [[ -z ${EBEEP_IGNORE} ]] ; then
43 ciaranm 1.98 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
44     echo -ne "\a"
45     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
46     echo -ne "\a"
47     sleep 1
48     done
49     fi
50     }
51    
52 hollow 1.298 # @FUNCTION: ecvs_clean
53 vapier 1.299 # @USAGE: [list of dirs]
54 hollow 1.298 # @DESCRIPTION:
55 vapier 1.299 # Remove CVS directories recursiveley. Useful when a source tarball contains
56     # internal CVS directories. Defaults to $PWD.
57 hollow 1.298 ecvs_clean() {
58 vapier 1.299 [[ -z $* ]] && set -- .
59 hollow 1.298 find "$@" -type d -name 'CVS' -prune -print0 | xargs -0 rm -rf
60     find "$@" -type f -name '.cvs*' -print0 | xargs -0 rm -rf
61     }
62    
63     # @FUNCTION: esvn_clean
64 vapier 1.299 # @USAGE: [list of dirs]
65 hollow 1.298 # @DESCRIPTION:
66 vapier 1.299 # Remove .svn directories recursiveley. Useful when a source tarball contains
67     # internal Subversion directories. Defaults to $PWD.
68 hollow 1.298 esvn_clean() {
69 vapier 1.299 [[ -z $* ]] && set -- .
70 hollow 1.298 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
71     }
72    
73 azarah 1.2 # Default directory where patches are located
74     EPATCH_SOURCE="${WORKDIR}/patch"
75     # Default extension for patches
76     EPATCH_SUFFIX="patch.bz2"
77     # Default options for patch
78 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
79 vapier 1.170 # Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
80 vapier 1.230 # Set -E to automatically remove empty files.
81     EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
82 mr_bones_ 1.308 # List of patches not to apply. Note this is only file names,
83 azarah 1.6 # and not the full path ..
84     EPATCH_EXCLUDE=""
85 azarah 1.9 # Change the printed message for a single patch.
86     EPATCH_SINGLE_MSG=""
87 vapier 1.173 # Change the printed message for multiple patches.
88     EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
89 azarah 1.29 # Force applying bulk patches even if not following the style:
90     #
91 flameeyes 1.266 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
92 azarah 1.29 #
93     EPATCH_FORCE="no"
94 azarah 1.2
95     # This function is for bulk patching, or in theory for just one
96     # or two patches.
97     #
98     # It should work with .bz2, .gz, .zip and plain text patches.
99     # Currently all patches should be the same format.
100     #
101     # You do not have to specify '-p' option to patch, as it will
102     # try with -p0 to -p5 until it succeed, or fail at -p5.
103     #
104     # Above EPATCH_* variables can be used to control various defaults,
105     # bug they should be left as is to ensure an ebuild can rely on
106     # them for.
107     #
108 azarah 1.3 # Patches are applied in current directory.
109     #
110 pva 1.309 # Bulk Patches should preferably have the form of:
111 azarah 1.2 #
112 flameeyes 1.266 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
113 azarah 1.2 #
114     # For example:
115     #
116 flameeyes 1.266 # 01_all_misc-fix.patch.bz2
117     # 02_sparc_another-fix.patch.bz2
118 azarah 1.2 #
119     # This ensures that there are a set order, and you can have ARCH
120     # specific patches.
121     #
122 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
123     # single patch that need to be applied if its a file. If on the other
124     # hand its a directory, it will set EPATCH_SOURCE to this.
125     #
126 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
127     #
128     epatch() {
129 swegener 1.231 _epatch_draw_line() {
130 agriffis 1.229 [[ -z $1 ]] && set "$(printf "%65s" '')"
131     echo "${1//?/=}"
132 vapier 1.219 }
133 vapier 1.208 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
134 azarah 1.2 local PIPE_CMD=""
135     local STDERR_TARGET="${T}/$$.out"
136 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
137     local PATCH_SUFFIX=""
138 azarah 1.3 local SINGLE_PATCH="no"
139 azarah 1.4 local x=""
140 azarah 1.3
141 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
142    
143 azarah 1.3 if [ "$#" -gt 1 ]
144     then
145 vapier 1.94 local m=""
146     for m in "$@" ; do
147     epatch "${m}"
148     done
149     return 0
150 azarah 1.3 fi
151    
152     if [ -n "$1" -a -f "$1" ]
153     then
154     SINGLE_PATCH="yes"
155 danarmak 1.32
156 azarah 1.4 local EPATCH_SOURCE="$1"
157     local EPATCH_SUFFIX="${1##*\.}"
158 danarmak 1.32
159 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
160     then
161 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
162     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
163     then
164     local EPATCH_SOURCE="$1/*"
165     else
166     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
167     fi
168 azarah 1.3 else
169 vapier 1.294 if [[ ! -d ${EPATCH_SOURCE} ]] || [[ -n $1 ]] ; then
170 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
171     then
172     EPATCH_SOURCE="$1"
173     fi
174    
175 azarah 1.8 echo
176 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
177     eerror
178     eerror " ${EPATCH_SOURCE}"
179 vapier 1.139 eerror " ( ${EPATCH_SOURCE##*/} )"
180 azarah 1.8 echo
181     die "Cannot find \$EPATCH_SOURCE!"
182     fi
183 danarmak 1.32
184 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
185 azarah 1.3 fi
186 azarah 1.2
187     case ${EPATCH_SUFFIX##*\.} in
188 vapier 1.317 xz)
189     PIPE_CMD="xz -dc"
190     PATCH_SUFFIX="xz"
191     ;;
192 vapier 1.303 lzma)
193     PIPE_CMD="lzma -dc"
194     PATCH_SUFFIX="lzma"
195     ;;
196 azarah 1.2 bz2)
197     PIPE_CMD="bzip2 -dc"
198 azarah 1.8 PATCH_SUFFIX="bz2"
199 azarah 1.2 ;;
200 azarah 1.6 gz|Z|z)
201 azarah 1.2 PIPE_CMD="gzip -dc"
202 azarah 1.8 PATCH_SUFFIX="gz"
203 azarah 1.2 ;;
204 azarah 1.6 ZIP|zip)
205 azarah 1.2 PIPE_CMD="unzip -p"
206 azarah 1.8 PATCH_SUFFIX="zip"
207 azarah 1.2 ;;
208     *)
209     PIPE_CMD="cat"
210 azarah 1.8 PATCH_SUFFIX="patch"
211 azarah 1.2 ;;
212     esac
213    
214 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
215     then
216 vapier 1.173 einfo "${EPATCH_MULTI_MSG}"
217 azarah 1.3 fi
218     for x in ${EPATCH_SOURCE}
219 azarah 1.2 do
220 vapier 1.121 # New ARCH dependant patch naming scheme ...
221 azarah 1.2 #
222 flameeyes 1.266 # ???_arch_foo.patch
223 azarah 1.2 #
224     if [ -f ${x} ] && \
225 vapier 1.178 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
226 flameeyes 1.266 [ "${EPATCH_FORCE}" = "yes" ])
227 azarah 1.2 then
228     local count=0
229     local popts="${EPATCH_OPTS}"
230 eradicator 1.150 local patchname=${x##*/}
231 azarah 1.6
232     if [ -n "${EPATCH_EXCLUDE}" ]
233     then
234 eradicator 1.150 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
235 azarah 1.6 then
236     continue
237     fi
238     fi
239 danarmak 1.32
240 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
241     then
242 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
243     then
244     einfo "${EPATCH_SINGLE_MSG}"
245     else
246 eradicator 1.150 einfo "Applying ${patchname} ..."
247 azarah 1.9 fi
248 azarah 1.3 else
249 vapier 1.270 einfo " ${patchname} ..."
250 azarah 1.3 fi
251 azarah 1.2
252 eradicator 1.150 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
253     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
254 azarah 1.2
255 vapier 1.304 # Decompress the patch if need be
256     if [[ ${PATCH_SUFFIX} != "patch" ]] ; then
257     echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
258     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
259    
260     if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 ; then
261     echo
262     eerror "Could not extract patch!"
263     #die "Could not extract patch!"
264     count=5
265     break
266     fi
267     else
268     PATCH_TARGET="${x}"
269     fi
270    
271 vapier 1.305 # Check for absolute paths in patches. If sandbox is disabled,
272     # people could (accidently) patch files in the root filesystem.
273 vapier 1.307 # Or trigger other unpleasantries #237667. So disallow -p0 on
274     # such patches.
275 vapier 1.306 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
276     if [[ -n ${abs_paths} ]] ; then
277 vapier 1.307 count=1
278     echo "NOTE: skipping -p0 due to absolute paths in patch:" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
279     echo "${abs_paths}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
280 vapier 1.305 fi
281    
282 azarah 1.2 # Allow for prefix to differ ... im lazy, so shoot me :/
283     while [ "${count}" -lt 5 ]
284     do
285 azarah 1.5 # Generate some useful debug info ...
286 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
287 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
288 azarah 1.8
289 flameeyes 1.266 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
290 eradicator 1.150 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
291 danarmak 1.32
292 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
293 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
294 azarah 1.8
295 vapier 1.208 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
296 azarah 1.2 then
297 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
298 eradicator 1.150 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
299     echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
300     echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
301 vapier 1.219 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
302 azarah 1.8
303 eradicator 1.150 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
304 vapier 1.208 _epatch_assert
305 azarah 1.8
306     if [ "$?" -ne 0 ]
307     then
308 eradicator 1.150 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
309 azarah 1.8 echo
310     eerror "A dry-run of patch command succeeded, but actually"
311     eerror "applying the patch failed!"
312     #die "Real world sux compared to the dreamworld!"
313     count=5
314     fi
315    
316 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
317 danarmak 1.32
318 azarah 1.2 break
319     fi
320    
321     count=$((count + 1))
322     done
323    
324 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
325     then
326     rm -f ${PATCH_TARGET}
327     fi
328    
329 azarah 1.2 if [ "${count}" -eq 5 ]
330     then
331 azarah 1.8 echo
332 vapier 1.158 eerror "Failed Patch: ${patchname} !"
333     eerror " ( ${PATCH_TARGET} )"
334 azarah 1.2 eerror
335     eerror "Include in your bugreport the contents of:"
336     eerror
337 eradicator 1.150 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
338 azarah 1.8 echo
339 eradicator 1.150 die "Failed Patch: ${patchname}!"
340 azarah 1.2 fi
341 azarah 1.8
342 eradicator 1.150 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
343 azarah 1.3
344     eend 0
345 azarah 1.2 fi
346     done
347 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
348     then
349     einfo "Done with patching"
350 azarah 1.10 fi
351 azarah 1.26 }
352    
353 vapier 1.283 # @FUNCTION: emktemp
354     # @USAGE: [temp dir]
355     # @DESCRIPTION:
356 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
357 vapier 1.283 # does not exist on the users system.
358 vapier 1.117 emktemp() {
359 vapier 1.119 local exe="touch"
360 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
361     local topdir=$1
362 mr_bones_ 1.100
363 vapier 1.194 if [[ -z ${topdir} ]] ; then
364     [[ -z ${T} ]] \
365 vapier 1.117 && topdir="/tmp" \
366 vapier 1.194 || topdir=${T}
367 vapier 1.117 fi
368    
369 vapier 1.280 if ! type -P mktemp > /dev/null ; then
370     # system lacks `mktemp` so we have to fake it
371 vapier 1.117 local tmp=/
372 vapier 1.194 while [[ -e ${tmp} ]] ; do
373     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
374 vapier 1.117 done
375 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
376 vapier 1.117 echo "${tmp}"
377 vapier 1.52 else
378 vapier 1.280 # the args here will give slightly wierd names on BSD,
379     # but should produce a usable file on all userlands
380 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
381 vapier 1.280 TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX
382 flameeyes 1.223 else
383 vapier 1.280 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
384 flameeyes 1.223 fi
385 vapier 1.52 fi
386     }
387    
388 vapier 1.283 # @FUNCTION: egetent
389     # @USAGE: <database> <key>
390     # @MAINTAINER:
391     # base-system@gentoo.org (Linux)
392     # Joe Jezak <josejx@gmail.com> (OS X)
393     # usata@gentoo.org (OS X)
394     # Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
395     # @DESCRIPTION:
396 grobian 1.310 # Small wrapper for getent (Linux),
397     # nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
398 ka0ttic 1.108 # and pw (FreeBSD) used in enewuser()/enewgroup()
399 usata 1.91 egetent() {
400 flameeyes 1.205 case ${CHOST} in
401 grobian 1.310 *-darwin9)
402     local mytype=$1
403     [[ "passwd" == $mytype ]] && mytype="Users"
404     [[ "group" == $mytype ]] && mytype="Groups"
405     case "$2" in
406     *[!0-9]*) # Non numeric
407     dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
408     ;;
409     *) # Numeric
410     local mykey="UniqueID"
411     [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
412     dscl . -search /$mytype $mykey $2 2>/dev/null
413     ;;
414     esac
415     ;;
416 flameeyes 1.205 *-darwin*)
417 usata 1.91 case "$2" in
418 flameeyes 1.205 *[!0-9]*) # Non numeric
419 usata 1.91 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
420     ;;
421 flameeyes 1.205 *) # Numeric
422 usata 1.91 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
423     ;;
424     esac
425 flameeyes 1.205 ;;
426 flameeyes 1.220 *-freebsd*|*-dragonfly*)
427 ka0ttic 1.203 local opts action="user"
428     [[ $1 == "passwd" ]] || action="group"
429    
430     # lookup by uid/gid
431     if [[ $2 == [[:digit:]]* ]] ; then
432     [[ ${action} == "user" ]] && opts="-u" || opts="-g"
433 ka0ttic 1.108 fi
434 ka0ttic 1.203
435     pw show ${action} ${opts} "$2" -q
436 flameeyes 1.205 ;;
437 flameeyes 1.218 *-netbsd*|*-openbsd*)
438 flameeyes 1.206 grep "$2:\*:" /etc/$1
439     ;;
440 flameeyes 1.205 *)
441     type -p nscd >& /dev/null && nscd -i "$1"
442 vapier 1.107 getent "$1" "$2"
443 flameeyes 1.205 ;;
444     esac
445 usata 1.91 }
446    
447 vapier 1.283 # @FUNCTION: enewuser
448     # @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
449     # @DESCRIPTION:
450     # Same as enewgroup, you are not required to understand how to properly add
451     # a user to the system. The only required parameter is the username.
452     # Default uid is (pass -1 for this) next available, default shell is
453     # /bin/false, default homedir is /dev/null, there are no default groups,
454     # and default params sets the comment as 'added by portage for ${PN}'.
455 vapier 1.23 enewuser() {
456 vapier 1.233 case ${EBUILD_PHASE} in
457     unpack|compile|test|install)
458     eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
459     eerror "Package fails at QA and at life. Please file a bug."
460     die "Bad package! enewuser is only for use in pkg_* functions!"
461     esac
462    
463 vapier 1.23 # get the username
464 vapier 1.182 local euser=$1; shift
465     if [[ -z ${euser} ]] ; then
466 vapier 1.23 eerror "No username specified !"
467     die "Cannot call enewuser without a username"
468     fi
469    
470 vapier 1.84 # lets see if the username already exists
471 agriffis 1.256 if [[ -n $(egetent passwd "${euser}") ]] ; then
472 vapier 1.23 return 0
473     fi
474 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
475 vapier 1.23
476     # options to pass to useradd
477 azarah 1.59 local opts=
478 vapier 1.23
479     # handle uid
480 vapier 1.182 local euid=$1; shift
481 agriffis 1.256 if [[ -n ${euid} && ${euid} != -1 ]] ; then
482 vapier 1.182 if [[ ${euid} -gt 0 ]] ; then
483 agriffis 1.256 if [[ -n $(egetent passwd ${euid}) ]] ; then
484 vapier 1.84 euid="next"
485 vapier 1.82 fi
486 vapier 1.23 else
487     eerror "Userid given but is not greater than 0 !"
488     die "${euid} is not a valid UID"
489     fi
490     else
491 vapier 1.84 euid="next"
492     fi
493 vapier 1.182 if [[ ${euid} == "next" ]] ; then
494 agriffis 1.256 for ((euid = 101; euid <= 999; euid++)); do
495 vapier 1.182 [[ -z $(egetent passwd ${euid}) ]] && break
496 vapier 1.84 done
497 vapier 1.23 fi
498 vapier 1.84 opts="${opts} -u ${euid}"
499 vapier 1.23 einfo " - Userid: ${euid}"
500    
501     # handle shell
502 vapier 1.182 local eshell=$1; shift
503     if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
504 vapier 1.221 if [[ ! -e ${ROOT}${eshell} ]] ; then
505 vapier 1.23 eerror "A shell was specified but it does not exist !"
506 vapier 1.221 die "${eshell} does not exist in ${ROOT}"
507     fi
508     if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
509     eerror "Do not specify ${eshell} yourself, use -1"
510     die "Pass '-1' as the shell parameter"
511 vapier 1.23 fi
512     else
513 vapier 1.204 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
514     [[ -x ${ROOT}${shell} ]] && break
515 flameeyes 1.198 done
516    
517 vapier 1.204 if [[ ${shell} == "/dev/null" ]] ; then
518 flameeyes 1.253 eerror "Unable to identify the shell to use, proceeding with userland default."
519     case ${USERLAND} in
520     GNU) shell="/bin/false" ;;
521     BSD) shell="/sbin/nologin" ;;
522     Darwin) shell="/usr/sbin/nologin" ;;
523     *) die "Unable to identify the default shell for userland ${USERLAND}"
524     esac
525 flameeyes 1.198 fi
526    
527     eshell=${shell}
528 vapier 1.23 fi
529     einfo " - Shell: ${eshell}"
530     opts="${opts} -s ${eshell}"
531    
532     # handle homedir
533 vapier 1.182 local ehome=$1; shift
534     if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
535 azarah 1.59 ehome="/dev/null"
536 vapier 1.23 fi
537     einfo " - Home: ${ehome}"
538     opts="${opts} -d ${ehome}"
539    
540     # handle groups
541 vapier 1.182 local egroups=$1; shift
542     if [[ ! -z ${egroups} ]] ; then
543     local oldifs=${IFS}
544 vapier 1.107 local defgroup="" exgroups=""
545    
546 vapier 1.23 export IFS=","
547 vapier 1.182 for g in ${egroups} ; do
548     export IFS=${oldifs}
549     if [[ -z $(egetent group "${g}") ]] ; then
550 vapier 1.85 eerror "You must add group ${g} to the system first"
551 vapier 1.23 die "${g} is not a valid GID"
552     fi
553 vapier 1.182 if [[ -z ${defgroup} ]] ; then
554     defgroup=${g}
555 vapier 1.107 else
556     exgroups="${exgroups},${g}"
557     fi
558 usata 1.115 export IFS=","
559 vapier 1.23 done
560 vapier 1.182 export IFS=${oldifs}
561 vapier 1.107
562     opts="${opts} -g ${defgroup}"
563 vapier 1.182 if [[ ! -z ${exgroups} ]] ; then
564 vapier 1.107 opts="${opts} -G ${exgroups:1}"
565     fi
566 vapier 1.23 else
567     egroups="(none)"
568     fi
569     einfo " - Groups: ${egroups}"
570    
571     # handle extra and add the user
572 vapier 1.182 local oldsandbox=${SANDBOX_ON}
573 vapier 1.23 export SANDBOX_ON="0"
574 flameeyes 1.205 case ${CHOST} in
575     *-darwin*)
576 usata 1.91 ### Make the user
577 vapier 1.182 if [[ -z $@ ]] ; then
578 usata 1.91 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 vapier 1.182 local oldifs=${IFS}
584 usata 1.115 export IFS=","
585 vapier 1.182 for g in ${egroups} ; do
586 usata 1.91 dscl . merge /groups/${g} users ${euser}
587     done
588 vapier 1.182 export IFS=${oldifs}
589 usata 1.91 else
590 vapier 1.182 einfo "Extra options are not supported on Darwin yet"
591 usata 1.91 einfo "Please report the ebuild along with the info below"
592 vapier 1.182 einfo "eextra: $@"
593 usata 1.91 die "Required function missing"
594     fi
595 vapier 1.182 ;;
596 flameeyes 1.220 *-freebsd*|*-dragonfly*)
597 vapier 1.182 if [[ -z $@ ]] ; then
598 ka0ttic 1.108 pw useradd ${euser} ${opts} \
599     -c "added by portage for ${PN}" \
600     die "enewuser failed"
601     else
602 vapier 1.182 einfo " - Extra: $@"
603 ka0ttic 1.108 pw useradd ${euser} ${opts} \
604 vapier 1.182 "$@" || die "enewuser failed"
605 ka0ttic 1.108 fi
606 vapier 1.182 ;;
607 flameeyes 1.207
608     *-netbsd*)
609     if [[ -z $@ ]] ; then
610     useradd ${opts} ${euser} || die "enewuser failed"
611     else
612     einfo " - Extra: $@"
613     useradd ${opts} ${euser} "$@" || die "enewuser failed"
614     fi
615     ;;
616 flameeyes 1.218
617     *-openbsd*)
618     if [[ -z $@ ]] ; then
619     useradd -u ${euid} -s ${eshell} \
620     -d ${ehome} -c "Added by portage for ${PN}" \
621     -g ${egroups} ${euser} || die "enewuser failed"
622     else
623     einfo " - Extra: $@"
624     useradd -u ${euid} -s ${eshell} \
625     -d ${ehome} -c "Added by portage for ${PN}" \
626     -g ${egroups} ${euser} "$@" || die "enewuser failed"
627     fi
628     ;;
629    
630 vapier 1.182 *)
631     if [[ -z $@ ]] ; then
632 usata 1.91 useradd ${opts} ${euser} \
633     -c "added by portage for ${PN}" \
634     || die "enewuser failed"
635     else
636 vapier 1.182 einfo " - Extra: $@"
637     useradd ${opts} ${euser} "$@" \
638 usata 1.91 || die "enewuser failed"
639     fi
640 vapier 1.182 ;;
641     esac
642 vapier 1.23
643 vapier 1.193 if [[ ! -e ${ROOT}/${ehome} ]] ; then
644     einfo " - Creating ${ehome} in ${ROOT}"
645     mkdir -p "${ROOT}/${ehome}"
646     chown ${euser} "${ROOT}/${ehome}"
647     chmod 755 "${ROOT}/${ehome}"
648 vapier 1.23 fi
649 vapier 1.193
650     export SANDBOX_ON=${oldsandbox}
651 vapier 1.23 }
652    
653 vapier 1.283 # @FUNCTION: enewgroup
654     # @USAGE: <group> [gid]
655     # @DESCRIPTION:
656     # This function does not require you to understand how to properly add a
657     # group to the system. Just give it a group name to add and enewgroup will
658     # do the rest. You may specify the gid for the group or allow the group to
659     # allocate the next available one.
660 vapier 1.23 enewgroup() {
661 vapier 1.233 case ${EBUILD_PHASE} in
662     unpack|compile|test|install)
663     eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
664     eerror "Package fails at QA and at life. Please file a bug."
665     die "Bad package! enewgroup is only for use in pkg_* functions!"
666     esac
667    
668 vapier 1.23 # get the group
669     local egroup="$1"; shift
670 azarah 1.59 if [ -z "${egroup}" ]
671     then
672 vapier 1.23 eerror "No group specified !"
673     die "Cannot call enewgroup without a group"
674     fi
675    
676     # see if group already exists
677 agriffis 1.256 if [[ -n $(egetent group "${egroup}") ]]; then
678 vapier 1.23 return 0
679     fi
680 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
681 vapier 1.23
682     # options to pass to useradd
683 azarah 1.59 local opts=
684 vapier 1.23
685     # handle gid
686     local egid="$1"; shift
687 azarah 1.59 if [ ! -z "${egid}" ]
688     then
689     if [ "${egid}" -gt 0 ]
690     then
691 usata 1.91 if [ -z "`egetent group ${egid}`" ]
692 vapier 1.83 then
693 flameeyes 1.205 if [[ "${CHOST}" == *-darwin* ]]; then
694 usata 1.91 opts="${opts} ${egid}"
695     else
696     opts="${opts} -g ${egid}"
697     fi
698 vapier 1.83 else
699 vapier 1.84 egid="next available; requested gid taken"
700 vapier 1.83 fi
701 vapier 1.23 else
702     eerror "Groupid given but is not greater than 0 !"
703     die "${egid} is not a valid GID"
704     fi
705     else
706     egid="next available"
707     fi
708     einfo " - Groupid: ${egid}"
709    
710     # handle extra
711     local eextra="$@"
712     opts="${opts} ${eextra}"
713    
714     # add the group
715 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
716 vapier 1.23 export SANDBOX_ON="0"
717 flameeyes 1.205 case ${CHOST} in
718     *-darwin*)
719 usata 1.91 if [ ! -z "${eextra}" ];
720     then
721 vapier 1.179 einfo "Extra options are not supported on Darwin/OS X yet"
722 usata 1.91 einfo "Please report the ebuild along with the info below"
723     einfo "eextra: ${eextra}"
724     die "Required function missing"
725     fi
726 mr_bones_ 1.100
727 usata 1.91 # If we need the next available
728     case ${egid} in
729 flameeyes 1.205 *[!0-9]*) # Non numeric
730 agriffis 1.256 for ((egid = 101; egid <= 999; egid++)); do
731     [[ -z $(egetent group ${egid}) ]] && break
732 usata 1.91 done
733     esac
734     dscl . create /groups/${egroup} gid ${egid}
735 mr_bones_ 1.100 dscl . create /groups/${egroup} passwd '*'
736 flameeyes 1.205 ;;
737    
738 flameeyes 1.220 *-freebsd*|*-dragonfly*)
739 ka0ttic 1.108 case ${egid} in
740     *[!0-9]*) # Non numeric
741 agriffis 1.256 for ((egid = 101; egid <= 999; egid++)); do
742     [[ -z $(egetent group ${egid}) ]] && break
743 ka0ttic 1.108 done
744     esac
745     pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
746 flameeyes 1.205 ;;
747 flameeyes 1.206
748     *-netbsd*)
749     case ${egid} in
750     *[!0-9]*) # Non numeric
751 agriffis 1.256 for ((egid = 101; egid <= 999; egid++)); do
752     [[ -z $(egetent group ${egid}) ]] && break
753 flameeyes 1.206 done
754     esac
755 flameeyes 1.207 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
756 flameeyes 1.206 ;;
757    
758 flameeyes 1.205 *)
759 usata 1.91 groupadd ${opts} ${egroup} || die "enewgroup failed"
760 flameeyes 1.205 ;;
761     esac
762 vapier 1.23 export SANDBOX_ON="${oldsandbox}"
763 vapier 1.24 }
764    
765 vapier 1.283 # @FUNCTION: edos2unix
766     # @USAGE: <file> [more files ...]
767     # @DESCRIPTION:
768     # A handy replacement for dos2unix, recode, fixdos, etc... This allows you
769     # to remove all of these text utilities from DEPEND variables because this
770     # is a script based solution. Just give it a list of files to convert and
771     # they will all be changed from the DOS CRLF format to the UNIX LF format.
772 vapier 1.24 edos2unix() {
773 vapier 1.263 echo "$@" | xargs sed -i 's/\r$//'
774 vapier 1.39 }
775    
776     # Make a desktop file !
777     # Great for making those icons in kde/gnome startmenu !
778 flameeyes 1.266 # Amaze your friends ! Get the women ! Join today !
779 vapier 1.39 #
780 tupone 1.238 # make_desktop_entry(<command>, [name], [icon], [type], [path])
781 vapier 1.39 #
782 tupone 1.238 # binary: what command does the app run with ?
783 vapier 1.39 # name: the name that will show up in the menu
784     # icon: give your little like a pretty little icon ...
785 vapier 1.118 # this can be relative (to /usr/share/pixmaps) or
786     # a full path to an icon
787 flameeyes 1.266 # type: what kind of application is this ? for categories:
788 vapier 1.284 # http://standards.freedesktop.org/menu-spec/latest/apa.html
789 vapier 1.39 # path: if your app needs to startup in a specific dir
790     make_desktop_entry() {
791 vapier 1.158 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
792 vapier 1.39
793 vapier 1.158 local exec=${1}
794     local name=${2:-${PN}}
795 wolf31o2 1.293 local icon=${3:-${PN}}
796 vapier 1.158 local type=${4}
797     local path=${5}
798    
799     if [[ -z ${type} ]] ; then
800     local catmaj=${CATEGORY%%-*}
801     local catmin=${CATEGORY##*-}
802     case ${catmaj} in
803     app)
804     case ${catmin} in
805 vapier 1.284 accessibility) type=Accessibility;;
806 flameeyes 1.266 admin) type=System;;
807 vapier 1.284 antivirus) type=System;;
808     arch) type=Archiving;;
809     backup) type=Archiving;;
810 flameeyes 1.266 cdr) type=DiscBurning;;
811     dicts) type=Dictionary;;
812 vapier 1.284 doc) type=Documentation;;
813 vapier 1.158 editors) type=TextEditor;;
814 flameeyes 1.266 emacs) type=TextEditor;;
815 vapier 1.158 emulation) type=Emulator;;
816 flameeyes 1.266 laptop) type=HardwareSettings;;
817     office) type=Office;;
818 vapier 1.284 pda) type=PDA;;
819 flameeyes 1.266 vim) type=TextEditor;;
820     xemacs) type=TextEditor;;
821     *) type=;;
822 vapier 1.158 esac
823 azarah 1.59 ;;
824 vapier 1.158
825     dev)
826 vapier 1.159 type="Development"
827 vapier 1.158 ;;
828    
829     games)
830     case ${catmin} in
831 wolf31o2 1.265 action|fps) type=ActionGame;;
832 flameeyes 1.266 arcade) type=ArcadeGame;;
833     board) type=BoardGame;;
834 vapier 1.284 emulation) type=Emulator;;
835 flameeyes 1.266 kids) type=KidsGame;;
836     puzzle) type=LogicGame;;
837 vapier 1.284 roguelike) type=RolePlaying;;
838 flameeyes 1.266 rpg) type=RolePlaying;;
839 vapier 1.158 simulation) type=Simulation;;
840 flameeyes 1.266 sports) type=SportsGame;;
841     strategy) type=StrategyGame;;
842     *) type=;;
843 vapier 1.158 esac
844 vapier 1.159 type="Game;${type}"
845 vapier 1.158 ;;
846    
847 vapier 1.284 gnome)
848     type="Gnome;GTK"
849     ;;
850    
851     kde)
852     type="KDE;Qt"
853     ;;
854    
855 vapier 1.158 mail)
856 vapier 1.159 type="Network;Email"
857 vapier 1.158 ;;
858    
859     media)
860     case ${catmin} in
861     gfx) type=Graphics;;
862     radio) type=Tuner;;
863     sound) type=Audio;;
864 flameeyes 1.266 tv) type=TV;;
865 vapier 1.158 video) type=Video;;
866 flameeyes 1.266 *) type=;;
867 vapier 1.158 esac
868 vapier 1.159 type="AudioVideo;${type}"
869 wolf31o2 1.65 ;;
870 vapier 1.158
871     net)
872     case ${catmin} in
873     dialup) type=Dialup;;
874 flameeyes 1.266 ftp) type=FileTransfer;;
875     im) type=InstantMessaging;;
876     irc) type=IRCClient;;
877     mail) type=Email;;
878     news) type=News;;
879     nntp) type=News;;
880     p2p) type=FileTransfer;;
881     *) type=;;
882 vapier 1.158 esac
883 vapier 1.159 type="Network;${type}"
884 vapier 1.158 ;;
885    
886     sci)
887     case ${catmin} in
888 vapier 1.284 astro*) type=Astronomy;;
889     bio*) type=Biology;;
890     calc*) type=Calculator;;
891     chem*) type=Chemistry;;
892     elec*) type=Electronics;;
893     geo*) type=Geology;;
894     math*) type=Math;;
895     physics) type=Physics;;
896     visual*) type=DataVisualization;;
897     *) type=;;
898 vapier 1.159 esac
899     type="Science;${type}"
900 vapier 1.158 ;;
901    
902 vapier 1.284 sys)
903     type="System"
904     ;;
905    
906 vapier 1.158 www)
907     case ${catmin} in
908     client) type=WebBrowser;;
909 flameeyes 1.266 *) type=;;
910 vapier 1.158 esac
911 vapier 1.159 type="Network"
912 azarah 1.59 ;;
913 vapier 1.158
914 azarah 1.59 *)
915     type=
916     ;;
917 vapier 1.39 esac
918     fi
919 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
920     local desktop_name="${PN}"
921     else
922     local desktop_name="${PN}-${SLOT}"
923     fi
924 vapier 1.272 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
925 vapier 1.271 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
926 vapier 1.39
927 vapier 1.271 cat <<-EOF > "${desktop}"
928     [Desktop Entry]
929 vapier 1.284 Version=1.0
930 vapier 1.271 Name=${name}
931     Type=Application
932     Comment=${DESCRIPTION}
933     Exec=${exec}
934     TryExec=${exec%% *}
935     Icon=${icon}
936 vapier 1.284 Categories=${type};
937 vapier 1.271 EOF
938 vapier 1.39
939 wolf31o2 1.293 [[ ${path} ]] && echo "Path=${path}" >> "${desktop}"
940    
941 vapier 1.204 (
942     # wrap the env here so that the 'insinto' call
943     # doesn't corrupt the env of the caller
944     insinto /usr/share/applications
945     doins "${desktop}"
946     )
947 danarmak 1.32 }
948    
949 vapier 1.283 # @FUNCTION: validate_desktop_entries
950     # @USAGE: [directories]
951     # @MAINTAINER:
952     # Carsten Lohrke <carlo@gentoo.org>
953     # @DESCRIPTION:
954 carlo 1.278 # Validate desktop entries using desktop-file-utils
955 carlo 1.277 validate_desktop_entries() {
956     if [[ -x /usr/bin/desktop-file-validate ]] ; then
957     einfo "Checking desktop entry validity"
958     local directories=""
959 carlo 1.279 for d in /usr/share/applications $@ ; do
960     [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"
961 carlo 1.277 done
962 carlo 1.279 if [[ -n ${directories} ]] ; then
963     for FILE in $(find ${directories} -name "*\.desktop" \
964     -not -path '*.hidden*' | sort -u 2>/dev/null)
965     do
966     local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | \
967     sed -e "s|error: ||" -e "s|${FILE}:|--|g" )
968     [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}
969     done
970     fi
971 carlo 1.277 echo ""
972     else
973     einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
974     fi
975     }
976    
977 vapier 1.283 # @FUNCTION: make_session_desktop
978 vapier 1.314 # @USAGE: <title> <command> [command args...]
979 vapier 1.283 # @DESCRIPTION:
980     # Make a GDM/KDM Session file. The title is the file to execute to start the
981     # Window Manager. The command is the name of the Window Manager.
982 vapier 1.314 #
983     # You can set the name of the file via the ${wm} variable.
984 lanius 1.133 make_session_desktop() {
985 vapier 1.314 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
986     [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
987 lanius 1.133
988 vapier 1.167 local title=$1
989     local command=$2
990 vapier 1.314 local desktop=${T}/${wm:-${PN}}.desktop
991     shift 2
992 lanius 1.133
993 vapier 1.271 cat <<-EOF > "${desktop}"
994     [Desktop Entry]
995     Name=${title}
996     Comment=This session logs you into ${title}
997 vapier 1.314 Exec=${command} $*
998 vapier 1.271 TryExec=${command}
999 vapier 1.314 Type=XSession
1000 vapier 1.271 EOF
1001 lanius 1.133
1002 vapier 1.271 (
1003     # wrap the env here so that the 'insinto' call
1004     # doesn't corrupt the env of the caller
1005 lanius 1.133 insinto /usr/share/xsessions
1006     doins "${desktop}"
1007 vapier 1.271 )
1008 lanius 1.133 }
1009    
1010 vapier 1.283 # @FUNCTION: domenu
1011     # @USAGE: <menus>
1012     # @DESCRIPTION:
1013     # Install the list of .desktop menu files into the appropriate directory
1014     # (/usr/share/applications).
1015 lanius 1.133 domenu() {
1016 vapier 1.271 (
1017     # wrap the env here so that the 'insinto' call
1018     # doesn't corrupt the env of the caller
1019     local i j ret=0
1020 lanius 1.133 insinto /usr/share/applications
1021 vapier 1.167 for i in "$@" ; do
1022     if [[ -f ${i} ]] ; then
1023     doins "${i}"
1024 vapier 1.271 ((ret+=$?))
1025 vapier 1.167 elif [[ -d ${i} ]] ; then
1026     for j in "${i}"/*.desktop ; do
1027     doins "${j}"
1028 vapier 1.271 ((ret+=$?))
1029 lanius 1.133 done
1030 vapier 1.285 else
1031     ((++ret))
1032 swegener 1.190 fi
1033 lanius 1.133 done
1034 vapier 1.271 exit ${ret}
1035     )
1036 lanius 1.133 }
1037 vapier 1.283
1038     # @FUNCTION: newmenu
1039     # @USAGE: <menu> <newname>
1040     # @DESCRIPTION:
1041     # Like all other new* functions, install the specified menu as newname.
1042 vapier 1.167 newmenu() {
1043 vapier 1.271 (
1044     # wrap the env here so that the 'insinto' call
1045     # doesn't corrupt the env of the caller
1046 vapier 1.167 insinto /usr/share/applications
1047 vapier 1.271 newins "$@"
1048     )
1049 vapier 1.167 }
1050 lanius 1.133
1051 vapier 1.283 # @FUNCTION: doicon
1052     # @USAGE: <list of icons>
1053     # @DESCRIPTION:
1054     # Install the list of icons into the icon directory (/usr/share/pixmaps).
1055     # This is useful in conjunction with creating desktop/menu files.
1056 lanius 1.133 doicon() {
1057 vapier 1.271 (
1058     # wrap the env here so that the 'insinto' call
1059     # doesn't corrupt the env of the caller
1060     local i j ret
1061 lanius 1.133 insinto /usr/share/pixmaps
1062 vapier 1.167 for i in "$@" ; do
1063     if [[ -f ${i} ]] ; then
1064     doins "${i}"
1065 vapier 1.271 ((ret+=$?))
1066 vapier 1.167 elif [[ -d ${i} ]] ; then
1067     for j in "${i}"/*.png ; do
1068     doins "${j}"
1069 vapier 1.271 ((ret+=$?))
1070 lanius 1.133 done
1071 vapier 1.285 else
1072     ((++ret))
1073 swegener 1.190 fi
1074 lanius 1.133 done
1075 vapier 1.271 exit ${ret}
1076     )
1077 lanius 1.133 }
1078 vapier 1.283
1079     # @FUNCTION: newicon
1080     # @USAGE: <icon> <newname>
1081     # @DESCRIPTION:
1082     # Like all other new* functions, install the specified icon as newname.
1083 vapier 1.167 newicon() {
1084 vapier 1.271 (
1085     # wrap the env here so that the 'insinto' call
1086     # doesn't corrupt the env of the caller
1087 vapier 1.167 insinto /usr/share/pixmaps
1088 vapier 1.271 newins "$@"
1089     )
1090 vapier 1.167 }
1091 lanius 1.133
1092 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1093     find_unpackable_file() {
1094 vapier 1.196 local src=$1
1095     if [[ -z ${src} ]] ; then
1096     src=${DISTDIR}/${A}
1097 vapier 1.50 else
1098 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
1099     src=${DISTDIR}/${src}
1100     elif [[ -e ${PWD}/${src} ]] ; then
1101     src=${PWD}/${src}
1102     elif [[ -e ${src} ]] ; then
1103     src=${src}
1104 vapier 1.50 fi
1105     fi
1106 vapier 1.196 [[ ! -e ${src} ]] && return 1
1107 vapier 1.70 echo "${src}"
1108     }
1109    
1110 vapier 1.283 # @FUNCTION: unpack_pdv
1111     # @USAGE: <file to unpack> <size of off_t>
1112     # @DESCRIPTION:
1113 vapier 1.70 # Unpack those pesky pdv generated files ...
1114     # They're self-unpacking programs with the binary package stuffed in
1115     # the middle of the archive. Valve seems to use it a lot ... too bad
1116     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1117 swegener 1.286 #
1118 vapier 1.283 # You have to specify the off_t size ... I have no idea how to extract that
1119     # information out of the binary executable myself. Basically you pass in
1120     # the size of the off_t type (in bytes) on the machine that built the pdv
1121     # archive.
1122 vapier 1.70 #
1123 vapier 1.283 # One way to determine this is by running the following commands:
1124 ulm 1.288 #
1125     # @CODE
1126     # strings <pdv archive> | grep lseek
1127     # strace -elseek <pdv archive>
1128     # @CODE
1129     #
1130 vapier 1.283 # Basically look for the first lseek command (we do the strings/grep because
1131     # sometimes the function call is _llseek or something) and steal the 2nd
1132     # parameter. Here is an example:
1133 ulm 1.288 #
1134     # @CODE
1135     # vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1136     # lseek
1137     # vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1138     # lseek(3, -4, SEEK_END) = 2981250
1139     # @CODE
1140     #
1141 vapier 1.283 # Thus we would pass in the value of '4' as the second parameter.
1142 vapier 1.70 unpack_pdv() {
1143 vapier 1.271 local src=$(find_unpackable_file "$1")
1144 vapier 1.196 local sizeoff_t=$2
1145 vapier 1.70
1146 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1147     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1148 vapier 1.70
1149 vapier 1.212 local shrtsrc=$(basename "${src}")
1150 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1151 vapier 1.271 local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\")
1152     local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\")
1153 vapier 1.70
1154     # grab metadata for debug reasons
1155 vapier 1.271 local metafile=$(emktemp)
1156     tail -c +$((${metaskip}+1)) "${src}" > "${metafile}"
1157 vapier 1.70
1158     # rip out the final file name from the metadata
1159 vapier 1.271 local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1)
1160     datafile=$(basename "${datafile}")
1161 vapier 1.70
1162 vapier 1.71 # now lets uncompress/untar the file if need be
1163 vapier 1.271 local tmpfile=$(emktemp)
1164 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1165 vapier 1.71
1166 vapier 1.271 local iscompressed=$(file -b "${tmpfile}")
1167     if [[ ${iscompressed:0:8} == "compress" ]] ; then
1168 vapier 1.71 iscompressed=1
1169     mv ${tmpfile}{,.Z}
1170     gunzip ${tmpfile}
1171     else
1172     iscompressed=0
1173     fi
1174 vapier 1.271 local istar=$(file -b "${tmpfile}")
1175     if [[ ${istar:0:9} == "POSIX tar" ]] ; then
1176 vapier 1.71 istar=1
1177     else
1178     istar=0
1179     fi
1180    
1181     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1182     #dd if=${src} ibs=${metaskip} count=1 \
1183     # | dd ibs=${tailskip} skip=1 \
1184     # | gzip -dc \
1185     # > ${datafile}
1186     if [ ${iscompressed} -eq 1 ] ; then
1187     if [ ${istar} -eq 1 ] ; then
1188     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1189     | head -c $((${metaskip}-${tailskip})) \
1190     | tar -xzf -
1191     else
1192 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1193     | head -c $((${metaskip}-${tailskip})) \
1194     | gzip -dc \
1195     > ${datafile}
1196 vapier 1.71 fi
1197     else
1198     if [ ${istar} -eq 1 ] ; then
1199     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1200     | head -c $((${metaskip}-${tailskip})) \
1201 vapier 1.73 | tar --no-same-owner -xf -
1202 vapier 1.71 else
1203 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1204     | head -c $((${metaskip}-${tailskip})) \
1205     > ${datafile}
1206 vapier 1.71 fi
1207     fi
1208     true
1209     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1210 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1211     }
1212    
1213 vapier 1.283 # @FUNCTION: unpack_makeself
1214     # @USAGE: [file to unpack] [offset] [tail|dd]
1215     # @DESCRIPTION:
1216 vapier 1.70 # Unpack those pesky makeself generated files ...
1217     # They're shell scripts with the binary package tagged onto
1218     # the end of the archive. Loki utilized the format as does
1219     # many other game companies.
1220 swegener 1.286 #
1221 vapier 1.283 # If the file is not specified, then ${A} is used. If the
1222     # offset is not specified then we will attempt to extract
1223     # the proper offset from the script itself.
1224 vapier 1.70 unpack_makeself() {
1225 vapier 1.217 local src_input=${1:-${A}}
1226     local src=$(find_unpackable_file "${src_input}")
1227 vapier 1.196 local skip=$2
1228     local exe=$3
1229    
1230 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1231 vapier 1.50
1232 vapier 1.196 local shrtsrc=$(basename "${src}")
1233 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1234 vapier 1.212 if [[ -z ${skip} ]] ; then
1235     local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1236 vapier 1.41 local skip=0
1237 vapier 1.112 exe=tail
1238 vapier 1.41 case ${ver} in
1239 wolf31o2 1.240 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1240 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1241 vapier 1.41 ;;
1242     2.0|2.0.1)
1243 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1244 vapier 1.41 ;;
1245 wolf31o2 1.48 2.1.1)
1246 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1247 wolf31o2 1.48 let skip="skip + 1"
1248     ;;
1249 vapier 1.49 2.1.2)
1250 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1251 vapier 1.49 let skip="skip + 1"
1252     ;;
1253 wolf31o2 1.48 2.1.3)
1254 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1255 vapier 1.41 let skip="skip + 1"
1256     ;;
1257 wolf31o2 1.211 2.1.4|2.1.5)
1258 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1259     skip=$(head -n ${skip} "${src}" | wc -c)
1260     exe="dd"
1261     ;;
1262 vapier 1.41 *)
1263     eerror "I'm sorry, but I was unable to support the Makeself file."
1264     eerror "The version I detected was '${ver}'."
1265     eerror "Please file a bug about the file ${shrtsrc} at"
1266     eerror "http://bugs.gentoo.org/ so that support can be added."
1267     die "makeself version '${ver}' not supported"
1268     ;;
1269     esac
1270     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1271     fi
1272 vapier 1.112 case ${exe} in
1273     tail) exe="tail -n +${skip} '${src}'";;
1274     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1275     *) die "makeself cant handle exe '${exe}'"
1276     esac
1277 vapier 1.41
1278 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1279 vapier 1.271 local tmpfile=$(emktemp)
1280 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1281 vapier 1.271 local filetype=$(file -b "${tmpfile}")
1282 vapier 1.68 case ${filetype} in
1283 vapier 1.257 *tar\ archive*)
1284 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1285 vapier 1.68 ;;
1286     bzip2*)
1287 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1288 mr_bones_ 1.69 ;;
1289 vapier 1.68 gzip*)
1290 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1291 vapier 1.68 ;;
1292 vapier 1.93 compress*)
1293 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1294 vapier 1.93 ;;
1295 vapier 1.68 *)
1296 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1297 vapier 1.68 false
1298     ;;
1299     esac
1300     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1301 wolf31o2 1.56 }
1302    
1303 vapier 1.283 # @FUNCTION: check_license
1304     # @USAGE: [license]
1305     # @DESCRIPTION:
1306     # Display a license for user to accept. If no license is
1307     # specified, then ${LICENSE} is used.
1308 wolf31o2 1.56 check_license() {
1309 vapier 1.60 local lic=$1
1310     if [ -z "${lic}" ] ; then
1311     lic="${PORTDIR}/licenses/${LICENSE}"
1312 wolf31o2 1.56 else
1313 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1314     lic="${PORTDIR}/licenses/${lic}"
1315     elif [ -e "${PWD}/${lic}" ] ; then
1316     lic="${PWD}/${lic}"
1317     elif [ -e "${lic}" ] ; then
1318     lic="${lic}"
1319 wolf31o2 1.56 fi
1320     fi
1321 wolf31o2 1.200 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1322 vapier 1.64 local l="`basename ${lic}`"
1323 wolf31o2 1.56
1324 vapier 1.60 # here is where we check for the licenses the user already
1325     # accepted ... if we don't find a match, we make the user accept
1326 wolf31o2 1.106 local shopts=$-
1327 vapier 1.60 local alic
1328 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1329 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1330 wolf31o2 1.255 if [[ ${alic} == ${l} ]]; then
1331 wolf31o2 1.106 set +o noglob; set -${shopts} #reset old shell opts
1332     return 0
1333     fi
1334 vapier 1.60 done
1335 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1336 vapier 1.60
1337 vapier 1.271 local licmsg=$(emktemp)
1338     cat <<-EOF > ${licmsg}
1339     **********************************************************
1340     The following license outlines the terms of use of this
1341     package. You MUST accept this license for installation to
1342     continue. When you are done viewing, hit 'q'. If you
1343     CTRL+C out of this, the install will not run!
1344     **********************************************************
1345 swegener 1.286
1346 vapier 1.271 EOF
1347 vapier 1.60 cat ${lic} >> ${licmsg}
1348     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1349 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1350 vapier 1.60 read alic
1351     case ${alic} in
1352     yes|Yes|y|Y)
1353     return 0
1354     ;;
1355     *)
1356     echo;echo;echo
1357     eerror "You MUST accept the license to continue! Exiting!"
1358     die "Failed to accept license"
1359     ;;
1360     esac
1361 vapier 1.23 }
1362 vapier 1.75
1363 vapier 1.283 # @FUNCTION: cdrom_get_cds
1364     # @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1365     # @DESCRIPTION:
1366 vapier 1.75 # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1367     # the whole 'non-interactive' policy, but damnit I want CD support !
1368 swegener 1.286 #
1369 vapier 1.283 # With these cdrom functions we handle all the user interaction and
1370     # standardize everything. All you have to do is call cdrom_get_cds()
1371 vapier 1.75 # and when the function returns, you can assume that the cd has been
1372     # found at CDROM_ROOT.
1373 swegener 1.286 #
1374 vapier 1.283 # The function will attempt to locate a cd based upon a file that is on
1375     # the cd. The more files you give this function, the more cds
1376     # the cdrom functions will handle.
1377 swegener 1.286 #
1378 vapier 1.283 # Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1379     # etc... If you want to give the cds better names, then just export
1380 vapier 1.243 # the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1381 vapier 1.283 # Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1382     # also use the CDROM_NAME_SET bash array.
1383 swegener 1.286 #
1384 vapier 1.283 # For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1385 vapier 1.75 cdrom_get_cds() {
1386     # first we figure out how many cds we're dealing with by
1387     # the # of files they gave us
1388     local cdcnt=0
1389     local f=
1390     for f in "$@" ; do
1391 vapier 1.214 ((++cdcnt))
1392 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1393     done
1394     export CDROM_TOTAL_CDS=${cdcnt}
1395     export CDROM_CURRENT_CD=1
1396    
1397     # now we see if the user gave use CD_ROOT ...
1398     # if they did, let's just believe them that it's correct
1399 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1400 vapier 1.75 local var=
1401     cdcnt=0
1402 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1403 vapier 1.214 ((++cdcnt))
1404 vapier 1.75 var="CD_ROOT_${cdcnt}"
1405 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1406 vapier 1.131 if [[ -z ${!var} ]] ; then
1407 vapier 1.75 eerror "You must either use just the CD_ROOT"
1408     eerror "or specify ALL the CD_ROOT_X variables."
1409     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1410     die "could not locate CD_ROOT_${cdcnt}"
1411     fi
1412     done
1413 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1414 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1415 vapier 1.215 export CDROM_SET=-1
1416     for f in ${CDROM_CHECK_1//:/ } ; do
1417     ((++CDROM_SET))
1418     [[ -e ${CD_ROOT}/${f} ]] && break
1419     done
1420     export CDROM_MATCH=${f}
1421 vapier 1.75 return
1422     fi
1423    
1424 vapier 1.215 # User didn't help us out so lets make sure they know they can
1425     # simplify the whole process ...
1426 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1427 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1428 vapier 1.75 echo
1429     einfo "If you do not have the CD, but have the data files"
1430     einfo "mounted somewhere on your filesystem, just export"
1431     einfo "the variable CD_ROOT so that it points to the"
1432     einfo "directory containing the files."
1433     echo
1434 vapier 1.132 einfo "For example:"
1435     einfo "export CD_ROOT=/mnt/cdrom"
1436     echo
1437 vapier 1.75 else
1438 vapier 1.243 if [[ -n ${CDROM_NAME_SET} ]] ; then
1439     # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1440     cdcnt=0
1441     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1442     ((++cdcnt))
1443     export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1444     done
1445     fi
1446    
1447 vapier 1.75 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1448     cdcnt=0
1449 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1450 vapier 1.214 ((++cdcnt))
1451 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1452 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1453 vapier 1.75 done
1454     echo
1455     einfo "If you do not have the CDs, but have the data files"
1456     einfo "mounted somewhere on your filesystem, just export"
1457     einfo "the following variables so they point to the right place:"
1458     einfon ""
1459     cdcnt=0
1460 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1461 vapier 1.214 ((++cdcnt))
1462 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1463     done
1464     echo
1465     einfo "Or, if you have all the files in the same place, or"
1466     einfo "you only have one cdrom, you can export CD_ROOT"
1467     einfo "and that place will be used as the same data source"
1468     einfo "for all the CDs."
1469     echo
1470 vapier 1.132 einfo "For example:"
1471     einfo "export CD_ROOT_1=/mnt/cdrom"
1472     echo
1473 vapier 1.75 fi
1474 vapier 1.215
1475 vapier 1.214 export CDROM_SET=""
1476 vapier 1.75 export CDROM_CURRENT_CD=0
1477     cdrom_load_next_cd
1478     }
1479    
1480 vapier 1.283 # @FUNCTION: cdrom_load_next_cd
1481     # @DESCRIPTION:
1482     # Some packages are so big they come on multiple CDs. When you're done reading
1483     # files off a CD and want access to the next one, just call this function.
1484     # Again, all the messy details of user interaction are taken care of for you.
1485     # Once this returns, just read the variable CDROM_ROOT for the location of the
1486     # mounted CD. Note that you can only go forward in the CD list, so make sure
1487     # you only call this function when you're done using the current CD.
1488 vapier 1.75 cdrom_load_next_cd() {
1489 vapier 1.215 local var
1490     ((++CDROM_CURRENT_CD))
1491 vapier 1.79
1492 vapier 1.75 unset CDROM_ROOT
1493 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1494     [[ -z ${!var} ]] && var="CD_ROOT"
1495 vapier 1.131 if [[ -z ${!var} ]] ; then
1496 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1497 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1498 vapier 1.75 else
1499 vapier 1.131 export CDROM_ROOT=${!var}
1500 vapier 1.75 fi
1501    
1502     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1503     }
1504    
1505     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1506     # functions. this should *never* be called from an ebuild.
1507     # all it does is try to locate a give file on a cd ... if the cd isn't
1508     # found, then a message asking for the user to insert the cdrom will be
1509     # displayed and we'll hang out here until:
1510     # (1) the file is found on a mounted cdrom
1511     # (2) the user hits CTRL+C
1512 vapier 1.215 _cdrom_locate_file_on_cd() {
1513 vapier 1.214 local mline=""
1514 wolf31o2 1.296 local showedmsg=0 showjolietmsg=0
1515 vapier 1.214
1516 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1517 vapier 1.214 local i=0
1518     local -a cdset=(${*//:/ })
1519     if [[ -n ${CDROM_SET} ]] ; then
1520     cdset=(${cdset[${CDROM_SET}]})
1521     fi
1522    
1523     while [[ -n ${cdset[${i}]} ]] ; do
1524     local dir=$(dirname ${cdset[${i}]})
1525     local file=$(basename ${cdset[${i}]})
1526    
1527 uberlord 1.259 local point= node= fs= foo=
1528     while read point node fs foo ; do
1529 nyhm 1.281 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1530 uberlord 1.264 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1531     && continue
1532 uberlord 1.259 point=${point//\040/ }
1533 vapier 1.292 [[ ! -d ${point}/${dir} ]] && continue
1534 uberlord 1.259 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1535     export CDROM_ROOT=${point}
1536     export CDROM_SET=${i}
1537     export CDROM_MATCH=${cdset[${i}]}
1538     return
1539 kanaka 1.262 done <<< "$(get_mounts)"
1540 vapier 1.214
1541     ((++i))
1542 vapier 1.75 done
1543    
1544 vapier 1.214 echo
1545     if [[ ${showedmsg} -eq 0 ]] ; then
1546     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1547     if [[ -z ${CDROM_NAME} ]] ; then
1548     einfo "Please insert+mount the cdrom for ${PN} now !"
1549     else
1550     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1551     fi
1552     else
1553     if [[ -z ${CDROM_NAME_1} ]] ; then
1554     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1555 vapier 1.75 else
1556 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1557     einfo "Please insert+mount the ${!var} cdrom now !"
1558 vapier 1.75 fi
1559     fi
1560 vapier 1.214 showedmsg=1
1561 vapier 1.75 fi
1562 vapier 1.214 einfo "Press return to scan for the cd again"
1563     einfo "or hit CTRL+C to abort the emerge."
1564     echo
1565 wolf31o2 1.296 if [[ ${showjolietmsg} -eq 0 ]] ; then
1566     showjolietmsg=1
1567     else
1568     ewarn "If you are having trouble with the detection"
1569     ewarn "of your CD, it is possible that you do not have"
1570     ewarn "Joliet support enabled in your kernel. Please"
1571     ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1572     ebeep 5
1573     fi
1574 vapier 1.222 read || die "something is screwed with your system"
1575 vapier 1.75 done
1576     }
1577 vapier 1.92
1578 vapier 1.287 # @FUNCTION: strip-linguas
1579     # @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1580     # @DESCRIPTION:
1581 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1582 vapier 1.287 # a package can support. The first form allows you to
1583     # specify a list of LINGUAS. The -i builds a list of po
1584     # files found in all the directories and uses the
1585     # intersection of the lists. The -u builds a list of po
1586     # files found in all the directories and uses the union
1587     # of the lists.
1588 vapier 1.92 strip-linguas() {
1589 vapier 1.242 local ls newls nols
1590 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1591     local op=$1; shift
1592 vapier 1.315 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1593 vapier 1.92 local d f
1594     for d in "$@" ; do
1595 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1596     newls=${ls}
1597 vapier 1.92 else
1598     newls=""
1599     fi
1600 vapier 1.315 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1601 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1602 vapier 1.236 hasq ${f} ${ls} && newls="${newls} ${f}"
1603 vapier 1.92 else
1604 vapier 1.236 hasq ${f} ${ls} || newls="${newls} ${f}"
1605 vapier 1.92 fi
1606     done
1607 vapier 1.154 ls=${newls}
1608 vapier 1.92 done
1609     else
1610 vapier 1.236 ls="$@"
1611 vapier 1.92 fi
1612    
1613 vapier 1.242 nols=""
1614 vapier 1.92 newls=""
1615     for f in ${LINGUAS} ; do
1616 vapier 1.236 if hasq ${f} ${ls} ; then
1617 vapier 1.120 newls="${newls} ${f}"
1618 vapier 1.92 else
1619 vapier 1.242 nols="${nols} ${f}"
1620 vapier 1.92 fi
1621     done
1622 vapier 1.244 [[ -n ${nols} ]] \
1623 vapier 1.316 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1624 vapier 1.237 export LINGUAS=${newls:1}
1625 vapier 1.92 }
1626 iggy 1.110
1627 vapier 1.283 # @FUNCTION: preserve_old_lib
1628     # @USAGE: <libs to preserve> [more libs]
1629     # @DESCRIPTION:
1630     # These functions are useful when a lib in your package changes ABI SONAME.
1631     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1632 eradicator 1.111 # would break packages that link against it. Most people get around this
1633     # by using the portage SLOT mechanism, but that is not always a relevant
1634 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1635     # preserve_old_lib_notify function.
1636 eradicator 1.111 preserve_old_lib() {
1637 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1638 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1639 vapier 1.276 die "Invalid preserve_old_lib() usage"
1640 vapier 1.267 fi
1641     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1642    
1643 vapier 1.297 # let portage worry about it
1644     has preserve-libs ${FEATURES} && return 0
1645    
1646 vapier 1.267 local lib dir
1647     for lib in "$@" ; do
1648     [[ -e ${ROOT}/${lib} ]] || continue
1649     dir=${lib%/*}
1650     dodir ${dir} || die "dodir ${dir} failed"
1651     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1652     touch "${D}"/${lib}
1653     done
1654 eradicator 1.111 }
1655    
1656 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1657     # @USAGE: <libs to notify> [more libs]
1658     # @DESCRIPTION:
1659     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1660 eradicator 1.111 preserve_old_lib_notify() {
1661 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1662 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1663 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1664 vapier 1.267 fi
1665    
1666 vapier 1.297 # let portage worry about it
1667     has preserve-libs ${FEATURES} && return 0
1668    
1669 vapier 1.267 local lib notice=0
1670     for lib in "$@" ; do
1671     [[ -e ${ROOT}/${lib} ]] || continue
1672     if [[ ${notice} -eq 0 ]] ; then
1673     notice=1
1674     ewarn "Old versions of installed libraries were detected on your system."
1675     ewarn "In order to avoid breaking packages that depend on these old libs,"
1676     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1677     ewarn "in order to remove these old dependencies. If you do not have this"
1678     ewarn "helper program, simply emerge the 'gentoolkit' package."
1679     ewarn
1680     fi
1681     ewarn " # revdep-rebuild --library ${lib##*/}"
1682     done
1683 vapier 1.291 if [[ ${notice} -eq 1 ]] ; then
1684     ewarn
1685     ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1686 vapier 1.300 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1687     for lib in "$@" ; do
1688     ewarn " # rm '${lib}'"
1689     done
1690 vapier 1.291 fi
1691 eradicator 1.111 }
1692 vapier 1.125
1693 vapier 1.283 # @FUNCTION: built_with_use
1694     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1695     # @DESCRIPTION:
1696     # A temporary hack until portage properly supports DEPENDing on USE
1697     # flags being enabled in packages. This will check to see if the specified
1698     # DEPEND atom was built with the specified list of USE flags. The
1699     # --missing option controls the behavior if called on a package that does
1700     # not actually support the defined USE flags (aka listed in IUSE).
1701     # The default is to abort (call die). The -a and -o flags control
1702     # the requirements of the USE flags. They correspond to "and" and "or"
1703     # logic. So the -a flag means all listed USE flags must be enabled
1704 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1705 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1706     # means the USE flag we're checking is hidden expanded, so it won't be found
1707     # in IUSE like normal USE flags.
1708 swegener 1.286 #
1709 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1710     # flags matter.
1711 vapier 1.125 built_with_use() {
1712 vapier 1.275 local hidden="no"
1713     if [[ $1 == "--hidden" ]] ; then
1714     hidden="yes"
1715     shift
1716     fi
1717    
1718 vapier 1.269 local missing_action="die"
1719     if [[ $1 == "--missing" ]] ; then
1720     missing_action=$2
1721     shift ; shift
1722     case ${missing_action} in
1723     true|false|die) ;;
1724     *) die "unknown action '${missing_action}'";;
1725     esac
1726     fi
1727    
1728 vapier 1.130 local opt=$1
1729     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1730    
1731     local PKG=$(best_version $1)
1732 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1733 vapier 1.130 shift
1734    
1735 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1736 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1737 vapier 1.213
1738 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1739     # this gracefully
1740 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1741 cardoe 1.273 case ${missing_action} in
1742     true) return 0;;
1743     false) return 1;;
1744     die) die "Unable to determine what USE flags $PKG was built with";;
1745     esac
1746     fi
1747    
1748 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1749 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1750 vapier 1.275 # Don't check USE_EXPAND #147237
1751     local expand
1752     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1753     if [[ $1 == ${expand}_* ]] ; then
1754     expand=""
1755     break
1756     fi
1757     done
1758     if [[ -n ${expand} ]] ; then
1759 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1760 vapier 1.275 case ${missing_action} in
1761     true) return 0;;
1762     false) return 1;;
1763     die) die "$PKG does not actually support the $1 USE flag!";;
1764     esac
1765     fi
1766 vapier 1.269 fi
1767 vapier 1.250 fi
1768 vapier 1.249
1769 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1770 vapier 1.130 while [[ $# -gt 0 ]] ; do
1771     if [[ ${opt} = "-o" ]] ; then
1772     has $1 ${USE_BUILT} && return 0
1773     else
1774     has $1 ${USE_BUILT} || return 1
1775     fi
1776 vapier 1.125 shift
1777     done
1778 vapier 1.130 [[ ${opt} = "-a" ]]
1779 vapier 1.125 }
1780 vapier 1.126
1781 vapier 1.289 # @FUNCTION: epunt_cxx
1782 vapier 1.283 # @USAGE: [dir to scan]
1783     # @DESCRIPTION:
1784     # Many configure scripts wrongly bail when a C++ compiler could not be
1785     # detected. If dir is not specified, then it defaults to ${S}.
1786     #
1787     # http://bugs.gentoo.org/73450
1788 vapier 1.126 epunt_cxx() {
1789 vapier 1.127 local dir=$1
1790     [[ -z ${dir} ]] && dir=${S}
1791     ebegin "Removing useless C++ checks"
1792     local f
1793 vapier 1.294 find "${dir}" -name configure | while read f ; do
1794     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1795 vapier 1.127 done
1796     eend 0
1797 vapier 1.126 }
1798 ka0ttic 1.143
1799 vapier 1.283 # @FUNCTION: make_wrapper
1800 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1801 vapier 1.283 # @DESCRIPTION:
1802     # Create a shell wrapper script named wrapper in installpath
1803     # (defaults to the bindir) to execute target (default of wrapper) by
1804     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1805     # libpaths followed by optionally changing directory to chdir.
1806 wolf31o2 1.160 make_wrapper() {
1807 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1808 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1809 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1810     # things as $bin ... "./someprog --args"
1811 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1812     #!/bin/sh
1813 vapier 1.201 cd "${chdir:-.}"
1814 vapier 1.210 if [ -n "${libdir}" ] ; then
1815     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1816     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1817     else
1818     export LD_LIBRARY_PATH="${libdir}"
1819     fi
1820 vapier 1.201 fi
1821 vapier 1.202 exec ${bin} "\$@"
1822 wolf31o2 1.160 EOF
1823     chmod go+rx "${tmpwrapper}"
1824 vapier 1.201 if [[ -n ${path} ]] ; then
1825 vapier 1.283 (
1826 vapier 1.201 exeinto "${path}"
1827 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1828 vapier 1.283 ) || die
1829 wolf31o2 1.164 else
1830 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1831 wolf31o2 1.164 fi
1832 wolf31o2 1.160 }
1833 mr_bones_ 1.311
1834     # @FUNCTION: prepalldocs
1835     # @USAGE:
1836     # @DESCRIPTION:
1837     # Compress files in /usr/share/doc which are not already
1838     # compressed, excluding /usr/share/doc/${PF}/html.
1839     # Uses the ecompressdir to do the compression.
1840 betelgeuse 1.313 # 2009-02-18 by betelgeuse:
1841     # Commented because ecompressdir is even more internal to
1842     # Portage than prepalldocs (it's not even mentioned in man 5
1843     # ebuild). Please submit a better version for review to gentoo-dev
1844     # if you want prepalldocs here.
1845     #prepalldocs() {
1846     # if [[ -n $1 ]] ; then
1847     # ewarn "prepalldocs: invalid usage; takes no arguments"
1848     # fi
1849    
1850     # cd "${D}"
1851     # [[ -d usr/share/doc ]] || return 0
1852    
1853     # find usr/share/doc -exec gzip {} +
1854     # ecompressdir --ignore /usr/share/doc/${PF}/html
1855     # ecompressdir --queue /usr/share/doc
1856     #}

  ViewVC Help
Powered by ViewVC 1.1.20