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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.334 - (hide annotations) (download)
Fri Feb 26 03:15:26 2010 UTC (4 years, 8 months ago) by abcd
Branch: MAIN
Changes since 1.333: +16 -4 lines
Properly implement the Desktop File Specification in make_desktop_entry()

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 abcd 1.334 voip) type=Telephony;;
965 flameeyes 1.266 *) type=;;
966 vapier 1.158 esac
967 vapier 1.159 type="Network;${type}"
968 vapier 1.158 ;;
969    
970     sci)
971     case ${catmin} in
972 vapier 1.284 astro*) type=Astronomy;;
973     bio*) type=Biology;;
974     calc*) type=Calculator;;
975     chem*) type=Chemistry;;
976     elec*) type=Electronics;;
977     geo*) type=Geology;;
978     math*) type=Math;;
979     physics) type=Physics;;
980     visual*) type=DataVisualization;;
981     *) type=;;
982 vapier 1.159 esac
983 abcd 1.334 type="Education;Science;${type}"
984 vapier 1.158 ;;
985    
986 vapier 1.284 sys)
987     type="System"
988     ;;
989    
990 vapier 1.158 www)
991     case ${catmin} in
992     client) type=WebBrowser;;
993 flameeyes 1.266 *) type=;;
994 vapier 1.158 esac
995 abcd 1.334 type="Network;${type}"
996 azarah 1.59 ;;
997 vapier 1.158
998 azarah 1.59 *)
999     type=
1000     ;;
1001 vapier 1.39 esac
1002     fi
1003 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
1004     local desktop_name="${PN}"
1005     else
1006     local desktop_name="${PN}-${SLOT}"
1007     fi
1008 vapier 1.272 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
1009 vapier 1.271 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
1010 vapier 1.39
1011 abcd 1.334 # Don't append another ";" when a valid category value is provided.
1012     type=${type%;}${type:+;}
1013    
1014     eshopts_push -s extglob
1015     if [[ -n ${icon} && ${icon} != /* && ${icon} == *.@(xpm|png|svg) ]]; then
1016     ewarn "As described in the Icon Theme Specification, icon file extensions are not"
1017     ewarn "allowed in .desktop files if the value is not an absolute path."
1018     icon=${icon%.@(xpm|png|svg)}
1019     fi
1020     eshopts_pop
1021    
1022 vapier 1.271 cat <<-EOF > "${desktop}"
1023     [Desktop Entry]
1024     Name=${name}
1025     Type=Application
1026     Comment=${DESCRIPTION}
1027     Exec=${exec}
1028     TryExec=${exec%% *}
1029     Icon=${icon}
1030 abcd 1.334 Categories=${type}
1031 vapier 1.271 EOF
1032 vapier 1.39
1033 wolf31o2 1.293 [[ ${path} ]] && echo "Path=${path}" >> "${desktop}"
1034    
1035 vapier 1.204 (
1036     # wrap the env here so that the 'insinto' call
1037     # doesn't corrupt the env of the caller
1038     insinto /usr/share/applications
1039     doins "${desktop}"
1040     )
1041 danarmak 1.32 }
1042    
1043 vapier 1.283 # @FUNCTION: validate_desktop_entries
1044     # @USAGE: [directories]
1045     # @MAINTAINER:
1046     # Carsten Lohrke <carlo@gentoo.org>
1047     # @DESCRIPTION:
1048 carlo 1.278 # Validate desktop entries using desktop-file-utils
1049 carlo 1.277 validate_desktop_entries() {
1050     if [[ -x /usr/bin/desktop-file-validate ]] ; then
1051     einfo "Checking desktop entry validity"
1052     local directories=""
1053 carlo 1.279 for d in /usr/share/applications $@ ; do
1054     [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"
1055 carlo 1.277 done
1056 carlo 1.279 if [[ -n ${directories} ]] ; then
1057     for FILE in $(find ${directories} -name "*\.desktop" \
1058     -not -path '*.hidden*' | sort -u 2>/dev/null)
1059     do
1060     local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | \
1061     sed -e "s|error: ||" -e "s|${FILE}:|--|g" )
1062     [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}
1063     done
1064     fi
1065 carlo 1.277 echo ""
1066     else
1067     einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
1068     fi
1069     }
1070    
1071 vapier 1.283 # @FUNCTION: make_session_desktop
1072 vapier 1.314 # @USAGE: <title> <command> [command args...]
1073 vapier 1.283 # @DESCRIPTION:
1074     # Make a GDM/KDM Session file. The title is the file to execute to start the
1075     # Window Manager. The command is the name of the Window Manager.
1076 vapier 1.314 #
1077     # You can set the name of the file via the ${wm} variable.
1078 lanius 1.133 make_session_desktop() {
1079 vapier 1.314 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
1080     [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
1081 lanius 1.133
1082 vapier 1.167 local title=$1
1083     local command=$2
1084 vapier 1.314 local desktop=${T}/${wm:-${PN}}.desktop
1085     shift 2
1086 lanius 1.133
1087 vapier 1.271 cat <<-EOF > "${desktop}"
1088     [Desktop Entry]
1089     Name=${title}
1090     Comment=This session logs you into ${title}
1091 vapier 1.314 Exec=${command} $*
1092 vapier 1.271 TryExec=${command}
1093 vapier 1.314 Type=XSession
1094 vapier 1.271 EOF
1095 lanius 1.133
1096 vapier 1.271 (
1097     # wrap the env here so that the 'insinto' call
1098     # doesn't corrupt the env of the caller
1099 lanius 1.133 insinto /usr/share/xsessions
1100     doins "${desktop}"
1101 vapier 1.271 )
1102 lanius 1.133 }
1103    
1104 vapier 1.283 # @FUNCTION: domenu
1105     # @USAGE: <menus>
1106     # @DESCRIPTION:
1107     # Install the list of .desktop menu files into the appropriate directory
1108     # (/usr/share/applications).
1109 lanius 1.133 domenu() {
1110 vapier 1.271 (
1111     # wrap the env here so that the 'insinto' call
1112     # doesn't corrupt the env of the caller
1113     local i j ret=0
1114 lanius 1.133 insinto /usr/share/applications
1115 vapier 1.167 for i in "$@" ; do
1116     if [[ -f ${i} ]] ; then
1117     doins "${i}"
1118 vapier 1.271 ((ret+=$?))
1119 vapier 1.167 elif [[ -d ${i} ]] ; then
1120     for j in "${i}"/*.desktop ; do
1121     doins "${j}"
1122 vapier 1.271 ((ret+=$?))
1123 lanius 1.133 done
1124 vapier 1.285 else
1125     ((++ret))
1126 swegener 1.190 fi
1127 lanius 1.133 done
1128 vapier 1.271 exit ${ret}
1129     )
1130 lanius 1.133 }
1131 vapier 1.283
1132     # @FUNCTION: newmenu
1133     # @USAGE: <menu> <newname>
1134     # @DESCRIPTION:
1135     # Like all other new* functions, install the specified menu as newname.
1136 vapier 1.167 newmenu() {
1137 vapier 1.271 (
1138     # wrap the env here so that the 'insinto' call
1139     # doesn't corrupt the env of the caller
1140 vapier 1.167 insinto /usr/share/applications
1141 vapier 1.271 newins "$@"
1142     )
1143 vapier 1.167 }
1144 lanius 1.133
1145 vapier 1.283 # @FUNCTION: doicon
1146     # @USAGE: <list of icons>
1147     # @DESCRIPTION:
1148     # Install the list of icons into the icon directory (/usr/share/pixmaps).
1149     # This is useful in conjunction with creating desktop/menu files.
1150 lanius 1.133 doicon() {
1151 vapier 1.271 (
1152     # wrap the env here so that the 'insinto' call
1153     # doesn't corrupt the env of the caller
1154     local i j ret
1155 lanius 1.133 insinto /usr/share/pixmaps
1156 vapier 1.167 for i in "$@" ; do
1157     if [[ -f ${i} ]] ; then
1158     doins "${i}"
1159 vapier 1.271 ((ret+=$?))
1160 vapier 1.167 elif [[ -d ${i} ]] ; then
1161     for j in "${i}"/*.png ; do
1162     doins "${j}"
1163 vapier 1.271 ((ret+=$?))
1164 lanius 1.133 done
1165 vapier 1.285 else
1166     ((++ret))
1167 swegener 1.190 fi
1168 lanius 1.133 done
1169 vapier 1.271 exit ${ret}
1170     )
1171 lanius 1.133 }
1172 vapier 1.283
1173     # @FUNCTION: newicon
1174     # @USAGE: <icon> <newname>
1175     # @DESCRIPTION:
1176     # Like all other new* functions, install the specified icon as newname.
1177 vapier 1.167 newicon() {
1178 vapier 1.271 (
1179     # wrap the env here so that the 'insinto' call
1180     # doesn't corrupt the env of the caller
1181 vapier 1.167 insinto /usr/share/pixmaps
1182 vapier 1.271 newins "$@"
1183     )
1184 vapier 1.167 }
1185 lanius 1.133
1186 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1187     find_unpackable_file() {
1188 vapier 1.196 local src=$1
1189     if [[ -z ${src} ]] ; then
1190     src=${DISTDIR}/${A}
1191 vapier 1.50 else
1192 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
1193     src=${DISTDIR}/${src}
1194     elif [[ -e ${PWD}/${src} ]] ; then
1195     src=${PWD}/${src}
1196     elif [[ -e ${src} ]] ; then
1197     src=${src}
1198 vapier 1.50 fi
1199     fi
1200 vapier 1.196 [[ ! -e ${src} ]] && return 1
1201 vapier 1.70 echo "${src}"
1202     }
1203    
1204 vapier 1.283 # @FUNCTION: unpack_pdv
1205     # @USAGE: <file to unpack> <size of off_t>
1206     # @DESCRIPTION:
1207 vapier 1.70 # Unpack those pesky pdv generated files ...
1208     # They're self-unpacking programs with the binary package stuffed in
1209     # the middle of the archive. Valve seems to use it a lot ... too bad
1210     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1211 swegener 1.286 #
1212 vapier 1.283 # You have to specify the off_t size ... I have no idea how to extract that
1213     # information out of the binary executable myself. Basically you pass in
1214     # the size of the off_t type (in bytes) on the machine that built the pdv
1215     # archive.
1216 vapier 1.70 #
1217 vapier 1.283 # One way to determine this is by running the following commands:
1218 ulm 1.288 #
1219     # @CODE
1220     # strings <pdv archive> | grep lseek
1221     # strace -elseek <pdv archive>
1222     # @CODE
1223     #
1224 vapier 1.283 # Basically look for the first lseek command (we do the strings/grep because
1225     # sometimes the function call is _llseek or something) and steal the 2nd
1226     # parameter. Here is an example:
1227 ulm 1.288 #
1228     # @CODE
1229     # vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1230     # lseek
1231     # vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1232     # lseek(3, -4, SEEK_END) = 2981250
1233     # @CODE
1234     #
1235 vapier 1.283 # Thus we would pass in the value of '4' as the second parameter.
1236 vapier 1.70 unpack_pdv() {
1237 vapier 1.271 local src=$(find_unpackable_file "$1")
1238 vapier 1.196 local sizeoff_t=$2
1239 vapier 1.70
1240 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1241     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1242 vapier 1.70
1243 vapier 1.212 local shrtsrc=$(basename "${src}")
1244 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1245 vapier 1.271 local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\")
1246     local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\")
1247 vapier 1.70
1248     # grab metadata for debug reasons
1249 vapier 1.271 local metafile=$(emktemp)
1250     tail -c +$((${metaskip}+1)) "${src}" > "${metafile}"
1251 vapier 1.70
1252     # rip out the final file name from the metadata
1253 vapier 1.271 local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1)
1254     datafile=$(basename "${datafile}")
1255 vapier 1.70
1256 vapier 1.71 # now lets uncompress/untar the file if need be
1257 vapier 1.271 local tmpfile=$(emktemp)
1258 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1259 vapier 1.71
1260 vapier 1.271 local iscompressed=$(file -b "${tmpfile}")
1261     if [[ ${iscompressed:0:8} == "compress" ]] ; then
1262 vapier 1.71 iscompressed=1
1263     mv ${tmpfile}{,.Z}
1264     gunzip ${tmpfile}
1265     else
1266     iscompressed=0
1267     fi
1268 vapier 1.271 local istar=$(file -b "${tmpfile}")
1269     if [[ ${istar:0:9} == "POSIX tar" ]] ; then
1270 vapier 1.71 istar=1
1271     else
1272     istar=0
1273     fi
1274    
1275     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1276     #dd if=${src} ibs=${metaskip} count=1 \
1277     # | dd ibs=${tailskip} skip=1 \
1278     # | gzip -dc \
1279     # > ${datafile}
1280     if [ ${iscompressed} -eq 1 ] ; then
1281     if [ ${istar} -eq 1 ] ; then
1282     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1283     | head -c $((${metaskip}-${tailskip})) \
1284     | tar -xzf -
1285     else
1286 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1287     | head -c $((${metaskip}-${tailskip})) \
1288     | gzip -dc \
1289     > ${datafile}
1290 vapier 1.71 fi
1291     else
1292     if [ ${istar} -eq 1 ] ; then
1293     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1294     | head -c $((${metaskip}-${tailskip})) \
1295 vapier 1.73 | tar --no-same-owner -xf -
1296 vapier 1.71 else
1297 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1298     | head -c $((${metaskip}-${tailskip})) \
1299     > ${datafile}
1300 vapier 1.71 fi
1301     fi
1302     true
1303     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1304 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1305     }
1306    
1307 vapier 1.283 # @FUNCTION: unpack_makeself
1308     # @USAGE: [file to unpack] [offset] [tail|dd]
1309     # @DESCRIPTION:
1310 vapier 1.70 # Unpack those pesky makeself generated files ...
1311     # They're shell scripts with the binary package tagged onto
1312     # the end of the archive. Loki utilized the format as does
1313     # many other game companies.
1314 swegener 1.286 #
1315 vapier 1.283 # If the file is not specified, then ${A} is used. If the
1316     # offset is not specified then we will attempt to extract
1317     # the proper offset from the script itself.
1318 vapier 1.70 unpack_makeself() {
1319 vapier 1.217 local src_input=${1:-${A}}
1320     local src=$(find_unpackable_file "${src_input}")
1321 vapier 1.196 local skip=$2
1322     local exe=$3
1323    
1324 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1325 vapier 1.50
1326 vapier 1.196 local shrtsrc=$(basename "${src}")
1327 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1328 vapier 1.212 if [[ -z ${skip} ]] ; then
1329     local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1330 vapier 1.41 local skip=0
1331 vapier 1.112 exe=tail
1332 vapier 1.41 case ${ver} in
1333 wolf31o2 1.240 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1334 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1335 vapier 1.41 ;;
1336     2.0|2.0.1)
1337 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1338 vapier 1.41 ;;
1339 wolf31o2 1.48 2.1.1)
1340 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1341 wolf31o2 1.48 let skip="skip + 1"
1342     ;;
1343 vapier 1.49 2.1.2)
1344 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1345 vapier 1.49 let skip="skip + 1"
1346     ;;
1347 wolf31o2 1.48 2.1.3)
1348 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1349 vapier 1.41 let skip="skip + 1"
1350     ;;
1351 wolf31o2 1.211 2.1.4|2.1.5)
1352 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1353     skip=$(head -n ${skip} "${src}" | wc -c)
1354     exe="dd"
1355     ;;
1356 vapier 1.41 *)
1357     eerror "I'm sorry, but I was unable to support the Makeself file."
1358     eerror "The version I detected was '${ver}'."
1359     eerror "Please file a bug about the file ${shrtsrc} at"
1360     eerror "http://bugs.gentoo.org/ so that support can be added."
1361     die "makeself version '${ver}' not supported"
1362     ;;
1363     esac
1364     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1365     fi
1366 vapier 1.112 case ${exe} in
1367     tail) exe="tail -n +${skip} '${src}'";;
1368     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1369     *) die "makeself cant handle exe '${exe}'"
1370     esac
1371 vapier 1.41
1372 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1373 vapier 1.271 local tmpfile=$(emktemp)
1374 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1375 vapier 1.271 local filetype=$(file -b "${tmpfile}")
1376 vapier 1.68 case ${filetype} in
1377 vapier 1.257 *tar\ archive*)
1378 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1379 vapier 1.68 ;;
1380     bzip2*)
1381 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1382 mr_bones_ 1.69 ;;
1383 vapier 1.68 gzip*)
1384 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1385 vapier 1.68 ;;
1386 vapier 1.93 compress*)
1387 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1388 vapier 1.93 ;;
1389 vapier 1.68 *)
1390 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1391 vapier 1.68 false
1392     ;;
1393     esac
1394     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1395 wolf31o2 1.56 }
1396    
1397 vapier 1.283 # @FUNCTION: check_license
1398     # @USAGE: [license]
1399     # @DESCRIPTION:
1400     # Display a license for user to accept. If no license is
1401     # specified, then ${LICENSE} is used.
1402 wolf31o2 1.56 check_license() {
1403 vapier 1.60 local lic=$1
1404     if [ -z "${lic}" ] ; then
1405     lic="${PORTDIR}/licenses/${LICENSE}"
1406 wolf31o2 1.56 else
1407 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1408     lic="${PORTDIR}/licenses/${lic}"
1409     elif [ -e "${PWD}/${lic}" ] ; then
1410     lic="${PWD}/${lic}"
1411     elif [ -e "${lic}" ] ; then
1412     lic="${lic}"
1413 wolf31o2 1.56 fi
1414     fi
1415 vapier 1.64 local l="`basename ${lic}`"
1416 wolf31o2 1.56
1417 vapier 1.60 # here is where we check for the licenses the user already
1418     # accepted ... if we don't find a match, we make the user accept
1419     local alic
1420 vapier 1.322 eshopts_push -o noglob # so that bash doesn't expand "*"
1421 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1422 wolf31o2 1.255 if [[ ${alic} == ${l} ]]; then
1423 vapier 1.322 eshopts_pop
1424 wolf31o2 1.106 return 0
1425     fi
1426 vapier 1.60 done
1427 vapier 1.322 eshopts_pop
1428 zmedico 1.324 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1429 vapier 1.60
1430 vapier 1.271 local licmsg=$(emktemp)
1431     cat <<-EOF > ${licmsg}
1432     **********************************************************
1433     The following license outlines the terms of use of this
1434     package. You MUST accept this license for installation to
1435     continue. When you are done viewing, hit 'q'. If you
1436     CTRL+C out of this, the install will not run!
1437     **********************************************************
1438 swegener 1.286
1439 vapier 1.271 EOF
1440 vapier 1.60 cat ${lic} >> ${licmsg}
1441     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1442 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1443 vapier 1.60 read alic
1444     case ${alic} in
1445     yes|Yes|y|Y)
1446     return 0
1447     ;;
1448     *)
1449     echo;echo;echo
1450     eerror "You MUST accept the license to continue! Exiting!"
1451     die "Failed to accept license"
1452     ;;
1453     esac
1454 vapier 1.23 }
1455 vapier 1.75
1456 vapier 1.283 # @FUNCTION: cdrom_get_cds
1457     # @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1458     # @DESCRIPTION:
1459 vapier 1.75 # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1460     # the whole 'non-interactive' policy, but damnit I want CD support !
1461 swegener 1.286 #
1462 vapier 1.283 # With these cdrom functions we handle all the user interaction and
1463     # standardize everything. All you have to do is call cdrom_get_cds()
1464 vapier 1.75 # and when the function returns, you can assume that the cd has been
1465     # found at CDROM_ROOT.
1466 swegener 1.286 #
1467 vapier 1.283 # The function will attempt to locate a cd based upon a file that is on
1468     # the cd. The more files you give this function, the more cds
1469     # the cdrom functions will handle.
1470 swegener 1.286 #
1471 vapier 1.283 # Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1472     # etc... If you want to give the cds better names, then just export
1473 vapier 1.243 # the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1474 vapier 1.283 # Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1475     # also use the CDROM_NAME_SET bash array.
1476 swegener 1.286 #
1477 vapier 1.283 # For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1478 vapier 1.75 cdrom_get_cds() {
1479     # first we figure out how many cds we're dealing with by
1480     # the # of files they gave us
1481     local cdcnt=0
1482     local f=
1483     for f in "$@" ; do
1484 vapier 1.214 ((++cdcnt))
1485 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1486     done
1487     export CDROM_TOTAL_CDS=${cdcnt}
1488     export CDROM_CURRENT_CD=1
1489    
1490     # now we see if the user gave use CD_ROOT ...
1491     # if they did, let's just believe them that it's correct
1492 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1493 vapier 1.75 local var=
1494     cdcnt=0
1495 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1496 vapier 1.214 ((++cdcnt))
1497 vapier 1.75 var="CD_ROOT_${cdcnt}"
1498 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1499 vapier 1.131 if [[ -z ${!var} ]] ; then
1500 vapier 1.75 eerror "You must either use just the CD_ROOT"
1501     eerror "or specify ALL the CD_ROOT_X variables."
1502     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1503     die "could not locate CD_ROOT_${cdcnt}"
1504     fi
1505     done
1506 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1507 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1508 vapier 1.215 export CDROM_SET=-1
1509     for f in ${CDROM_CHECK_1//:/ } ; do
1510     ((++CDROM_SET))
1511     [[ -e ${CD_ROOT}/${f} ]] && break
1512     done
1513     export CDROM_MATCH=${f}
1514 vapier 1.75 return
1515     fi
1516    
1517 vapier 1.215 # User didn't help us out so lets make sure they know they can
1518     # simplify the whole process ...
1519 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1520 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1521 vapier 1.75 echo
1522     einfo "If you do not have the CD, but have the data files"
1523     einfo "mounted somewhere on your filesystem, just export"
1524     einfo "the variable CD_ROOT so that it points to the"
1525     einfo "directory containing the files."
1526     echo
1527 vapier 1.132 einfo "For example:"
1528     einfo "export CD_ROOT=/mnt/cdrom"
1529     echo
1530 vapier 1.75 else
1531 vapier 1.243 if [[ -n ${CDROM_NAME_SET} ]] ; then
1532     # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1533     cdcnt=0
1534     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1535     ((++cdcnt))
1536     export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1537     done
1538     fi
1539    
1540 vapier 1.75 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1541     cdcnt=0
1542 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1543 vapier 1.214 ((++cdcnt))
1544 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1545 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1546 vapier 1.75 done
1547     echo
1548     einfo "If you do not have the CDs, but have the data files"
1549     einfo "mounted somewhere on your filesystem, just export"
1550     einfo "the following variables so they point to the right place:"
1551     einfon ""
1552     cdcnt=0
1553 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1554 vapier 1.214 ((++cdcnt))
1555 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1556     done
1557     echo
1558     einfo "Or, if you have all the files in the same place, or"
1559     einfo "you only have one cdrom, you can export CD_ROOT"
1560     einfo "and that place will be used as the same data source"
1561     einfo "for all the CDs."
1562     echo
1563 vapier 1.132 einfo "For example:"
1564     einfo "export CD_ROOT_1=/mnt/cdrom"
1565     echo
1566 vapier 1.75 fi
1567 vapier 1.215
1568 vapier 1.214 export CDROM_SET=""
1569 vapier 1.75 export CDROM_CURRENT_CD=0
1570     cdrom_load_next_cd
1571     }
1572    
1573 vapier 1.283 # @FUNCTION: cdrom_load_next_cd
1574     # @DESCRIPTION:
1575     # Some packages are so big they come on multiple CDs. When you're done reading
1576     # files off a CD and want access to the next one, just call this function.
1577     # Again, all the messy details of user interaction are taken care of for you.
1578     # Once this returns, just read the variable CDROM_ROOT for the location of the
1579     # mounted CD. Note that you can only go forward in the CD list, so make sure
1580     # you only call this function when you're done using the current CD.
1581 vapier 1.75 cdrom_load_next_cd() {
1582 vapier 1.215 local var
1583     ((++CDROM_CURRENT_CD))
1584 vapier 1.79
1585 vapier 1.75 unset CDROM_ROOT
1586 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1587     [[ -z ${!var} ]] && var="CD_ROOT"
1588 vapier 1.131 if [[ -z ${!var} ]] ; then
1589 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1590 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1591 vapier 1.75 else
1592 vapier 1.131 export CDROM_ROOT=${!var}
1593 vapier 1.75 fi
1594    
1595     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1596     }
1597    
1598     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1599     # functions. this should *never* be called from an ebuild.
1600     # all it does is try to locate a give file on a cd ... if the cd isn't
1601     # found, then a message asking for the user to insert the cdrom will be
1602     # displayed and we'll hang out here until:
1603     # (1) the file is found on a mounted cdrom
1604     # (2) the user hits CTRL+C
1605 vapier 1.215 _cdrom_locate_file_on_cd() {
1606 vapier 1.214 local mline=""
1607 wolf31o2 1.296 local showedmsg=0 showjolietmsg=0
1608 vapier 1.214
1609 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1610 vapier 1.214 local i=0
1611     local -a cdset=(${*//:/ })
1612     if [[ -n ${CDROM_SET} ]] ; then
1613     cdset=(${cdset[${CDROM_SET}]})
1614     fi
1615    
1616     while [[ -n ${cdset[${i}]} ]] ; do
1617     local dir=$(dirname ${cdset[${i}]})
1618     local file=$(basename ${cdset[${i}]})
1619    
1620 uberlord 1.259 local point= node= fs= foo=
1621     while read point node fs foo ; do
1622 nyhm 1.281 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1623 uberlord 1.264 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1624     && continue
1625 uberlord 1.259 point=${point//\040/ }
1626 vapier 1.292 [[ ! -d ${point}/${dir} ]] && continue
1627 uberlord 1.259 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1628     export CDROM_ROOT=${point}
1629     export CDROM_SET=${i}
1630     export CDROM_MATCH=${cdset[${i}]}
1631     return
1632 kanaka 1.262 done <<< "$(get_mounts)"
1633 vapier 1.214
1634     ((++i))
1635 vapier 1.75 done
1636    
1637 vapier 1.214 echo
1638     if [[ ${showedmsg} -eq 0 ]] ; then
1639     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1640     if [[ -z ${CDROM_NAME} ]] ; then
1641     einfo "Please insert+mount the cdrom for ${PN} now !"
1642     else
1643     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1644     fi
1645     else
1646     if [[ -z ${CDROM_NAME_1} ]] ; then
1647     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1648 vapier 1.75 else
1649 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1650     einfo "Please insert+mount the ${!var} cdrom now !"
1651 vapier 1.75 fi
1652     fi
1653 vapier 1.214 showedmsg=1
1654 vapier 1.75 fi
1655 vapier 1.214 einfo "Press return to scan for the cd again"
1656     einfo "or hit CTRL+C to abort the emerge."
1657     echo
1658 wolf31o2 1.296 if [[ ${showjolietmsg} -eq 0 ]] ; then
1659     showjolietmsg=1
1660     else
1661     ewarn "If you are having trouble with the detection"
1662     ewarn "of your CD, it is possible that you do not have"
1663     ewarn "Joliet support enabled in your kernel. Please"
1664     ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1665     ebeep 5
1666     fi
1667 vapier 1.222 read || die "something is screwed with your system"
1668 vapier 1.75 done
1669     }
1670 vapier 1.92
1671 vapier 1.287 # @FUNCTION: strip-linguas
1672     # @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1673     # @DESCRIPTION:
1674 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1675 vapier 1.287 # a package can support. The first form allows you to
1676     # specify a list of LINGUAS. The -i builds a list of po
1677     # files found in all the directories and uses the
1678     # intersection of the lists. The -u builds a list of po
1679     # files found in all the directories and uses the union
1680     # of the lists.
1681 vapier 1.92 strip-linguas() {
1682 vapier 1.242 local ls newls nols
1683 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1684     local op=$1; shift
1685 vapier 1.315 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1686 vapier 1.92 local d f
1687     for d in "$@" ; do
1688 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1689     newls=${ls}
1690 vapier 1.92 else
1691     newls=""
1692     fi
1693 vapier 1.315 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1694 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1695 vapier 1.236 hasq ${f} ${ls} && newls="${newls} ${f}"
1696 vapier 1.92 else
1697 vapier 1.236 hasq ${f} ${ls} || newls="${newls} ${f}"
1698 vapier 1.92 fi
1699     done
1700 vapier 1.154 ls=${newls}
1701 vapier 1.92 done
1702     else
1703 vapier 1.236 ls="$@"
1704 vapier 1.92 fi
1705    
1706 vapier 1.242 nols=""
1707 vapier 1.92 newls=""
1708     for f in ${LINGUAS} ; do
1709 vapier 1.236 if hasq ${f} ${ls} ; then
1710 vapier 1.120 newls="${newls} ${f}"
1711 vapier 1.92 else
1712 vapier 1.242 nols="${nols} ${f}"
1713 vapier 1.92 fi
1714     done
1715 vapier 1.244 [[ -n ${nols} ]] \
1716 vapier 1.316 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1717 vapier 1.237 export LINGUAS=${newls:1}
1718 vapier 1.92 }
1719 iggy 1.110
1720 vapier 1.283 # @FUNCTION: preserve_old_lib
1721     # @USAGE: <libs to preserve> [more libs]
1722     # @DESCRIPTION:
1723     # These functions are useful when a lib in your package changes ABI SONAME.
1724     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1725 eradicator 1.111 # would break packages that link against it. Most people get around this
1726     # by using the portage SLOT mechanism, but that is not always a relevant
1727 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1728     # preserve_old_lib_notify function.
1729 eradicator 1.111 preserve_old_lib() {
1730 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1731 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1732 vapier 1.276 die "Invalid preserve_old_lib() usage"
1733 vapier 1.267 fi
1734     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1735    
1736 vapier 1.297 # let portage worry about it
1737     has preserve-libs ${FEATURES} && return 0
1738    
1739 vapier 1.267 local lib dir
1740     for lib in "$@" ; do
1741     [[ -e ${ROOT}/${lib} ]] || continue
1742     dir=${lib%/*}
1743     dodir ${dir} || die "dodir ${dir} failed"
1744     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1745     touch "${D}"/${lib}
1746     done
1747 eradicator 1.111 }
1748    
1749 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1750     # @USAGE: <libs to notify> [more libs]
1751     # @DESCRIPTION:
1752     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1753 eradicator 1.111 preserve_old_lib_notify() {
1754 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1755 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1756 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1757 vapier 1.267 fi
1758    
1759 vapier 1.297 # let portage worry about it
1760     has preserve-libs ${FEATURES} && return 0
1761    
1762 vapier 1.267 local lib notice=0
1763     for lib in "$@" ; do
1764     [[ -e ${ROOT}/${lib} ]] || continue
1765     if [[ ${notice} -eq 0 ]] ; then
1766     notice=1
1767     ewarn "Old versions of installed libraries were detected on your system."
1768     ewarn "In order to avoid breaking packages that depend on these old libs,"
1769     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1770     ewarn "in order to remove these old dependencies. If you do not have this"
1771     ewarn "helper program, simply emerge the 'gentoolkit' package."
1772     ewarn
1773     fi
1774     ewarn " # revdep-rebuild --library ${lib##*/}"
1775     done
1776 vapier 1.291 if [[ ${notice} -eq 1 ]] ; then
1777     ewarn
1778     ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1779 vapier 1.300 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1780     for lib in "$@" ; do
1781     ewarn " # rm '${lib}'"
1782     done
1783 vapier 1.291 fi
1784 eradicator 1.111 }
1785 vapier 1.125
1786 vapier 1.283 # @FUNCTION: built_with_use
1787     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1788     # @DESCRIPTION:
1789 betelgeuse 1.329 #
1790     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1791     #
1792 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1793     # flags being enabled in packages. This will check to see if the specified
1794     # DEPEND atom was built with the specified list of USE flags. The
1795     # --missing option controls the behavior if called on a package that does
1796     # not actually support the defined USE flags (aka listed in IUSE).
1797     # The default is to abort (call die). The -a and -o flags control
1798     # the requirements of the USE flags. They correspond to "and" and "or"
1799     # logic. So the -a flag means all listed USE flags must be enabled
1800 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1801 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1802     # means the USE flag we're checking is hidden expanded, so it won't be found
1803     # in IUSE like normal USE flags.
1804 swegener 1.286 #
1805 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1806     # flags matter.
1807 vapier 1.125 built_with_use() {
1808 vapier 1.275 local hidden="no"
1809     if [[ $1 == "--hidden" ]] ; then
1810     hidden="yes"
1811     shift
1812     fi
1813    
1814 vapier 1.269 local missing_action="die"
1815     if [[ $1 == "--missing" ]] ; then
1816     missing_action=$2
1817     shift ; shift
1818     case ${missing_action} in
1819     true|false|die) ;;
1820     *) die "unknown action '${missing_action}'";;
1821     esac
1822     fi
1823    
1824 vapier 1.130 local opt=$1
1825     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1826    
1827     local PKG=$(best_version $1)
1828 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1829 vapier 1.130 shift
1830    
1831 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1832 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1833 vapier 1.213
1834 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1835     # this gracefully
1836 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1837 cardoe 1.273 case ${missing_action} in
1838     true) return 0;;
1839     false) return 1;;
1840     die) die "Unable to determine what USE flags $PKG was built with";;
1841     esac
1842     fi
1843    
1844 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1845 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1846 vapier 1.275 # Don't check USE_EXPAND #147237
1847     local expand
1848     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1849     if [[ $1 == ${expand}_* ]] ; then
1850     expand=""
1851     break
1852     fi
1853     done
1854     if [[ -n ${expand} ]] ; then
1855 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1856 vapier 1.275 case ${missing_action} in
1857     true) return 0;;
1858     false) return 1;;
1859     die) die "$PKG does not actually support the $1 USE flag!";;
1860     esac
1861     fi
1862 vapier 1.269 fi
1863 vapier 1.250 fi
1864 vapier 1.249
1865 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1866 vapier 1.130 while [[ $# -gt 0 ]] ; do
1867     if [[ ${opt} = "-o" ]] ; then
1868     has $1 ${USE_BUILT} && return 0
1869     else
1870     has $1 ${USE_BUILT} || return 1
1871     fi
1872 vapier 1.125 shift
1873     done
1874 vapier 1.130 [[ ${opt} = "-a" ]]
1875 vapier 1.125 }
1876 vapier 1.126
1877 vapier 1.289 # @FUNCTION: epunt_cxx
1878 vapier 1.283 # @USAGE: [dir to scan]
1879     # @DESCRIPTION:
1880     # Many configure scripts wrongly bail when a C++ compiler could not be
1881     # detected. If dir is not specified, then it defaults to ${S}.
1882     #
1883     # http://bugs.gentoo.org/73450
1884 vapier 1.126 epunt_cxx() {
1885 vapier 1.127 local dir=$1
1886     [[ -z ${dir} ]] && dir=${S}
1887     ebegin "Removing useless C++ checks"
1888     local f
1889 vapier 1.294 find "${dir}" -name configure | while read f ; do
1890     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1891 vapier 1.127 done
1892     eend 0
1893 vapier 1.126 }
1894 ka0ttic 1.143
1895 vapier 1.283 # @FUNCTION: make_wrapper
1896 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1897 vapier 1.283 # @DESCRIPTION:
1898     # Create a shell wrapper script named wrapper in installpath
1899     # (defaults to the bindir) to execute target (default of wrapper) by
1900     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1901     # libpaths followed by optionally changing directory to chdir.
1902 wolf31o2 1.160 make_wrapper() {
1903 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1904 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1905 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1906     # things as $bin ... "./someprog --args"
1907 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1908     #!/bin/sh
1909 vapier 1.201 cd "${chdir:-.}"
1910 vapier 1.210 if [ -n "${libdir}" ] ; then
1911     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1912     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1913     else
1914     export LD_LIBRARY_PATH="${libdir}"
1915     fi
1916 vapier 1.201 fi
1917 vapier 1.202 exec ${bin} "\$@"
1918 wolf31o2 1.160 EOF
1919     chmod go+rx "${tmpwrapper}"
1920 vapier 1.201 if [[ -n ${path} ]] ; then
1921 vapier 1.283 (
1922 vapier 1.201 exeinto "${path}"
1923 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1924 vapier 1.283 ) || die
1925 wolf31o2 1.164 else
1926 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1927 wolf31o2 1.164 fi
1928 wolf31o2 1.160 }
1929 mr_bones_ 1.311
1930     # @FUNCTION: prepalldocs
1931     # @USAGE:
1932     # @DESCRIPTION:
1933     # Compress files in /usr/share/doc which are not already
1934     # compressed, excluding /usr/share/doc/${PF}/html.
1935     # Uses the ecompressdir to do the compression.
1936 betelgeuse 1.313 # 2009-02-18 by betelgeuse:
1937     # Commented because ecompressdir is even more internal to
1938     # Portage than prepalldocs (it's not even mentioned in man 5
1939     # ebuild). Please submit a better version for review to gentoo-dev
1940     # if you want prepalldocs here.
1941     #prepalldocs() {
1942     # if [[ -n $1 ]] ; then
1943     # ewarn "prepalldocs: invalid usage; takes no arguments"
1944     # fi
1945    
1946     # cd "${D}"
1947     # [[ -d usr/share/doc ]] || return 0
1948    
1949     # find usr/share/doc -exec gzip {} +
1950     # ecompressdir --ignore /usr/share/doc/${PF}/html
1951     # ecompressdir --queue /usr/share/doc
1952     #}

  ViewVC Help
Powered by ViewVC 1.1.20