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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.352 - (hide annotations) (download)
Mon Nov 22 00:31:03 2010 UTC (3 years, 7 months ago) by vapier
Branch: MAIN
Changes since 1.351: +2 -2 lines
preserve_old_lib_notify: keep full path to lib in revdep-rebuild example output to help with multilib setups #339134 by Bernardo Costa

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

  ViewVC Help
Powered by ViewVC 1.1.20