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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.354 - (hide annotations) (download)
Fri Feb 25 21:58:19 2011 UTC (3 years, 6 months ago) by ulm
Branch: MAIN
Changes since 1.353: +4 -28 lines
Remove dead and commented prepalldocs function.

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

  ViewVC Help
Powered by ViewVC 1.1.20