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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.335 - (hide annotations) (download)
Fri Feb 26 05:17:24 2010 UTC (4 years, 8 months ago) by halcy0n
Branch: MAIN
Changes since 1.334: +3 -15 lines
Broken with stable versions of bash

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

  ViewVC Help
Powered by ViewVC 1.1.20