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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.322 - (hide annotations) (download)
Fri Dec 11 20:31:34 2009 UTC (4 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.321: +49 -6 lines
add new eshopts_{push,pop} functions to simplify mucking with shell options

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

  ViewVC Help
Powered by ViewVC 1.1.20