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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.330 - (hide annotations) (download)
Mon Feb 15 02:10:39 2010 UTC (4 years, 7 months ago) by vapier
Branch: MAIN
Changes since 1.329: +20 -7 lines
eshopts_{push,pop}: add support for the extended options available only via `shopt`

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

  ViewVC Help
Powered by ViewVC 1.1.20