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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.348 - (hide annotations) (download)
Sun Jul 11 17:29:10 2010 UTC (4 years, 5 months ago) by betelgeuse
Branch: MAIN
Changes since 1.347: +12 -1 lines
Add eqawarn

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

  ViewVC Help
Powered by ViewVC 1.1.20