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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.382 - (hide annotations) (download)
Tue Feb 14 16:08:54 2012 UTC (2 years, 7 months ago) by vapier
Branch: MAIN
Changes since 1.381: +2 -1 lines
eumask_pop: error out if someone tries to pass args to us

1 ulm 1.378 # Copyright 1999-2012 Gentoo Foundation
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.382 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.381 2012/02/14 16:01:21 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 vapier 1.371 if [[ ${___ECLASS_ONCE_EUTILS} != "recur -_+^+_- spank" ]] ; then
19     ___ECLASS_ONCE_EUTILS="recur -_+^+_- spank"
20    
21 ulm 1.380 inherit multilib portability user
22 azarah 1.1
23 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
24 azarah 1.1
25 betelgeuse 1.329 if has "${EAPI:-0}" 0 1 2; then
26    
27 vapier 1.283 # @FUNCTION: epause
28     # @USAGE: [seconds]
29     # @DESCRIPTION:
30     # Sleep for the specified number of seconds (default of 5 seconds). Useful when
31     # printing a message the user should probably be reading and often used in
32     # conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set,
33 betelgeuse 1.329 # don't wait at all. Defined in EAPIs 0 1 and 2.
34 ciaranm 1.98 epause() {
35 vapier 1.245 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
36 ciaranm 1.98 }
37    
38 vapier 1.283 # @FUNCTION: ebeep
39     # @USAGE: [number of beeps]
40     # @DESCRIPTION:
41     # Issue the specified number of beeps (default of 5 beeps). Useful when
42     # printing a message the user should probably be reading and often used in
43     # conjunction with the epause function. If the EBEEP_IGNORE env var is set,
44 betelgeuse 1.329 # don't beep at all. Defined in EAPIs 0 1 and 2.
45 ciaranm 1.98 ebeep() {
46     local n
47 vapier 1.245 if [[ -z ${EBEEP_IGNORE} ]] ; then
48 ciaranm 1.98 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
49     echo -ne "\a"
50     sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
51     echo -ne "\a"
52     sleep 1
53     done
54     fi
55     }
56    
57 reavertm 1.331 else
58    
59 reavertm 1.332 ebeep() {
60 reavertm 1.337 ewarn "QA Notice: ebeep is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
61 reavertm 1.332 }
62 reavertm 1.331
63 reavertm 1.332 epause() {
64 reavertm 1.337 ewarn "QA Notice: epause is not defined in EAPI=${EAPI}, please file a bug at http://bugs.gentoo.org"
65 reavertm 1.332 }
66 reavertm 1.331
67 betelgeuse 1.329 fi
68    
69 betelgeuse 1.348 # @FUNCTION: eqawarn
70     # @USAGE: [message]
71     # @DESCRIPTION:
72 mgorny 1.363 # Proxy to ewarn for package managers that don't provide eqawarn and use the PM
73     # implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev
74     # profile.
75 betelgeuse 1.348 if ! declare -F eqawarn >/dev/null ; then
76     eqawarn() {
77 mgorny 1.363 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@"
78 ferringb 1.370 :
79 betelgeuse 1.348 }
80     fi
81    
82 hollow 1.298 # @FUNCTION: ecvs_clean
83 vapier 1.299 # @USAGE: [list of dirs]
84 hollow 1.298 # @DESCRIPTION:
85 vapier 1.299 # Remove CVS directories recursiveley. Useful when a source tarball contains
86     # internal CVS directories. Defaults to $PWD.
87 hollow 1.298 ecvs_clean() {
88 vapier 1.299 [[ -z $* ]] && set -- .
89 hollow 1.298 find "$@" -type d -name 'CVS' -prune -print0 | xargs -0 rm -rf
90     find "$@" -type f -name '.cvs*' -print0 | xargs -0 rm -rf
91     }
92    
93     # @FUNCTION: esvn_clean
94 vapier 1.299 # @USAGE: [list of dirs]
95 hollow 1.298 # @DESCRIPTION:
96 vapier 1.299 # Remove .svn directories recursiveley. Useful when a source tarball contains
97     # internal Subversion directories. Defaults to $PWD.
98 hollow 1.298 esvn_clean() {
99 vapier 1.299 [[ -z $* ]] && set -- .
100 hollow 1.298 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
101     }
102    
103 vapier 1.373 # @FUNCTION: estack_push
104     # @USAGE: <stack> [items to push]
105     # @DESCRIPTION:
106     # Push any number of items onto the specified stack. Pick a name that
107     # is a valid variable (i.e. stick to alphanumerics), and push as many
108     # items as you like onto the stack at once.
109     #
110     # The following code snippet will echo 5, then 4, then 3, then ...
111     # @CODE
112     # estack_push mystack 1 2 3 4 5
113     # while estack_pop mystack i ; do
114     # echo "${i}"
115     # done
116     # @CODE
117     estack_push() {
118     [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments"
119     local stack_name="__ESTACK_$1__" ; shift
120     eval ${stack_name}+=\( \"\$@\" \)
121     }
122    
123     # @FUNCTION: estack_pop
124     # @USAGE: <stack> [variable]
125     # @DESCRIPTION:
126     # Pop a single item off the specified stack. If a variable is specified,
127     # the popped item is stored there. If no more items are available, return
128     # 1, else return 0. See estack_push for more info.
129     estack_pop() {
130     [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments"
131    
132     # We use the fugly __estack_xxx var names to avoid collision with
133     # passing back the return value. If we used "local i" and the
134     # caller ran `estack_pop ... i`, we'd end up setting the local
135     # copy of "i" rather than the caller's copy. The __estack_xxx
136     # garbage is preferable to using $1/$2 everywhere as that is a
137     # bit harder to read.
138     local __estack_name="__ESTACK_$1__" ; shift
139     local __estack_retvar=$1 ; shift
140 vapier 1.376 eval local __estack_i=\${#${__estack_name}\[@\]}
141 vapier 1.373 # Don't warn -- let the caller interpret this as a failure
142     # or as normal behavior (akin to `shift`)
143     [[ $(( --__estack_i )) -eq -1 ]] && return 1
144    
145     if [[ -n ${__estack_retvar} ]] ; then
146 vapier 1.376 eval ${__estack_retvar}=\"\${${__estack_name}\[${__estack_i}\]}\"
147 vapier 1.373 fi
148 vapier 1.376 eval unset ${__estack_name}\[${__estack_i}\]
149 vapier 1.373 }
150    
151 vapier 1.322 # @FUNCTION: eshopts_push
152 vapier 1.330 # @USAGE: [options to `set` or `shopt`]
153 vapier 1.322 # @DESCRIPTION:
154     # Often times code will want to enable a shell option to change code behavior.
155     # Since changing shell options can easily break other pieces of code (which
156     # assume the default state), eshopts_push is used to (1) push the current shell
157     # options onto a stack and (2) pass the specified arguments to set.
158     #
159 vapier 1.330 # If the first argument is '-s' or '-u', we assume you want to call `shopt`
160     # rather than `set` as there are some options only available via that.
161     #
162 vapier 1.322 # A common example is to disable shell globbing so that special meaning/care
163     # may be used with variables/arguments to custom functions. That would be:
164     # @CODE
165 vapier 1.376 # eshopts_push -s noglob
166 vapier 1.322 # for x in ${foo} ; do
167     # if ...some check... ; then
168     # eshopts_pop
169     # return 0
170     # fi
171     # done
172     # eshopts_pop
173     # @CODE
174     eshopts_push() {
175 vapier 1.330 if [[ $1 == -[su] ]] ; then
176 vapier 1.376 estack_push eshopts "$(shopt -p)"
177 vapier 1.330 [[ $# -eq 0 ]] && return 0
178 vapier 1.375 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"
179 vapier 1.330 else
180 vapier 1.376 estack_push eshopts $-
181 vapier 1.330 [[ $# -eq 0 ]] && return 0
182 vapier 1.375 set "$@" || die "${FUNCNAME}: bad options to set: $*"
183 vapier 1.330 fi
184 vapier 1.322 }
185    
186     # @FUNCTION: eshopts_pop
187     # @USAGE:
188     # @DESCRIPTION:
189     # Restore the shell options to the state saved with the corresponding
190     # eshopts_push call. See that function for more details.
191     eshopts_pop() {
192 vapier 1.376 local s
193     estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"
194 vapier 1.330 if [[ ${s} == "shopt -"* ]] ; then
195 vapier 1.375 eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}"
196 vapier 1.330 else
197 vapier 1.375 set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-"
198     set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell settings: ${s}"
199 vapier 1.330 fi
200 vapier 1.322 }
201    
202 vapier 1.373 # @FUNCTION: eumask_push
203     # @USAGE: <new umask>
204     # @DESCRIPTION:
205     # Set the umask to the new value specified while saving the previous
206     # value onto a stack. Useful for temporarily changing the umask.
207     eumask_push() {
208     estack_push eumask "$(umask)"
209     umask "$@" || die "${FUNCNAME}: bad options to umask: $*"
210     }
211    
212     # @FUNCTION: eumask_pop
213     # @USAGE:
214     # @DESCRIPTION:
215     # Restore the previous umask state.
216     eumask_pop() {
217 vapier 1.382 [[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options"
218 vapier 1.373 local s
219     estack_pop eumask s || die "${FUNCNAME}: unbalanced push"
220     umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
221     }
222    
223 vapier 1.325 # @VARIABLE: EPATCH_SOURCE
224     # @DESCRIPTION:
225     # Default directory to search for patches.
226 azarah 1.2 EPATCH_SOURCE="${WORKDIR}/patch"
227 vapier 1.325 # @VARIABLE: EPATCH_SUFFIX
228     # @DESCRIPTION:
229     # Default extension for patches (do not prefix the period yourself).
230 azarah 1.2 EPATCH_SUFFIX="patch.bz2"
231 vapier 1.325 # @VARIABLE: EPATCH_OPTS
232     # @DESCRIPTION:
233     # Default options for patch:
234     # @CODE
235     # -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
236     # --no-backup-if-mismatch - do not leave .orig files behind
237     # -E - automatically remove empty files
238     # @CODE
239 vapier 1.230 EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
240 vapier 1.325 # @VARIABLE: EPATCH_EXCLUDE
241     # @DESCRIPTION:
242 mr_bones_ 1.308 # List of patches not to apply. Note this is only file names,
243 vapier 1.325 # and not the full path. Globs accepted.
244 azarah 1.6 EPATCH_EXCLUDE=""
245 vapier 1.325 # @VARIABLE: EPATCH_SINGLE_MSG
246     # @DESCRIPTION:
247 azarah 1.9 # Change the printed message for a single patch.
248     EPATCH_SINGLE_MSG=""
249 vapier 1.325 # @VARIABLE: EPATCH_MULTI_MSG
250     # @DESCRIPTION:
251 vapier 1.173 # Change the printed message for multiple patches.
252     EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
253 vapier 1.325 # @VARIABLE: EPATCH_FORCE
254     # @DESCRIPTION:
255     # Only require patches to match EPATCH_SUFFIX rather than the extended
256     # arch naming style.
257 azarah 1.29 EPATCH_FORCE="no"
258 azarah 1.2
259 vapier 1.325 # @FUNCTION: epatch
260     # @USAGE: [patches] [dirs of patches]
261     # @DESCRIPTION:
262     # epatch is designed to greatly simplify the application of patches. It can
263     # process patch files directly, or directories of patches. The patches may be
264     # compressed (bzip/gzip/etc...) or plain text. You generally need not specify
265     # the -p option as epatch will automatically attempt -p0 to -p5 until things
266     # apply successfully.
267 azarah 1.2 #
268 vapier 1.325 # If you do not specify any options, then epatch will default to the directory
269     # specified by EPATCH_SOURCE.
270 azarah 1.2 #
271 vapier 1.325 # When processing directories, epatch will apply all patches that match:
272     # @CODE
273 vapier 1.350 # if ${EPATCH_FORCE} != "yes"
274 vapier 1.325 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
275     # else
276     # *.${EPATCH_SUFFIX}
277     # @CODE
278     # The leading ?? are typically numbers used to force consistent patch ordering.
279     # The arch field is used to apply patches only for the host architecture with
280     # the special value of "all" means apply for everyone. Note that using values
281     # other than "all" is highly discouraged -- you should apply patches all the
282     # time and let architecture details be detected at configure/compile time.
283 azarah 1.2 #
284 vapier 1.325 # If EPATCH_SUFFIX is empty, then no period before it is implied when searching
285     # for patches to apply.
286 azarah 1.2 #
287 vapier 1.325 # Refer to the other EPATCH_xxx variables for more customization of behavior.
288 azarah 1.2 epatch() {
289 swegener 1.231 _epatch_draw_line() {
290 vapier 1.325 # create a line of same length as input string
291 agriffis 1.229 [[ -z $1 ]] && set "$(printf "%65s" '')"
292     echo "${1//?/=}"
293 vapier 1.219 }
294 azarah 1.3
295 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
296    
297 vapier 1.325 # Let the rest of the code process one user arg at a time --
298     # each arg may expand into multiple patches, and each arg may
299     # need to start off with the default global EPATCH_xxx values
300     if [[ $# -gt 1 ]] ; then
301     local m
302 vapier 1.94 for m in "$@" ; do
303     epatch "${m}"
304     done
305     return 0
306 azarah 1.3 fi
307    
308 vapier 1.325 local SINGLE_PATCH="no"
309     # no args means process ${EPATCH_SOURCE}
310     [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"
311    
312     if [[ -f $1 ]] ; then
313 azarah 1.3 SINGLE_PATCH="yes"
314 vapier 1.325 set -- "$1"
315     # Use the suffix from the single patch (localize it); the code
316     # below will find the suffix for us
317     local EPATCH_SUFFIX=$1
318    
319     elif [[ -d $1 ]] ; then
320     # Some people like to make dirs of patches w/out suffixes (vim)
321     set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
322 danarmak 1.32
323 vapier 1.359 elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
324     # Re-use EPATCH_SOURCE as a search dir
325     epatch "${EPATCH_SOURCE}/$1"
326     return $?
327    
328 azarah 1.3 else
329 vapier 1.325 # sanity check ... if it isn't a dir or file, wtf man ?
330     [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
331     echo
332     eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
333     eerror
334     eerror " ${EPATCH_SOURCE}"
335     eerror " ( ${EPATCH_SOURCE##*/} )"
336     echo
337     die "Cannot find \$EPATCH_SOURCE!"
338 azarah 1.3 fi
339 azarah 1.2
340 vapier 1.325 local PIPE_CMD
341 azarah 1.2 case ${EPATCH_SUFFIX##*\.} in
342 vapier 1.325 xz) PIPE_CMD="xz -dc" ;;
343     lzma) PIPE_CMD="lzma -dc" ;;
344     bz2) PIPE_CMD="bzip2 -dc" ;;
345     gz|Z|z) PIPE_CMD="gzip -dc" ;;
346     ZIP|zip) PIPE_CMD="unzip -p" ;;
347     *) ;;
348 azarah 1.2 esac
349    
350 vapier 1.325 [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"
351    
352     local x
353     for x in "$@" ; do
354     # If the patch dir given contains subdirs, or our EPATCH_SUFFIX
355     # didn't match anything, ignore continue on
356     [[ ! -f ${x} ]] && continue
357    
358     local patchname=${x##*/}
359    
360     # Apply single patches, or forced sets of patches, or
361     # patches with ARCH dependant names.
362 flameeyes 1.266 # ???_arch_foo.patch
363 vapier 1.325 # Else, skip this input altogether
364     local a=${patchname#*_} # strip the ???_
365     a=${a%%_*} # strip the _foo.patch
366     if ! [[ ${SINGLE_PATCH} == "yes" || \
367 ulm 1.354 ${EPATCH_FORCE} == "yes" || \
368     ${a} == all || \
369     ${a} == ${ARCH} ]]
370 azarah 1.2 then
371 vapier 1.325 continue
372     fi
373 azarah 1.6
374 vapier 1.325 # Let people filter things dynamically
375     if [[ -n ${EPATCH_EXCLUDE} ]] ; then
376     # let people use globs in the exclude
377     eshopts_push -o noglob
378    
379 scarabeus 1.328 local ex
380 vapier 1.325 for ex in ${EPATCH_EXCLUDE} ; do
381 scarabeus 1.328 if [[ ${patchname} == ${ex} ]] ; then
382     eshopts_pop
383     continue 2
384     fi
385 vapier 1.325 done
386 vapier 1.326
387 vapier 1.325 eshopts_pop
388     fi
389 danarmak 1.32
390 vapier 1.325 if [[ ${SINGLE_PATCH} == "yes" ]] ; then
391     if [[ -n ${EPATCH_SINGLE_MSG} ]] ; then
392     einfo "${EPATCH_SINGLE_MSG}"
393 azarah 1.3 else
394 vapier 1.325 einfo "Applying ${patchname} ..."
395 azarah 1.3 fi
396 vapier 1.325 else
397     einfo " ${patchname} ..."
398     fi
399 azarah 1.2
400 vapier 1.325 # most of the time, there will only be one run per unique name,
401     # but if there are more, make sure we get unique log filenames
402     local STDERR_TARGET="${T}/${patchname}.out"
403     if [[ -e ${STDERR_TARGET} ]] ; then
404     STDERR_TARGET="${T}/${patchname}-$$.out"
405     fi
406 azarah 1.2
407 vapier 1.369 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
408 vapier 1.304
409 vapier 1.325 # Decompress the patch if need be
410     local count=0
411     local PATCH_TARGET
412     if [[ -n ${PIPE_CMD} ]] ; then
413     PATCH_TARGET="${T}/$$.patch"
414     echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"
415 vapier 1.304
416 vapier 1.325 if ! (${PIPE_CMD} "${x}" > "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
417     echo
418     eerror "Could not extract patch!"
419     #die "Could not extract patch!"
420     count=5
421     break
422 vapier 1.305 fi
423 vapier 1.325 else
424     PATCH_TARGET=${x}
425     fi
426 vapier 1.305
427 vapier 1.325 # Check for absolute paths in patches. If sandbox is disabled,
428     # people could (accidently) patch files in the root filesystem.
429     # Or trigger other unpleasantries #237667. So disallow -p0 on
430     # such patches.
431     local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
432     if [[ -n ${abs_paths} ]] ; then
433     count=1
434     printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
435     fi
436 vapier 1.353 # Similar reason, but with relative paths.
437     local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}")
438     if [[ -n ${rel_paths} ]] ; then
439     eqawarn "QA Notice: Your patch uses relative paths '../'."
440     eqawarn " In the future this will cause a failure."
441     eqawarn "${rel_paths}"
442     fi
443 vapier 1.325
444     # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
445     while [[ ${count} -lt 5 ]] ; do
446     # Generate some useful debug info ...
447     (
448     _epatch_draw_line "***** ${patchname} *****"
449     echo
450     echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
451     echo
452     _epatch_draw_line "***** ${patchname} *****"
453 vapier 1.360 patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}" 2>&1
454     ret=$?
455     echo
456     echo "patch program exited with status ${ret}"
457     exit ${ret}
458 vapier 1.325 ) >> "${STDERR_TARGET}"
459 azarah 1.8
460 vapier 1.360 if [ $? -eq 0 ] ; then
461 vapier 1.325 (
462     _epatch_draw_line "***** ${patchname} *****"
463     echo
464     echo "ACTUALLY APPLYING ${patchname} ..."
465     echo
466     _epatch_draw_line "***** ${patchname} *****"
467     patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
468 vapier 1.360 ret=$?
469     echo
470     echo "patch program exited with status ${ret}"
471     exit ${ret}
472 vapier 1.325 ) >> "${STDERR_TARGET}"
473 danarmak 1.32
474 vapier 1.325 if [ $? -ne 0 ] ; then
475     echo
476     eerror "A dry-run of patch command succeeded, but actually"
477     eerror "applying the patch failed!"
478     #die "Real world sux compared to the dreamworld!"
479     count=5
480 azarah 1.2 fi
481 vapier 1.325 break
482 azarah 1.8 fi
483    
484 vapier 1.325 : $(( count++ ))
485     done
486 azarah 1.8
487 vapier 1.325 # if we had to decompress the patch, delete the temp one
488     if [[ -n ${PIPE_CMD} ]] ; then
489     rm -f "${PATCH_TARGET}"
490     fi
491 azarah 1.3
492 vapier 1.325 if [[ ${count} -ge 5 ]] ; then
493     echo
494     eerror "Failed Patch: ${patchname} !"
495     eerror " ( ${PATCH_TARGET} )"
496     eerror
497     eerror "Include in your bugreport the contents of:"
498     eerror
499     eerror " ${STDERR_TARGET}"
500     echo
501     die "Failed Patch: ${patchname}!"
502 azarah 1.2 fi
503 vapier 1.325
504     # if everything worked, delete the patch log
505     rm -f "${STDERR_TARGET}"
506     eend 0
507 azarah 1.2 done
508 vapier 1.325
509     [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
510     : # everything worked
511 azarah 1.26 }
512 vapier 1.361
513     # @FUNCTION: epatch_user
514     # @USAGE:
515     # @DESCRIPTION:
516     # Applies user-provided patches to the source tree. The patches are
517     # taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first
518     # of these three directories to exist will be the one to use, ignoring
519     # any more general directories which might exist as well.
520     #
521     # User patches are intended for quick testing of patches without ebuild
522     # modifications, as well as for permanent customizations a user might
523     # desire. Obviously, there can be no official support for arbitrarily
524     # patched ebuilds. So whenever a build log in a bug report mentions that
525     # user patches were applied, the user should be asked to reproduce the
526     # problem without these.
527     #
528     # Not all ebuilds do call this function, so placing patches in the
529     # stated directory might or might not work, depending on the package and
530     # the eclasses it inherits and uses. It is safe to call the function
531     # repeatedly, so it is always possible to add a call at the ebuild
532     # level. The first call is the time when the patches will be
533     # applied.
534     #
535     # Ideally, this function should be called after gentoo-specific patches
536     # have been applied, so that their code can be modified as well, but
537     # before calls to e.g. eautoreconf, as the user patches might affect
538     # autotool input files as well.
539 vapier 1.318 epatch_user() {
540     [[ $# -ne 0 ]] && die "epatch_user takes no options"
541    
542 vapier 1.361 # Allow multiple calls to this function; ignore all but the first
543 vapier 1.362 local applied="${T}/epatch_user.applied"
544 vapier 1.361 [[ -e ${applied} ]] && return 2
545    
546 vapier 1.318 # don't clobber any EPATCH vars that the parent might want
547 zmedico 1.323 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
548 ulm 1.378 for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}; do
549 vapier 1.318 EPATCH_SOURCE=${base}/${CTARGET}/${check}
550     [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
551     [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
552     if [[ -d ${EPATCH_SOURCE} ]] ; then
553     EPATCH_SOURCE=${EPATCH_SOURCE} \
554     EPATCH_SUFFIX="patch" \
555     EPATCH_FORCE="yes" \
556     EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
557     epatch
558 vapier 1.361 echo "${EPATCH_SOURCE}" > "${applied}"
559 vapier 1.349 return 0
560 vapier 1.318 fi
561     done
562 vapier 1.361 echo "none" > "${applied}"
563 vapier 1.349 return 1
564 vapier 1.318 }
565 azarah 1.26
566 vapier 1.283 # @FUNCTION: emktemp
567     # @USAGE: [temp dir]
568     # @DESCRIPTION:
569 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
570 vapier 1.283 # does not exist on the users system.
571 vapier 1.117 emktemp() {
572 vapier 1.119 local exe="touch"
573 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
574     local topdir=$1
575 mr_bones_ 1.100
576 vapier 1.194 if [[ -z ${topdir} ]] ; then
577     [[ -z ${T} ]] \
578 vapier 1.117 && topdir="/tmp" \
579 vapier 1.194 || topdir=${T}
580 vapier 1.117 fi
581    
582 vapier 1.280 if ! type -P mktemp > /dev/null ; then
583     # system lacks `mktemp` so we have to fake it
584 vapier 1.117 local tmp=/
585 vapier 1.194 while [[ -e ${tmp} ]] ; do
586     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
587 vapier 1.117 done
588 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
589 vapier 1.117 echo "${tmp}"
590 vapier 1.52 else
591 vapier 1.280 # the args here will give slightly wierd names on BSD,
592     # but should produce a usable file on all userlands
593 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
594 vapier 1.280 TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX
595 flameeyes 1.223 else
596 vapier 1.280 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
597 flameeyes 1.223 fi
598 vapier 1.52 fi
599     }
600    
601 vapier 1.283 # @FUNCTION: edos2unix
602     # @USAGE: <file> [more files ...]
603     # @DESCRIPTION:
604     # A handy replacement for dos2unix, recode, fixdos, etc... This allows you
605     # to remove all of these text utilities from DEPEND variables because this
606     # is a script based solution. Just give it a list of files to convert and
607     # they will all be changed from the DOS CRLF format to the UNIX LF format.
608 vapier 1.24 edos2unix() {
609 vapier 1.366 [[ $# -eq 0 ]] && return 0
610     sed -i 's/\r$//' -- "$@" || die
611 vapier 1.39 }
612    
613 jlec 1.377 # @FUNCTION: make_desktop_entry
614     # @USAGE: make_desktop_entry(<command>, [name], [icon], [type], [fields])
615     # @DESCRIPTION:
616     # Make a .desktop file.
617     #
618     # @CODE
619     # binary: what command does the app run with ?
620     # name: the name that will show up in the menu
621     # icon: give your little like a pretty little icon ...
622     # this can be relative (to /usr/share/pixmaps) or
623     # a full path to an icon
624     # type: what kind of application is this?
625     # for categories:
626     # http://standards.freedesktop.org/menu-spec/latest/apa.html
627     # if unset, function tries to guess from package's category
628 vapier 1.341 # fields: extra fields to append to the desktop file; a printf string
629 jlec 1.377 # @CODE
630 vapier 1.39 make_desktop_entry() {
631 vapier 1.341 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
632 vapier 1.39
633 vapier 1.158 local exec=${1}
634     local name=${2:-${PN}}
635 wolf31o2 1.293 local icon=${3:-${PN}}
636 vapier 1.158 local type=${4}
637 vapier 1.341 local fields=${5}
638 vapier 1.158
639     if [[ -z ${type} ]] ; then
640     local catmaj=${CATEGORY%%-*}
641     local catmin=${CATEGORY##*-}
642     case ${catmaj} in
643     app)
644     case ${catmin} in
645 vapier 1.284 accessibility) type=Accessibility;;
646 vapier 1.338 admin) type=System;;
647     antivirus) type=System;;
648     arch) type=Archiving;;
649     backup) type=Archiving;;
650     cdr) type=DiscBurning;;
651     dicts) type=Dictionary;;
652     doc) type=Documentation;;
653     editors) type=TextEditor;;
654     emacs) type=TextEditor;;
655     emulation) type=Emulator;;
656     laptop) type=HardwareSettings;;
657     office) type=Office;;
658     pda) type=PDA;;
659     vim) type=TextEditor;;
660     xemacs) type=TextEditor;;
661 vapier 1.158 esac
662 azarah 1.59 ;;
663 vapier 1.158
664     dev)
665 vapier 1.159 type="Development"
666 vapier 1.158 ;;
667    
668     games)
669     case ${catmin} in
670 wolf31o2 1.265 action|fps) type=ActionGame;;
671 vapier 1.338 arcade) type=ArcadeGame;;
672     board) type=BoardGame;;
673     emulation) type=Emulator;;
674     kids) type=KidsGame;;
675     puzzle) type=LogicGame;;
676     roguelike) type=RolePlaying;;
677     rpg) type=RolePlaying;;
678 vapier 1.158 simulation) type=Simulation;;
679 vapier 1.338 sports) type=SportsGame;;
680     strategy) type=StrategyGame;;
681 vapier 1.158 esac
682 vapier 1.159 type="Game;${type}"
683 vapier 1.158 ;;
684    
685 vapier 1.284 gnome)
686     type="Gnome;GTK"
687     ;;
688    
689     kde)
690     type="KDE;Qt"
691     ;;
692    
693 vapier 1.158 mail)
694 vapier 1.159 type="Network;Email"
695 vapier 1.158 ;;
696    
697     media)
698     case ${catmin} in
699 vapier 1.339 gfx)
700     type=Graphics
701     ;;
702     *)
703     case ${catmin} in
704     radio) type=Tuner;;
705     sound) type=Audio;;
706     tv) type=TV;;
707     video) type=Video;;
708     esac
709     type="AudioVideo;${type}"
710     ;;
711 vapier 1.158 esac
712 wolf31o2 1.65 ;;
713 vapier 1.158
714     net)
715     case ${catmin} in
716     dialup) type=Dialup;;
717 vapier 1.338 ftp) type=FileTransfer;;
718     im) type=InstantMessaging;;
719     irc) type=IRCClient;;
720     mail) type=Email;;
721     news) type=News;;
722     nntp) type=News;;
723     p2p) type=FileTransfer;;
724     voip) type=Telephony;;
725 vapier 1.158 esac
726 vapier 1.159 type="Network;${type}"
727 vapier 1.158 ;;
728    
729     sci)
730     case ${catmin} in
731 vapier 1.284 astro*) type=Astronomy;;
732 vapier 1.338 bio*) type=Biology;;
733     calc*) type=Calculator;;
734     chem*) type=Chemistry;;
735 vapier 1.284 elec*) type=Electronics;;
736 vapier 1.338 geo*) type=Geology;;
737     math*) type=Math;;
738 vapier 1.284 physics) type=Physics;;
739     visual*) type=DataVisualization;;
740 vapier 1.159 esac
741 abcd 1.336 type="Education;Science;${type}"
742 vapier 1.158 ;;
743    
744 vapier 1.284 sys)
745     type="System"
746     ;;
747    
748 vapier 1.158 www)
749     case ${catmin} in
750     client) type=WebBrowser;;
751     esac
752 abcd 1.336 type="Network;${type}"
753 azarah 1.59 ;;
754 vapier 1.158
755 azarah 1.59 *)
756     type=
757     ;;
758 vapier 1.39 esac
759     fi
760 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
761     local desktop_name="${PN}"
762     else
763     local desktop_name="${PN}-${SLOT}"
764     fi
765 vapier 1.272 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
766 vapier 1.271 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
767 vapier 1.39
768 abcd 1.336 # Don't append another ";" when a valid category value is provided.
769     type=${type%;}${type:+;}
770    
771     eshopts_push -s extglob
772     if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then
773     ewarn "As described in the Icon Theme Specification, icon file extensions are not"
774     ewarn "allowed in .desktop files if the value is not an absolute path."
775     icon=${icon%.@(xpm|png|svg)}
776     fi
777     eshopts_pop
778    
779 vapier 1.271 cat <<-EOF > "${desktop}"
780     [Desktop Entry]
781     Name=${name}
782     Type=Application
783     Comment=${DESCRIPTION}
784     Exec=${exec}
785     TryExec=${exec%% *}
786     Icon=${icon}
787 abcd 1.336 Categories=${type}
788 vapier 1.271 EOF
789 vapier 1.39
790 vapier 1.341 if [[ ${fields:-=} != *=* ]] ; then
791     # 5th arg used to be value to Path=
792     ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"
793     fields="Path=${fields}"
794     fi
795 vapier 1.342 [[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}"
796 wolf31o2 1.293
797 vapier 1.204 (
798     # wrap the env here so that the 'insinto' call
799     # doesn't corrupt the env of the caller
800     insinto /usr/share/applications
801     doins "${desktop}"
802 vapier 1.340 ) || die "installing desktop file failed"
803 danarmak 1.32 }
804    
805 vapier 1.283 # @FUNCTION: validate_desktop_entries
806     # @USAGE: [directories]
807     # @MAINTAINER:
808     # Carsten Lohrke <carlo@gentoo.org>
809     # @DESCRIPTION:
810 carlo 1.278 # Validate desktop entries using desktop-file-utils
811 carlo 1.277 validate_desktop_entries() {
812     if [[ -x /usr/bin/desktop-file-validate ]] ; then
813     einfo "Checking desktop entry validity"
814     local directories=""
815 carlo 1.279 for d in /usr/share/applications $@ ; do
816     [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"
817 carlo 1.277 done
818 carlo 1.279 if [[ -n ${directories} ]] ; then
819     for FILE in $(find ${directories} -name "*\.desktop" \
820     -not -path '*.hidden*' | sort -u 2>/dev/null)
821     do
822     local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | \
823     sed -e "s|error: ||" -e "s|${FILE}:|--|g" )
824     [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}
825     done
826     fi
827 carlo 1.277 echo ""
828     else
829     einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
830     fi
831     }
832    
833 vapier 1.283 # @FUNCTION: make_session_desktop
834 vapier 1.314 # @USAGE: <title> <command> [command args...]
835 vapier 1.283 # @DESCRIPTION:
836     # Make a GDM/KDM Session file. The title is the file to execute to start the
837     # Window Manager. The command is the name of the Window Manager.
838 vapier 1.314 #
839     # You can set the name of the file via the ${wm} variable.
840 lanius 1.133 make_session_desktop() {
841 vapier 1.314 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
842     [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
843 lanius 1.133
844 vapier 1.167 local title=$1
845     local command=$2
846 vapier 1.314 local desktop=${T}/${wm:-${PN}}.desktop
847     shift 2
848 lanius 1.133
849 vapier 1.271 cat <<-EOF > "${desktop}"
850     [Desktop Entry]
851     Name=${title}
852     Comment=This session logs you into ${title}
853 vapier 1.314 Exec=${command} $*
854 vapier 1.271 TryExec=${command}
855 vapier 1.314 Type=XSession
856 vapier 1.271 EOF
857 lanius 1.133
858 vapier 1.271 (
859     # wrap the env here so that the 'insinto' call
860     # doesn't corrupt the env of the caller
861 lanius 1.133 insinto /usr/share/xsessions
862     doins "${desktop}"
863 vapier 1.271 )
864 lanius 1.133 }
865    
866 vapier 1.283 # @FUNCTION: domenu
867     # @USAGE: <menus>
868     # @DESCRIPTION:
869     # Install the list of .desktop menu files into the appropriate directory
870     # (/usr/share/applications).
871 lanius 1.133 domenu() {
872 vapier 1.271 (
873     # wrap the env here so that the 'insinto' call
874     # doesn't corrupt the env of the caller
875     local i j ret=0
876 lanius 1.133 insinto /usr/share/applications
877 vapier 1.167 for i in "$@" ; do
878     if [[ -f ${i} ]] ; then
879     doins "${i}"
880 vapier 1.271 ((ret+=$?))
881 vapier 1.167 elif [[ -d ${i} ]] ; then
882     for j in "${i}"/*.desktop ; do
883     doins "${j}"
884 vapier 1.271 ((ret+=$?))
885 lanius 1.133 done
886 vapier 1.285 else
887     ((++ret))
888 swegener 1.190 fi
889 lanius 1.133 done
890 vapier 1.271 exit ${ret}
891     )
892 lanius 1.133 }
893 vapier 1.283
894     # @FUNCTION: newmenu
895     # @USAGE: <menu> <newname>
896     # @DESCRIPTION:
897     # Like all other new* functions, install the specified menu as newname.
898 vapier 1.167 newmenu() {
899 vapier 1.271 (
900     # wrap the env here so that the 'insinto' call
901     # doesn't corrupt the env of the caller
902 vapier 1.167 insinto /usr/share/applications
903 vapier 1.271 newins "$@"
904     )
905 vapier 1.167 }
906 lanius 1.133
907 vapier 1.283 # @FUNCTION: doicon
908     # @USAGE: <list of icons>
909     # @DESCRIPTION:
910     # Install the list of icons into the icon directory (/usr/share/pixmaps).
911     # This is useful in conjunction with creating desktop/menu files.
912 lanius 1.133 doicon() {
913 vapier 1.271 (
914     # wrap the env here so that the 'insinto' call
915     # doesn't corrupt the env of the caller
916     local i j ret
917 lanius 1.133 insinto /usr/share/pixmaps
918 vapier 1.167 for i in "$@" ; do
919     if [[ -f ${i} ]] ; then
920     doins "${i}"
921 vapier 1.271 ((ret+=$?))
922 vapier 1.167 elif [[ -d ${i} ]] ; then
923     for j in "${i}"/*.png ; do
924     doins "${j}"
925 vapier 1.271 ((ret+=$?))
926 lanius 1.133 done
927 vapier 1.285 else
928     ((++ret))
929 swegener 1.190 fi
930 lanius 1.133 done
931 vapier 1.271 exit ${ret}
932     )
933 lanius 1.133 }
934 vapier 1.283
935     # @FUNCTION: newicon
936     # @USAGE: <icon> <newname>
937     # @DESCRIPTION:
938     # Like all other new* functions, install the specified icon as newname.
939 vapier 1.167 newicon() {
940 vapier 1.271 (
941     # wrap the env here so that the 'insinto' call
942     # doesn't corrupt the env of the caller
943 vapier 1.167 insinto /usr/share/pixmaps
944 vapier 1.271 newins "$@"
945     )
946 vapier 1.167 }
947 lanius 1.133
948 ulm 1.380 # @FUNCTION: cdrom_get_cds
949     # @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
950     # @DESCRIPTION:
951     # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
952     # the whole 'non-interactive' policy, but damnit I want CD support !
953     #
954     # With these cdrom functions we handle all the user interaction and
955     # standardize everything. All you have to do is call cdrom_get_cds()
956     # and when the function returns, you can assume that the cd has been
957     # found at CDROM_ROOT.
958     #
959     # The function will attempt to locate a cd based upon a file that is on
960     # the cd. The more files you give this function, the more cds
961     # the cdrom functions will handle.
962     #
963     # Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
964     # etc... If you want to give the cds better names, then just export
965     # the appropriate CDROM_NAME variable before calling cdrom_get_cds().
966     # Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
967     # also use the CDROM_NAME_SET bash array.
968     #
969     # For those multi cd ebuilds, see the cdrom_load_next_cd() function.
970     cdrom_get_cds() {
971     # first we figure out how many cds we're dealing with by
972     # the # of files they gave us
973     local cdcnt=0
974     local f=
975     for f in "$@" ; do
976     ((++cdcnt))
977     export CDROM_CHECK_${cdcnt}="$f"
978     done
979     export CDROM_TOTAL_CDS=${cdcnt}
980     export CDROM_CURRENT_CD=1
981    
982     # now we see if the user gave use CD_ROOT ...
983     # if they did, let's just believe them that it's correct
984     if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
985     local var=
986     cdcnt=0
987     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
988     ((++cdcnt))
989     var="CD_ROOT_${cdcnt}"
990     [[ -z ${!var} ]] && var="CD_ROOT"
991     if [[ -z ${!var} ]] ; then
992     eerror "You must either use just the CD_ROOT"
993     eerror "or specify ALL the CD_ROOT_X variables."
994     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
995     die "could not locate CD_ROOT_${cdcnt}"
996     fi
997     done
998     export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
999     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1000     export CDROM_SET=-1
1001     for f in ${CDROM_CHECK_1//:/ } ; do
1002     ((++CDROM_SET))
1003     [[ -e ${CDROM_ROOT}/${f} ]] && break
1004     done
1005     export CDROM_MATCH=${f}
1006     return
1007     fi
1008    
1009     # User didn't help us out so lets make sure they know they can
1010     # simplify the whole process ...
1011     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1012     einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1013     echo
1014     einfo "If you do not have the CD, but have the data files"
1015     einfo "mounted somewhere on your filesystem, just export"
1016     einfo "the variable CD_ROOT so that it points to the"
1017     einfo "directory containing the files."
1018     echo
1019     einfo "For example:"
1020     einfo "export CD_ROOT=/mnt/cdrom"
1021     echo
1022     else
1023     if [[ -n ${CDROM_NAME_SET} ]] ; then
1024     # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1025     cdcnt=0
1026     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1027     ((++cdcnt))
1028     export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1029     done
1030     fi
1031    
1032     einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1033     cdcnt=0
1034     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1035     ((++cdcnt))
1036     var="CDROM_NAME_${cdcnt}"
1037     [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1038     done
1039     echo
1040     einfo "If you do not have the CDs, but have the data files"
1041     einfo "mounted somewhere on your filesystem, just export"
1042     einfo "the following variables so they point to the right place:"
1043     einfon ""
1044     cdcnt=0
1045     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1046     ((++cdcnt))
1047     echo -n " CD_ROOT_${cdcnt}"
1048     done
1049     echo
1050     einfo "Or, if you have all the files in the same place, or"
1051     einfo "you only have one cdrom, you can export CD_ROOT"
1052     einfo "and that place will be used as the same data source"
1053     einfo "for all the CDs."
1054     echo
1055     einfo "For example:"
1056     einfo "export CD_ROOT_1=/mnt/cdrom"
1057     echo
1058     fi
1059    
1060     export CDROM_SET=""
1061     export CDROM_CURRENT_CD=0
1062     cdrom_load_next_cd
1063     }
1064    
1065     # @FUNCTION: cdrom_load_next_cd
1066     # @DESCRIPTION:
1067     # Some packages are so big they come on multiple CDs. When you're done reading
1068     # files off a CD and want access to the next one, just call this function.
1069     # Again, all the messy details of user interaction are taken care of for you.
1070     # Once this returns, just read the variable CDROM_ROOT for the location of the
1071     # mounted CD. Note that you can only go forward in the CD list, so make sure
1072     # you only call this function when you're done using the current CD.
1073     cdrom_load_next_cd() {
1074     local var
1075     ((++CDROM_CURRENT_CD))
1076    
1077     unset CDROM_ROOT
1078     var=CD_ROOT_${CDROM_CURRENT_CD}
1079     [[ -z ${!var} ]] && var="CD_ROOT"
1080     if [[ -z ${!var} ]] ; then
1081     var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1082     _cdrom_locate_file_on_cd ${!var}
1083     else
1084     export CDROM_ROOT=${!var}
1085     fi
1086    
1087     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1088     }
1089    
1090     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1091     # functions. this should *never* be called from an ebuild.
1092     # all it does is try to locate a give file on a cd ... if the cd isn't
1093     # found, then a message asking for the user to insert the cdrom will be
1094     # displayed and we'll hang out here until:
1095     # (1) the file is found on a mounted cdrom
1096     # (2) the user hits CTRL+C
1097     _cdrom_locate_file_on_cd() {
1098     local mline=""
1099     local showedmsg=0 showjolietmsg=0
1100    
1101     while [[ -z ${CDROM_ROOT} ]] ; do
1102     local i=0
1103     local -a cdset=(${*//:/ })
1104     if [[ -n ${CDROM_SET} ]] ; then
1105     cdset=(${cdset[${CDROM_SET}]})
1106     fi
1107    
1108     while [[ -n ${cdset[${i}]} ]] ; do
1109     local dir=$(dirname ${cdset[${i}]})
1110     local file=$(basename ${cdset[${i}]})
1111    
1112     local point= node= fs= foo=
1113     while read point node fs foo ; do
1114     [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1115     ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1116     && continue
1117     point=${point//\040/ }
1118     [[ ! -d ${point}/${dir} ]] && continue
1119     [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1120     export CDROM_ROOT=${point}
1121     export CDROM_SET=${i}
1122     export CDROM_MATCH=${cdset[${i}]}
1123     return
1124     done <<< "$(get_mounts)"
1125    
1126     ((++i))
1127     done
1128    
1129     echo
1130     if [[ ${showedmsg} -eq 0 ]] ; then
1131     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1132     if [[ -z ${CDROM_NAME} ]] ; then
1133     einfo "Please insert+mount the cdrom for ${PN} now !"
1134     else
1135     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1136     fi
1137     else
1138     if [[ -z ${CDROM_NAME_1} ]] ; then
1139     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1140     else
1141     local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1142     einfo "Please insert+mount the ${!var} cdrom now !"
1143     fi
1144     fi
1145     showedmsg=1
1146     fi
1147     einfo "Press return to scan for the cd again"
1148     einfo "or hit CTRL+C to abort the emerge."
1149     echo
1150     if [[ ${showjolietmsg} -eq 0 ]] ; then
1151     showjolietmsg=1
1152     else
1153     ewarn "If you are having trouble with the detection"
1154     ewarn "of your CD, it is possible that you do not have"
1155     ewarn "Joliet support enabled in your kernel. Please"
1156     ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1157     ebeep 5
1158     fi
1159     read || die "something is screwed with your system"
1160     done
1161     }
1162    
1163 vapier 1.287 # @FUNCTION: strip-linguas
1164     # @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1165     # @DESCRIPTION:
1166 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1167 vapier 1.287 # a package can support. The first form allows you to
1168     # specify a list of LINGUAS. The -i builds a list of po
1169     # files found in all the directories and uses the
1170     # intersection of the lists. The -u builds a list of po
1171     # files found in all the directories and uses the union
1172     # of the lists.
1173 vapier 1.92 strip-linguas() {
1174 vapier 1.242 local ls newls nols
1175 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1176     local op=$1; shift
1177 vapier 1.315 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1178 vapier 1.92 local d f
1179     for d in "$@" ; do
1180 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1181     newls=${ls}
1182 vapier 1.92 else
1183     newls=""
1184     fi
1185 vapier 1.315 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1186 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1187 ssuominen 1.358 has ${f} ${ls} && newls="${newls} ${f}"
1188 vapier 1.92 else
1189 ssuominen 1.358 has ${f} ${ls} || newls="${newls} ${f}"
1190 vapier 1.92 fi
1191     done
1192 vapier 1.154 ls=${newls}
1193 vapier 1.92 done
1194     else
1195 vapier 1.236 ls="$@"
1196 vapier 1.92 fi
1197    
1198 vapier 1.242 nols=""
1199 vapier 1.92 newls=""
1200     for f in ${LINGUAS} ; do
1201 ssuominen 1.358 if has ${f} ${ls} ; then
1202 vapier 1.120 newls="${newls} ${f}"
1203 vapier 1.92 else
1204 vapier 1.242 nols="${nols} ${f}"
1205 vapier 1.92 fi
1206     done
1207 vapier 1.244 [[ -n ${nols} ]] \
1208 vapier 1.316 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1209 vapier 1.237 export LINGUAS=${newls:1}
1210 vapier 1.92 }
1211 iggy 1.110
1212 vapier 1.283 # @FUNCTION: preserve_old_lib
1213     # @USAGE: <libs to preserve> [more libs]
1214     # @DESCRIPTION:
1215     # These functions are useful when a lib in your package changes ABI SONAME.
1216     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1217 eradicator 1.111 # would break packages that link against it. Most people get around this
1218     # by using the portage SLOT mechanism, but that is not always a relevant
1219 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1220     # preserve_old_lib_notify function.
1221 eradicator 1.111 preserve_old_lib() {
1222 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1223 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1224 vapier 1.276 die "Invalid preserve_old_lib() usage"
1225 vapier 1.267 fi
1226     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1227    
1228 vapier 1.297 # let portage worry about it
1229     has preserve-libs ${FEATURES} && return 0
1230    
1231 vapier 1.267 local lib dir
1232     for lib in "$@" ; do
1233     [[ -e ${ROOT}/${lib} ]] || continue
1234     dir=${lib%/*}
1235     dodir ${dir} || die "dodir ${dir} failed"
1236     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1237     touch "${D}"/${lib}
1238     done
1239 eradicator 1.111 }
1240    
1241 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1242     # @USAGE: <libs to notify> [more libs]
1243     # @DESCRIPTION:
1244     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1245 eradicator 1.111 preserve_old_lib_notify() {
1246 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1247 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1248 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1249 vapier 1.267 fi
1250    
1251 vapier 1.297 # let portage worry about it
1252     has preserve-libs ${FEATURES} && return 0
1253    
1254 vapier 1.267 local lib notice=0
1255     for lib in "$@" ; do
1256     [[ -e ${ROOT}/${lib} ]] || continue
1257     if [[ ${notice} -eq 0 ]] ; then
1258     notice=1
1259     ewarn "Old versions of installed libraries were detected on your system."
1260     ewarn "In order to avoid breaking packages that depend on these old libs,"
1261     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1262     ewarn "in order to remove these old dependencies. If you do not have this"
1263     ewarn "helper program, simply emerge the 'gentoolkit' package."
1264     ewarn
1265     fi
1266 vapier 1.355 # temp hack for #348634 #357225
1267     [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1268 vapier 1.352 ewarn " # revdep-rebuild --library '${lib}'"
1269 vapier 1.267 done
1270 vapier 1.291 if [[ ${notice} -eq 1 ]] ; then
1271     ewarn
1272     ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1273 vapier 1.300 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1274     for lib in "$@" ; do
1275     ewarn " # rm '${lib}'"
1276     done
1277 vapier 1.291 fi
1278 eradicator 1.111 }
1279 vapier 1.125
1280 vapier 1.283 # @FUNCTION: built_with_use
1281     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1282     # @DESCRIPTION:
1283 betelgeuse 1.329 #
1284     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1285     #
1286 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1287     # flags being enabled in packages. This will check to see if the specified
1288     # DEPEND atom was built with the specified list of USE flags. The
1289     # --missing option controls the behavior if called on a package that does
1290     # not actually support the defined USE flags (aka listed in IUSE).
1291     # The default is to abort (call die). The -a and -o flags control
1292     # the requirements of the USE flags. They correspond to "and" and "or"
1293     # logic. So the -a flag means all listed USE flags must be enabled
1294 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1295 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1296     # means the USE flag we're checking is hidden expanded, so it won't be found
1297     # in IUSE like normal USE flags.
1298 swegener 1.286 #
1299 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1300     # flags matter.
1301 vapier 1.125 built_with_use() {
1302 vapier 1.275 local hidden="no"
1303     if [[ $1 == "--hidden" ]] ; then
1304     hidden="yes"
1305     shift
1306     fi
1307    
1308 vapier 1.269 local missing_action="die"
1309     if [[ $1 == "--missing" ]] ; then
1310     missing_action=$2
1311     shift ; shift
1312     case ${missing_action} in
1313     true|false|die) ;;
1314     *) die "unknown action '${missing_action}'";;
1315     esac
1316     fi
1317    
1318 vapier 1.130 local opt=$1
1319     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1320    
1321     local PKG=$(best_version $1)
1322 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1323 vapier 1.130 shift
1324    
1325 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1326 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1327 vapier 1.213
1328 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1329     # this gracefully
1330 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1331 cardoe 1.273 case ${missing_action} in
1332     true) return 0;;
1333     false) return 1;;
1334     die) die "Unable to determine what USE flags $PKG was built with";;
1335     esac
1336     fi
1337    
1338 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1339 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1340 vapier 1.275 # Don't check USE_EXPAND #147237
1341     local expand
1342     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1343     if [[ $1 == ${expand}_* ]] ; then
1344     expand=""
1345     break
1346     fi
1347     done
1348     if [[ -n ${expand} ]] ; then
1349 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1350 vapier 1.275 case ${missing_action} in
1351     true) return 0;;
1352     false) return 1;;
1353     die) die "$PKG does not actually support the $1 USE flag!";;
1354     esac
1355     fi
1356 vapier 1.269 fi
1357 vapier 1.250 fi
1358 vapier 1.249
1359 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1360 vapier 1.130 while [[ $# -gt 0 ]] ; do
1361     if [[ ${opt} = "-o" ]] ; then
1362     has $1 ${USE_BUILT} && return 0
1363     else
1364     has $1 ${USE_BUILT} || return 1
1365     fi
1366 vapier 1.125 shift
1367     done
1368 vapier 1.130 [[ ${opt} = "-a" ]]
1369 vapier 1.125 }
1370 vapier 1.126
1371 vapier 1.289 # @FUNCTION: epunt_cxx
1372 vapier 1.283 # @USAGE: [dir to scan]
1373     # @DESCRIPTION:
1374     # Many configure scripts wrongly bail when a C++ compiler could not be
1375     # detected. If dir is not specified, then it defaults to ${S}.
1376     #
1377     # http://bugs.gentoo.org/73450
1378 vapier 1.126 epunt_cxx() {
1379 vapier 1.127 local dir=$1
1380     [[ -z ${dir} ]] && dir=${S}
1381     ebegin "Removing useless C++ checks"
1382     local f
1383 vapier 1.294 find "${dir}" -name configure | while read f ; do
1384     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1385 vapier 1.127 done
1386     eend 0
1387 vapier 1.126 }
1388 ka0ttic 1.143
1389 vapier 1.283 # @FUNCTION: make_wrapper
1390 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1391 vapier 1.283 # @DESCRIPTION:
1392     # Create a shell wrapper script named wrapper in installpath
1393     # (defaults to the bindir) to execute target (default of wrapper) by
1394     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1395     # libpaths followed by optionally changing directory to chdir.
1396 wolf31o2 1.160 make_wrapper() {
1397 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1398 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1399 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1400     # things as $bin ... "./someprog --args"
1401 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1402     #!/bin/sh
1403 vapier 1.201 cd "${chdir:-.}"
1404 vapier 1.210 if [ -n "${libdir}" ] ; then
1405     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1406     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1407     else
1408     export LD_LIBRARY_PATH="${libdir}"
1409     fi
1410 vapier 1.201 fi
1411 vapier 1.202 exec ${bin} "\$@"
1412 wolf31o2 1.160 EOF
1413     chmod go+rx "${tmpwrapper}"
1414 vapier 1.201 if [[ -n ${path} ]] ; then
1415 vapier 1.283 (
1416 vapier 1.201 exeinto "${path}"
1417 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1418 vapier 1.283 ) || die
1419 wolf31o2 1.164 else
1420 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1421 wolf31o2 1.164 fi
1422 wolf31o2 1.160 }
1423 mr_bones_ 1.311
1424 vapier 1.351 # @FUNCTION: path_exists
1425     # @USAGE: [-a|-o] <paths>
1426     # @DESCRIPTION:
1427     # Check if the specified paths exist. Works for all types of paths
1428     # (files/dirs/etc...). The -a and -o flags control the requirements
1429     # of the paths. They correspond to "and" and "or" logic. So the -a
1430     # flag means all the paths must exist while the -o flag means at least
1431     # one of the paths must exist. The default behavior is "and". If no
1432     # paths are specified, then the return value is "false".
1433     path_exists() {
1434     local opt=$1
1435     [[ ${opt} == -[ao] ]] && shift || opt="-a"
1436    
1437     # no paths -> return false
1438     # same behavior as: [[ -e "" ]]
1439     [[ $# -eq 0 ]] && return 1
1440    
1441     local p r=0
1442     for p in "$@" ; do
1443     [[ -e ${p} ]]
1444     : $(( r += $? ))
1445     done
1446    
1447     case ${opt} in
1448     -a) return $(( r != 0 )) ;;
1449     -o) return $(( r == $# )) ;;
1450     esac
1451     }
1452 mgorny 1.364
1453     # @FUNCTION: in_iuse
1454     # @USAGE: <flag>
1455     # @DESCRIPTION:
1456     # Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1457     # as necessary.
1458     #
1459     # Note that this function should not be used in the global scope.
1460     in_iuse() {
1461     debug-print-function ${FUNCNAME} "${@}"
1462     [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1463    
1464     local flag=${1}
1465     local liuse=( ${IUSE} )
1466    
1467     has "${flag}" "${liuse[@]#[+-]}"
1468     }
1469 vapier 1.365
1470 vapier 1.367 # @FUNCTION: use_if_iuse
1471     # @USAGE: <flag>
1472     # @DESCRIPTION:
1473     # Return true if the given flag is in USE and IUSE.
1474     #
1475     # Note that this function should not be used in the global scope.
1476     use_if_iuse() {
1477     in_iuse $1 || return 1
1478     use $1
1479     }
1480    
1481 vapier 1.365 # @FUNCTION: usex
1482     # @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1483     # @DESCRIPTION:
1484     # If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1485     # otherwise echo [false output][false suffix] (defaults to "no").
1486     usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1487 vapier 1.371
1488 vapier 1.372 check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1489    
1490 vapier 1.371 fi

  ViewVC Help
Powered by ViewVC 1.1.20