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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.392 - (hide annotations) (download)
Fri May 11 14:22:01 2012 UTC (2 years, 7 months ago) by vapier
Branch: MAIN
Changes since 1.391: +10 -5 lines
support extended makeflag syntax and not just -j#

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.392 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.391 2012/04/20 19:35:37 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.385 inherit multilib 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 vapier 1.391 # Options to pass to patch. Meant for ebuild/package-specific tweaking
234     # such as forcing the patch level (-p#) or fuzz (-F#) factor. Note that
235     # for single patch tweaking, you can also pass flags directly to epatch.
236     EPATCH_OPTS=""
237     # @VARIABLE: EPATCH_COMMON_OPTS
238     # @DESCRIPTION:
239     # Common options to pass to `patch`. You probably should never need to
240     # change these. If you do, please discuss it with base-system first to
241     # be sure.
242 vapier 1.325 # @CODE
243     # -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
244     # --no-backup-if-mismatch - do not leave .orig files behind
245     # -E - automatically remove empty files
246     # @CODE
247 vapier 1.391 EPATCH_COMMON_OPTS="-g0 -E --no-backup-if-mismatch"
248 vapier 1.325 # @VARIABLE: EPATCH_EXCLUDE
249     # @DESCRIPTION:
250 mr_bones_ 1.308 # List of patches not to apply. Note this is only file names,
251 vapier 1.325 # and not the full path. Globs accepted.
252 azarah 1.6 EPATCH_EXCLUDE=""
253 vapier 1.325 # @VARIABLE: EPATCH_SINGLE_MSG
254     # @DESCRIPTION:
255 azarah 1.9 # Change the printed message for a single patch.
256     EPATCH_SINGLE_MSG=""
257 vapier 1.325 # @VARIABLE: EPATCH_MULTI_MSG
258     # @DESCRIPTION:
259 vapier 1.173 # Change the printed message for multiple patches.
260     EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
261 vapier 1.325 # @VARIABLE: EPATCH_FORCE
262     # @DESCRIPTION:
263     # Only require patches to match EPATCH_SUFFIX rather than the extended
264     # arch naming style.
265 azarah 1.29 EPATCH_FORCE="no"
266 azarah 1.2
267 vapier 1.325 # @FUNCTION: epatch
268 vapier 1.391 # @USAGE: [options] [patches] [dirs of patches]
269 vapier 1.325 # @DESCRIPTION:
270     # epatch is designed to greatly simplify the application of patches. It can
271     # process patch files directly, or directories of patches. The patches may be
272     # compressed (bzip/gzip/etc...) or plain text. You generally need not specify
273     # the -p option as epatch will automatically attempt -p0 to -p5 until things
274     # apply successfully.
275 azarah 1.2 #
276 vapier 1.391 # If you do not specify any patches/dirs, then epatch will default to the
277     # directory specified by EPATCH_SOURCE.
278     #
279     # Any options specified that start with a dash will be passed down to patch
280     # for this specific invocation. As soon as an arg w/out a dash is found, then
281     # arg processing stops.
282 azarah 1.2 #
283 vapier 1.325 # When processing directories, epatch will apply all patches that match:
284     # @CODE
285 vapier 1.350 # if ${EPATCH_FORCE} != "yes"
286 vapier 1.325 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
287     # else
288     # *.${EPATCH_SUFFIX}
289     # @CODE
290     # The leading ?? are typically numbers used to force consistent patch ordering.
291     # The arch field is used to apply patches only for the host architecture with
292     # the special value of "all" means apply for everyone. Note that using values
293     # other than "all" is highly discouraged -- you should apply patches all the
294     # time and let architecture details be detected at configure/compile time.
295 azarah 1.2 #
296 vapier 1.325 # If EPATCH_SUFFIX is empty, then no period before it is implied when searching
297     # for patches to apply.
298 azarah 1.2 #
299 vapier 1.325 # Refer to the other EPATCH_xxx variables for more customization of behavior.
300 azarah 1.2 epatch() {
301 swegener 1.231 _epatch_draw_line() {
302 vapier 1.325 # create a line of same length as input string
303 agriffis 1.229 [[ -z $1 ]] && set "$(printf "%65s" '')"
304     echo "${1//?/=}"
305 vapier 1.219 }
306 azarah 1.3
307 vapier 1.195 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
308    
309 vapier 1.391 # First process options. We localize the EPATCH_OPTS setting
310     # from above so that we can pass it on in the loop below with
311     # any additional values the user has specified.
312     local EPATCH_OPTS=( ${EPATCH_OPTS[*]} )
313     while [[ $# -gt 0 ]] ; do
314     case $1 in
315     -*) EPATCH_OPTS+=( "$1" ) ;;
316     *) break ;;
317     esac
318     shift
319     done
320    
321 vapier 1.325 # Let the rest of the code process one user arg at a time --
322     # each arg may expand into multiple patches, and each arg may
323     # need to start off with the default global EPATCH_xxx values
324     if [[ $# -gt 1 ]] ; then
325     local m
326 vapier 1.94 for m in "$@" ; do
327     epatch "${m}"
328     done
329     return 0
330 azarah 1.3 fi
331    
332 vapier 1.325 local SINGLE_PATCH="no"
333     # no args means process ${EPATCH_SOURCE}
334     [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"
335    
336     if [[ -f $1 ]] ; then
337 azarah 1.3 SINGLE_PATCH="yes"
338 vapier 1.325 set -- "$1"
339     # Use the suffix from the single patch (localize it); the code
340     # below will find the suffix for us
341     local EPATCH_SUFFIX=$1
342    
343     elif [[ -d $1 ]] ; then
344     # Some people like to make dirs of patches w/out suffixes (vim)
345     set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
346 danarmak 1.32
347 vapier 1.359 elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
348     # Re-use EPATCH_SOURCE as a search dir
349     epatch "${EPATCH_SOURCE}/$1"
350     return $?
351    
352 azarah 1.3 else
353 vapier 1.325 # sanity check ... if it isn't a dir or file, wtf man ?
354     [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
355     echo
356     eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
357     eerror
358     eerror " ${EPATCH_SOURCE}"
359     eerror " ( ${EPATCH_SOURCE##*/} )"
360     echo
361     die "Cannot find \$EPATCH_SOURCE!"
362 azarah 1.3 fi
363 azarah 1.2
364 vapier 1.391 # Now that we know we're actually going to apply something, merge
365     # all of the patch options back in to a single variable for below.
366     EPATCH_OPTS="${EPATCH_COMMON_OPTS} ${EPATCH_OPTS[*]}"
367    
368 vapier 1.325 local PIPE_CMD
369 azarah 1.2 case ${EPATCH_SUFFIX##*\.} in
370 vapier 1.325 xz) PIPE_CMD="xz -dc" ;;
371     lzma) PIPE_CMD="lzma -dc" ;;
372     bz2) PIPE_CMD="bzip2 -dc" ;;
373     gz|Z|z) PIPE_CMD="gzip -dc" ;;
374     ZIP|zip) PIPE_CMD="unzip -p" ;;
375     *) ;;
376 azarah 1.2 esac
377    
378 vapier 1.325 [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"
379    
380     local x
381     for x in "$@" ; do
382     # If the patch dir given contains subdirs, or our EPATCH_SUFFIX
383     # didn't match anything, ignore continue on
384     [[ ! -f ${x} ]] && continue
385    
386     local patchname=${x##*/}
387    
388     # Apply single patches, or forced sets of patches, or
389     # patches with ARCH dependant names.
390 flameeyes 1.266 # ???_arch_foo.patch
391 vapier 1.325 # Else, skip this input altogether
392     local a=${patchname#*_} # strip the ???_
393     a=${a%%_*} # strip the _foo.patch
394     if ! [[ ${SINGLE_PATCH} == "yes" || \
395 ulm 1.354 ${EPATCH_FORCE} == "yes" || \
396     ${a} == all || \
397     ${a} == ${ARCH} ]]
398 azarah 1.2 then
399 vapier 1.325 continue
400     fi
401 azarah 1.6
402 vapier 1.325 # Let people filter things dynamically
403     if [[ -n ${EPATCH_EXCLUDE} ]] ; then
404     # let people use globs in the exclude
405     eshopts_push -o noglob
406    
407 scarabeus 1.328 local ex
408 vapier 1.325 for ex in ${EPATCH_EXCLUDE} ; do
409 scarabeus 1.328 if [[ ${patchname} == ${ex} ]] ; then
410     eshopts_pop
411     continue 2
412     fi
413 vapier 1.325 done
414 vapier 1.326
415 vapier 1.325 eshopts_pop
416     fi
417 danarmak 1.32
418 vapier 1.325 if [[ ${SINGLE_PATCH} == "yes" ]] ; then
419     if [[ -n ${EPATCH_SINGLE_MSG} ]] ; then
420     einfo "${EPATCH_SINGLE_MSG}"
421 azarah 1.3 else
422 vapier 1.325 einfo "Applying ${patchname} ..."
423 azarah 1.3 fi
424 vapier 1.325 else
425     einfo " ${patchname} ..."
426     fi
427 azarah 1.2
428 vapier 1.325 # most of the time, there will only be one run per unique name,
429     # but if there are more, make sure we get unique log filenames
430     local STDERR_TARGET="${T}/${patchname}.out"
431     if [[ -e ${STDERR_TARGET} ]] ; then
432     STDERR_TARGET="${T}/${patchname}-$$.out"
433     fi
434 azarah 1.2
435 vapier 1.369 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
436 vapier 1.304
437 vapier 1.325 # Decompress the patch if need be
438     local count=0
439     local PATCH_TARGET
440     if [[ -n ${PIPE_CMD} ]] ; then
441     PATCH_TARGET="${T}/$$.patch"
442     echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"
443 vapier 1.304
444 vapier 1.325 if ! (${PIPE_CMD} "${x}" > "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
445     echo
446     eerror "Could not extract patch!"
447     #die "Could not extract patch!"
448     count=5
449     break
450 vapier 1.305 fi
451 vapier 1.325 else
452     PATCH_TARGET=${x}
453     fi
454 vapier 1.305
455 vapier 1.325 # Check for absolute paths in patches. If sandbox is disabled,
456     # people could (accidently) patch files in the root filesystem.
457     # Or trigger other unpleasantries #237667. So disallow -p0 on
458     # such patches.
459     local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
460     if [[ -n ${abs_paths} ]] ; then
461     count=1
462     printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
463     fi
464 vapier 1.353 # Similar reason, but with relative paths.
465     local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}")
466     if [[ -n ${rel_paths} ]] ; then
467     eqawarn "QA Notice: Your patch uses relative paths '../'."
468     eqawarn " In the future this will cause a failure."
469     eqawarn "${rel_paths}"
470     fi
471 vapier 1.325
472     # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
473 vapier 1.383 local patch_cmd
474 vapier 1.325 while [[ ${count} -lt 5 ]] ; do
475 naota 1.386 patch_cmd="${BASH_ALIASES[patch]:-patch} -p${count} ${EPATCH_OPTS}"
476 vapier 1.383
477 vapier 1.325 # Generate some useful debug info ...
478     (
479     _epatch_draw_line "***** ${patchname} *****"
480     echo
481 vapier 1.383 echo "PATCH COMMAND: ${patch_cmd} < '${PATCH_TARGET}'"
482 vapier 1.325 echo
483     _epatch_draw_line "***** ${patchname} *****"
484 vapier 1.383 ${patch_cmd} --dry-run -f < "${PATCH_TARGET}" 2>&1
485 vapier 1.360 ret=$?
486     echo
487     echo "patch program exited with status ${ret}"
488     exit ${ret}
489 vapier 1.325 ) >> "${STDERR_TARGET}"
490 azarah 1.8
491 vapier 1.360 if [ $? -eq 0 ] ; then
492 vapier 1.325 (
493     _epatch_draw_line "***** ${patchname} *****"
494     echo
495     echo "ACTUALLY APPLYING ${patchname} ..."
496     echo
497     _epatch_draw_line "***** ${patchname} *****"
498 vapier 1.383 ${patch_cmd} < "${PATCH_TARGET}" 2>&1
499 vapier 1.360 ret=$?
500     echo
501     echo "patch program exited with status ${ret}"
502     exit ${ret}
503 vapier 1.325 ) >> "${STDERR_TARGET}"
504 danarmak 1.32
505 vapier 1.325 if [ $? -ne 0 ] ; then
506     echo
507     eerror "A dry-run of patch command succeeded, but actually"
508     eerror "applying the patch failed!"
509     #die "Real world sux compared to the dreamworld!"
510     count=5
511 azarah 1.2 fi
512 vapier 1.325 break
513 azarah 1.8 fi
514    
515 vapier 1.325 : $(( count++ ))
516     done
517 azarah 1.8
518 vapier 1.325 # if we had to decompress the patch, delete the temp one
519     if [[ -n ${PIPE_CMD} ]] ; then
520     rm -f "${PATCH_TARGET}"
521     fi
522 azarah 1.3
523 vapier 1.325 if [[ ${count} -ge 5 ]] ; then
524     echo
525     eerror "Failed Patch: ${patchname} !"
526     eerror " ( ${PATCH_TARGET} )"
527     eerror
528     eerror "Include in your bugreport the contents of:"
529     eerror
530     eerror " ${STDERR_TARGET}"
531     echo
532     die "Failed Patch: ${patchname}!"
533 azarah 1.2 fi
534 vapier 1.325
535 vapier 1.383 # if everything worked, delete the full debug patch log
536 vapier 1.325 rm -f "${STDERR_TARGET}"
537 vapier 1.383
538     # then log away the exact stuff for people to review later
539     cat <<-EOF >> "${T}/epatch.log"
540     PATCH: ${x}
541     CMD: ${patch_cmd}
542     PWD: ${PWD}
543    
544     EOF
545 vapier 1.325 eend 0
546 azarah 1.2 done
547 vapier 1.325
548     [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
549     : # everything worked
550 azarah 1.26 }
551 vapier 1.361
552     # @FUNCTION: epatch_user
553     # @USAGE:
554     # @DESCRIPTION:
555     # Applies user-provided patches to the source tree. The patches are
556     # taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first
557     # of these three directories to exist will be the one to use, ignoring
558 vapier 1.387 # any more general directories which might exist as well. They must end
559     # in ".patch" to be applied.
560 vapier 1.361 #
561     # User patches are intended for quick testing of patches without ebuild
562     # modifications, as well as for permanent customizations a user might
563     # desire. Obviously, there can be no official support for arbitrarily
564     # patched ebuilds. So whenever a build log in a bug report mentions that
565     # user patches were applied, the user should be asked to reproduce the
566     # problem without these.
567     #
568     # Not all ebuilds do call this function, so placing patches in the
569     # stated directory might or might not work, depending on the package and
570     # the eclasses it inherits and uses. It is safe to call the function
571     # repeatedly, so it is always possible to add a call at the ebuild
572     # level. The first call is the time when the patches will be
573     # applied.
574     #
575     # Ideally, this function should be called after gentoo-specific patches
576     # have been applied, so that their code can be modified as well, but
577     # before calls to e.g. eautoreconf, as the user patches might affect
578     # autotool input files as well.
579 vapier 1.318 epatch_user() {
580     [[ $# -ne 0 ]] && die "epatch_user takes no options"
581    
582 vapier 1.361 # Allow multiple calls to this function; ignore all but the first
583 vapier 1.383 local applied="${T}/epatch_user.log"
584 vapier 1.361 [[ -e ${applied} ]] && return 2
585    
586 vapier 1.318 # don't clobber any EPATCH vars that the parent might want
587 zmedico 1.323 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
588 ulm 1.378 for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}; do
589 vapier 1.318 EPATCH_SOURCE=${base}/${CTARGET}/${check}
590     [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
591     [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
592     if [[ -d ${EPATCH_SOURCE} ]] ; then
593     EPATCH_SOURCE=${EPATCH_SOURCE} \
594     EPATCH_SUFFIX="patch" \
595     EPATCH_FORCE="yes" \
596     EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
597     epatch
598 vapier 1.361 echo "${EPATCH_SOURCE}" > "${applied}"
599 vapier 1.349 return 0
600 vapier 1.318 fi
601     done
602 vapier 1.361 echo "none" > "${applied}"
603 vapier 1.349 return 1
604 vapier 1.318 }
605 azarah 1.26
606 vapier 1.283 # @FUNCTION: emktemp
607     # @USAGE: [temp dir]
608     # @DESCRIPTION:
609 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
610 vapier 1.283 # does not exist on the users system.
611 vapier 1.117 emktemp() {
612 vapier 1.119 local exe="touch"
613 vapier 1.194 [[ $1 == -d ]] && exe="mkdir" && shift
614     local topdir=$1
615 mr_bones_ 1.100
616 vapier 1.194 if [[ -z ${topdir} ]] ; then
617     [[ -z ${T} ]] \
618 vapier 1.117 && topdir="/tmp" \
619 vapier 1.194 || topdir=${T}
620 vapier 1.117 fi
621    
622 vapier 1.280 if ! type -P mktemp > /dev/null ; then
623     # system lacks `mktemp` so we have to fake it
624 vapier 1.117 local tmp=/
625 vapier 1.194 while [[ -e ${tmp} ]] ; do
626     tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}
627 vapier 1.117 done
628 vapier 1.194 ${exe} "${tmp}" || ${exe} -p "${tmp}"
629 vapier 1.117 echo "${tmp}"
630 vapier 1.52 else
631 vapier 1.280 # the args here will give slightly wierd names on BSD,
632     # but should produce a usable file on all userlands
633 flameeyes 1.223 if [[ ${exe} == "touch" ]] ; then
634 vapier 1.280 TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX
635 flameeyes 1.223 else
636 vapier 1.280 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
637 flameeyes 1.223 fi
638 vapier 1.52 fi
639     }
640    
641 vapier 1.283 # @FUNCTION: edos2unix
642     # @USAGE: <file> [more files ...]
643     # @DESCRIPTION:
644     # A handy replacement for dos2unix, recode, fixdos, etc... This allows you
645     # to remove all of these text utilities from DEPEND variables because this
646     # is a script based solution. Just give it a list of files to convert and
647     # they will all be changed from the DOS CRLF format to the UNIX LF format.
648 vapier 1.24 edos2unix() {
649 vapier 1.366 [[ $# -eq 0 ]] && return 0
650     sed -i 's/\r$//' -- "$@" || die
651 vapier 1.39 }
652    
653 jlec 1.377 # @FUNCTION: make_desktop_entry
654     # @USAGE: make_desktop_entry(<command>, [name], [icon], [type], [fields])
655     # @DESCRIPTION:
656     # Make a .desktop file.
657     #
658     # @CODE
659     # binary: what command does the app run with ?
660     # name: the name that will show up in the menu
661     # icon: give your little like a pretty little icon ...
662     # this can be relative (to /usr/share/pixmaps) or
663     # a full path to an icon
664     # type: what kind of application is this?
665     # for categories:
666     # http://standards.freedesktop.org/menu-spec/latest/apa.html
667     # if unset, function tries to guess from package's category
668 vapier 1.341 # fields: extra fields to append to the desktop file; a printf string
669 jlec 1.377 # @CODE
670 vapier 1.39 make_desktop_entry() {
671 vapier 1.341 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
672 vapier 1.39
673 vapier 1.158 local exec=${1}
674     local name=${2:-${PN}}
675 wolf31o2 1.293 local icon=${3:-${PN}}
676 vapier 1.158 local type=${4}
677 vapier 1.341 local fields=${5}
678 vapier 1.158
679     if [[ -z ${type} ]] ; then
680     local catmaj=${CATEGORY%%-*}
681     local catmin=${CATEGORY##*-}
682     case ${catmaj} in
683     app)
684     case ${catmin} in
685 pacho 1.384 accessibility) type="Utility;Accessibility";;
686 vapier 1.338 admin) type=System;;
687     antivirus) type=System;;
688 pacho 1.384 arch) type="Utility;Archiving";;
689     backup) type="Utility;Archiving";;
690     cdr) type="AudioVideo;DiscBurning";;
691     dicts) type="Office;Dictionary";;
692 vapier 1.338 doc) type=Documentation;;
693 pacho 1.384 editors) type="Utility;TextEditor";;
694     emacs) type="Development;TextEditor";;
695     emulation) type="System;Emulator";;
696     laptop) type="Settings;HardwareSettings";;
697 vapier 1.338 office) type=Office;;
698 pacho 1.384 pda) type="Office;PDA";;
699     vim) type="Development;TextEditor";;
700     xemacs) type="Development;TextEditor";;
701 vapier 1.158 esac
702 azarah 1.59 ;;
703 vapier 1.158
704     dev)
705 vapier 1.159 type="Development"
706 vapier 1.158 ;;
707    
708     games)
709     case ${catmin} in
710 wolf31o2 1.265 action|fps) type=ActionGame;;
711 vapier 1.338 arcade) type=ArcadeGame;;
712     board) type=BoardGame;;
713     emulation) type=Emulator;;
714     kids) type=KidsGame;;
715     puzzle) type=LogicGame;;
716     roguelike) type=RolePlaying;;
717     rpg) type=RolePlaying;;
718 vapier 1.158 simulation) type=Simulation;;
719 vapier 1.338 sports) type=SportsGame;;
720     strategy) type=StrategyGame;;
721 vapier 1.158 esac
722 vapier 1.159 type="Game;${type}"
723 vapier 1.158 ;;
724    
725 vapier 1.284 gnome)
726     type="Gnome;GTK"
727     ;;
728    
729     kde)
730     type="KDE;Qt"
731     ;;
732    
733 vapier 1.158 mail)
734 vapier 1.159 type="Network;Email"
735 vapier 1.158 ;;
736    
737     media)
738     case ${catmin} in
739 vapier 1.339 gfx)
740     type=Graphics
741     ;;
742     *)
743     case ${catmin} in
744     radio) type=Tuner;;
745     sound) type=Audio;;
746     tv) type=TV;;
747     video) type=Video;;
748     esac
749     type="AudioVideo;${type}"
750     ;;
751 vapier 1.158 esac
752 wolf31o2 1.65 ;;
753 vapier 1.158
754     net)
755     case ${catmin} in
756     dialup) type=Dialup;;
757 vapier 1.338 ftp) type=FileTransfer;;
758     im) type=InstantMessaging;;
759     irc) type=IRCClient;;
760     mail) type=Email;;
761     news) type=News;;
762     nntp) type=News;;
763     p2p) type=FileTransfer;;
764     voip) type=Telephony;;
765 vapier 1.158 esac
766 vapier 1.159 type="Network;${type}"
767 vapier 1.158 ;;
768    
769     sci)
770     case ${catmin} in
771 vapier 1.284 astro*) type=Astronomy;;
772 vapier 1.338 bio*) type=Biology;;
773     calc*) type=Calculator;;
774     chem*) type=Chemistry;;
775 vapier 1.284 elec*) type=Electronics;;
776 vapier 1.338 geo*) type=Geology;;
777     math*) type=Math;;
778 vapier 1.284 physics) type=Physics;;
779     visual*) type=DataVisualization;;
780 vapier 1.159 esac
781 abcd 1.336 type="Education;Science;${type}"
782 vapier 1.158 ;;
783    
784 vapier 1.284 sys)
785     type="System"
786     ;;
787    
788 vapier 1.158 www)
789     case ${catmin} in
790     client) type=WebBrowser;;
791     esac
792 abcd 1.336 type="Network;${type}"
793 azarah 1.59 ;;
794 vapier 1.158
795 azarah 1.59 *)
796     type=
797     ;;
798 vapier 1.39 esac
799     fi
800 carlo 1.177 if [ "${SLOT}" == "0" ] ; then
801     local desktop_name="${PN}"
802     else
803     local desktop_name="${PN}-${SLOT}"
804     fi
805 vapier 1.272 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
806 vapier 1.271 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
807 vapier 1.39
808 abcd 1.336 # Don't append another ";" when a valid category value is provided.
809     type=${type%;}${type:+;}
810    
811     eshopts_push -s extglob
812     if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then
813     ewarn "As described in the Icon Theme Specification, icon file extensions are not"
814     ewarn "allowed in .desktop files if the value is not an absolute path."
815     icon=${icon%.@(xpm|png|svg)}
816     fi
817     eshopts_pop
818    
819 vapier 1.271 cat <<-EOF > "${desktop}"
820     [Desktop Entry]
821     Name=${name}
822     Type=Application
823     Comment=${DESCRIPTION}
824     Exec=${exec}
825     TryExec=${exec%% *}
826     Icon=${icon}
827 abcd 1.336 Categories=${type}
828 vapier 1.271 EOF
829 vapier 1.39
830 vapier 1.341 if [[ ${fields:-=} != *=* ]] ; then
831     # 5th arg used to be value to Path=
832     ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"
833     fields="Path=${fields}"
834     fi
835 vapier 1.342 [[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}"
836 wolf31o2 1.293
837 vapier 1.204 (
838     # wrap the env here so that the 'insinto' call
839     # doesn't corrupt the env of the caller
840     insinto /usr/share/applications
841     doins "${desktop}"
842 vapier 1.340 ) || die "installing desktop file failed"
843 danarmak 1.32 }
844    
845 vapier 1.283 # @FUNCTION: validate_desktop_entries
846     # @USAGE: [directories]
847     # @MAINTAINER:
848     # Carsten Lohrke <carlo@gentoo.org>
849     # @DESCRIPTION:
850 carlo 1.278 # Validate desktop entries using desktop-file-utils
851 carlo 1.277 validate_desktop_entries() {
852     if [[ -x /usr/bin/desktop-file-validate ]] ; then
853     einfo "Checking desktop entry validity"
854     local directories=""
855 carlo 1.279 for d in /usr/share/applications $@ ; do
856     [[ -d ${D}${d} ]] && directories="${directories} ${D}${d}"
857 carlo 1.277 done
858 carlo 1.279 if [[ -n ${directories} ]] ; then
859     for FILE in $(find ${directories} -name "*\.desktop" \
860     -not -path '*.hidden*' | sort -u 2>/dev/null)
861     do
862     local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | \
863     sed -e "s|error: ||" -e "s|${FILE}:|--|g" )
864     [[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:}
865     done
866     fi
867 carlo 1.277 echo ""
868     else
869     einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
870     fi
871     }
872    
873 vapier 1.283 # @FUNCTION: make_session_desktop
874 vapier 1.314 # @USAGE: <title> <command> [command args...]
875 vapier 1.283 # @DESCRIPTION:
876     # Make a GDM/KDM Session file. The title is the file to execute to start the
877     # Window Manager. The command is the name of the Window Manager.
878 vapier 1.314 #
879     # You can set the name of the file via the ${wm} variable.
880 lanius 1.133 make_session_desktop() {
881 vapier 1.314 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
882     [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
883 lanius 1.133
884 vapier 1.167 local title=$1
885     local command=$2
886 vapier 1.314 local desktop=${T}/${wm:-${PN}}.desktop
887     shift 2
888 lanius 1.133
889 vapier 1.271 cat <<-EOF > "${desktop}"
890     [Desktop Entry]
891     Name=${title}
892     Comment=This session logs you into ${title}
893 vapier 1.314 Exec=${command} $*
894 vapier 1.271 TryExec=${command}
895 vapier 1.314 Type=XSession
896 vapier 1.271 EOF
897 lanius 1.133
898 vapier 1.271 (
899     # wrap the env here so that the 'insinto' call
900     # doesn't corrupt the env of the caller
901 lanius 1.133 insinto /usr/share/xsessions
902     doins "${desktop}"
903 vapier 1.271 )
904 lanius 1.133 }
905    
906 vapier 1.283 # @FUNCTION: domenu
907     # @USAGE: <menus>
908     # @DESCRIPTION:
909     # Install the list of .desktop menu files into the appropriate directory
910     # (/usr/share/applications).
911 lanius 1.133 domenu() {
912 vapier 1.271 (
913     # wrap the env here so that the 'insinto' call
914     # doesn't corrupt the env of the caller
915     local i j ret=0
916 lanius 1.133 insinto /usr/share/applications
917 vapier 1.167 for i in "$@" ; do
918     if [[ -f ${i} ]] ; then
919     doins "${i}"
920 vapier 1.271 ((ret+=$?))
921 vapier 1.167 elif [[ -d ${i} ]] ; then
922     for j in "${i}"/*.desktop ; do
923     doins "${j}"
924 vapier 1.271 ((ret+=$?))
925 lanius 1.133 done
926 vapier 1.285 else
927     ((++ret))
928 swegener 1.190 fi
929 lanius 1.133 done
930 vapier 1.271 exit ${ret}
931     )
932 lanius 1.133 }
933 vapier 1.283
934     # @FUNCTION: newmenu
935     # @USAGE: <menu> <newname>
936     # @DESCRIPTION:
937     # Like all other new* functions, install the specified menu as newname.
938 vapier 1.167 newmenu() {
939 vapier 1.271 (
940     # wrap the env here so that the 'insinto' call
941     # doesn't corrupt the env of the caller
942 vapier 1.167 insinto /usr/share/applications
943 vapier 1.271 newins "$@"
944     )
945 vapier 1.167 }
946 lanius 1.133
947 vapier 1.283 # @FUNCTION: doicon
948     # @USAGE: <list of icons>
949     # @DESCRIPTION:
950     # Install the list of icons into the icon directory (/usr/share/pixmaps).
951     # This is useful in conjunction with creating desktop/menu files.
952 lanius 1.133 doicon() {
953 vapier 1.271 (
954     # wrap the env here so that the 'insinto' call
955     # doesn't corrupt the env of the caller
956     local i j ret
957 lanius 1.133 insinto /usr/share/pixmaps
958 vapier 1.167 for i in "$@" ; do
959     if [[ -f ${i} ]] ; then
960     doins "${i}"
961 vapier 1.271 ((ret+=$?))
962 vapier 1.167 elif [[ -d ${i} ]] ; then
963     for j in "${i}"/*.png ; do
964     doins "${j}"
965 vapier 1.271 ((ret+=$?))
966 lanius 1.133 done
967 vapier 1.285 else
968     ((++ret))
969 swegener 1.190 fi
970 lanius 1.133 done
971 vapier 1.271 exit ${ret}
972     )
973 lanius 1.133 }
974 vapier 1.283
975     # @FUNCTION: newicon
976     # @USAGE: <icon> <newname>
977     # @DESCRIPTION:
978     # Like all other new* functions, install the specified icon as newname.
979 vapier 1.167 newicon() {
980 vapier 1.271 (
981     # wrap the env here so that the 'insinto' call
982     # doesn't corrupt the env of the caller
983 vapier 1.167 insinto /usr/share/pixmaps
984 vapier 1.271 newins "$@"
985     )
986 vapier 1.167 }
987 lanius 1.133
988 vapier 1.287 # @FUNCTION: strip-linguas
989     # @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
990     # @DESCRIPTION:
991 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
992 vapier 1.287 # a package can support. The first form allows you to
993     # specify a list of LINGUAS. The -i builds a list of po
994     # files found in all the directories and uses the
995     # intersection of the lists. The -u builds a list of po
996     # files found in all the directories and uses the union
997     # of the lists.
998 vapier 1.92 strip-linguas() {
999 vapier 1.242 local ls newls nols
1000 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1001     local op=$1; shift
1002 vapier 1.315 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1003 vapier 1.92 local d f
1004     for d in "$@" ; do
1005 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1006     newls=${ls}
1007 vapier 1.92 else
1008     newls=""
1009     fi
1010 vapier 1.315 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1011 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1012 ssuominen 1.358 has ${f} ${ls} && newls="${newls} ${f}"
1013 vapier 1.92 else
1014 ssuominen 1.358 has ${f} ${ls} || newls="${newls} ${f}"
1015 vapier 1.92 fi
1016     done
1017 vapier 1.154 ls=${newls}
1018 vapier 1.92 done
1019     else
1020 vapier 1.236 ls="$@"
1021 vapier 1.92 fi
1022    
1023 vapier 1.242 nols=""
1024 vapier 1.92 newls=""
1025     for f in ${LINGUAS} ; do
1026 ssuominen 1.358 if has ${f} ${ls} ; then
1027 vapier 1.120 newls="${newls} ${f}"
1028 vapier 1.92 else
1029 vapier 1.242 nols="${nols} ${f}"
1030 vapier 1.92 fi
1031     done
1032 vapier 1.244 [[ -n ${nols} ]] \
1033 pacho 1.388 && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1034 vapier 1.237 export LINGUAS=${newls:1}
1035 vapier 1.92 }
1036 iggy 1.110
1037 vapier 1.283 # @FUNCTION: preserve_old_lib
1038     # @USAGE: <libs to preserve> [more libs]
1039     # @DESCRIPTION:
1040     # These functions are useful when a lib in your package changes ABI SONAME.
1041     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1042 eradicator 1.111 # would break packages that link against it. Most people get around this
1043     # by using the portage SLOT mechanism, but that is not always a relevant
1044 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1045     # preserve_old_lib_notify function.
1046 eradicator 1.111 preserve_old_lib() {
1047 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1048 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1049 vapier 1.276 die "Invalid preserve_old_lib() usage"
1050 vapier 1.267 fi
1051     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1052    
1053 vapier 1.297 # let portage worry about it
1054     has preserve-libs ${FEATURES} && return 0
1055    
1056 vapier 1.267 local lib dir
1057     for lib in "$@" ; do
1058     [[ -e ${ROOT}/${lib} ]] || continue
1059     dir=${lib%/*}
1060     dodir ${dir} || die "dodir ${dir} failed"
1061     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1062     touch "${D}"/${lib}
1063     done
1064 eradicator 1.111 }
1065    
1066 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1067     # @USAGE: <libs to notify> [more libs]
1068     # @DESCRIPTION:
1069     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1070 eradicator 1.111 preserve_old_lib_notify() {
1071 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1072 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1073 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1074 vapier 1.267 fi
1075    
1076 vapier 1.297 # let portage worry about it
1077     has preserve-libs ${FEATURES} && return 0
1078    
1079 vapier 1.267 local lib notice=0
1080     for lib in "$@" ; do
1081     [[ -e ${ROOT}/${lib} ]] || continue
1082     if [[ ${notice} -eq 0 ]] ; then
1083     notice=1
1084     ewarn "Old versions of installed libraries were detected on your system."
1085     ewarn "In order to avoid breaking packages that depend on these old libs,"
1086     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1087     ewarn "in order to remove these old dependencies. If you do not have this"
1088     ewarn "helper program, simply emerge the 'gentoolkit' package."
1089     ewarn
1090     fi
1091 vapier 1.355 # temp hack for #348634 #357225
1092     [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1093 vapier 1.352 ewarn " # revdep-rebuild --library '${lib}'"
1094 vapier 1.267 done
1095 vapier 1.291 if [[ ${notice} -eq 1 ]] ; then
1096     ewarn
1097     ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1098 vapier 1.300 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1099     for lib in "$@" ; do
1100     ewarn " # rm '${lib}'"
1101     done
1102 vapier 1.291 fi
1103 eradicator 1.111 }
1104 vapier 1.125
1105 vapier 1.283 # @FUNCTION: built_with_use
1106     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1107     # @DESCRIPTION:
1108 betelgeuse 1.329 #
1109     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1110     #
1111 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1112     # flags being enabled in packages. This will check to see if the specified
1113     # DEPEND atom was built with the specified list of USE flags. The
1114     # --missing option controls the behavior if called on a package that does
1115     # not actually support the defined USE flags (aka listed in IUSE).
1116     # The default is to abort (call die). The -a and -o flags control
1117     # the requirements of the USE flags. They correspond to "and" and "or"
1118     # logic. So the -a flag means all listed USE flags must be enabled
1119 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1120 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1121     # means the USE flag we're checking is hidden expanded, so it won't be found
1122     # in IUSE like normal USE flags.
1123 swegener 1.286 #
1124 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1125     # flags matter.
1126 vapier 1.125 built_with_use() {
1127 vapier 1.275 local hidden="no"
1128     if [[ $1 == "--hidden" ]] ; then
1129     hidden="yes"
1130     shift
1131     fi
1132    
1133 vapier 1.269 local missing_action="die"
1134     if [[ $1 == "--missing" ]] ; then
1135     missing_action=$2
1136     shift ; shift
1137     case ${missing_action} in
1138     true|false|die) ;;
1139     *) die "unknown action '${missing_action}'";;
1140     esac
1141     fi
1142    
1143 vapier 1.130 local opt=$1
1144     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1145    
1146     local PKG=$(best_version $1)
1147 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1148 vapier 1.130 shift
1149    
1150 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1151 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1152 vapier 1.213
1153 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1154     # this gracefully
1155 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1156 cardoe 1.273 case ${missing_action} in
1157     true) return 0;;
1158     false) return 1;;
1159     die) die "Unable to determine what USE flags $PKG was built with";;
1160     esac
1161     fi
1162    
1163 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1164 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1165 vapier 1.275 # Don't check USE_EXPAND #147237
1166     local expand
1167     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1168     if [[ $1 == ${expand}_* ]] ; then
1169     expand=""
1170     break
1171     fi
1172     done
1173     if [[ -n ${expand} ]] ; then
1174 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1175 vapier 1.275 case ${missing_action} in
1176     true) return 0;;
1177     false) return 1;;
1178     die) die "$PKG does not actually support the $1 USE flag!";;
1179     esac
1180     fi
1181 vapier 1.269 fi
1182 vapier 1.250 fi
1183 vapier 1.249
1184 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1185 vapier 1.130 while [[ $# -gt 0 ]] ; do
1186     if [[ ${opt} = "-o" ]] ; then
1187     has $1 ${USE_BUILT} && return 0
1188     else
1189     has $1 ${USE_BUILT} || return 1
1190     fi
1191 vapier 1.125 shift
1192     done
1193 vapier 1.130 [[ ${opt} = "-a" ]]
1194 vapier 1.125 }
1195 vapier 1.126
1196 vapier 1.289 # @FUNCTION: epunt_cxx
1197 vapier 1.283 # @USAGE: [dir to scan]
1198     # @DESCRIPTION:
1199     # Many configure scripts wrongly bail when a C++ compiler could not be
1200     # detected. If dir is not specified, then it defaults to ${S}.
1201     #
1202     # http://bugs.gentoo.org/73450
1203 vapier 1.126 epunt_cxx() {
1204 vapier 1.127 local dir=$1
1205     [[ -z ${dir} ]] && dir=${S}
1206     ebegin "Removing useless C++ checks"
1207     local f
1208 vapier 1.294 find "${dir}" -name configure | while read f ; do
1209     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1210 vapier 1.127 done
1211     eend 0
1212 vapier 1.126 }
1213 ka0ttic 1.143
1214 vapier 1.283 # @FUNCTION: make_wrapper
1215 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1216 vapier 1.283 # @DESCRIPTION:
1217     # Create a shell wrapper script named wrapper in installpath
1218     # (defaults to the bindir) to execute target (default of wrapper) by
1219     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1220     # libpaths followed by optionally changing directory to chdir.
1221 wolf31o2 1.160 make_wrapper() {
1222 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1223 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1224 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1225     # things as $bin ... "./someprog --args"
1226 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1227     #!/bin/sh
1228 vapier 1.201 cd "${chdir:-.}"
1229 vapier 1.210 if [ -n "${libdir}" ] ; then
1230     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1231     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1232     else
1233     export LD_LIBRARY_PATH="${libdir}"
1234     fi
1235 vapier 1.201 fi
1236 vapier 1.202 exec ${bin} "\$@"
1237 wolf31o2 1.160 EOF
1238     chmod go+rx "${tmpwrapper}"
1239 vapier 1.201 if [[ -n ${path} ]] ; then
1240 vapier 1.283 (
1241 vapier 1.201 exeinto "${path}"
1242 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1243 vapier 1.283 ) || die
1244 wolf31o2 1.164 else
1245 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1246 wolf31o2 1.164 fi
1247 wolf31o2 1.160 }
1248 mr_bones_ 1.311
1249 vapier 1.351 # @FUNCTION: path_exists
1250     # @USAGE: [-a|-o] <paths>
1251     # @DESCRIPTION:
1252     # Check if the specified paths exist. Works for all types of paths
1253     # (files/dirs/etc...). The -a and -o flags control the requirements
1254     # of the paths. They correspond to "and" and "or" logic. So the -a
1255     # flag means all the paths must exist while the -o flag means at least
1256     # one of the paths must exist. The default behavior is "and". If no
1257     # paths are specified, then the return value is "false".
1258     path_exists() {
1259     local opt=$1
1260     [[ ${opt} == -[ao] ]] && shift || opt="-a"
1261    
1262     # no paths -> return false
1263     # same behavior as: [[ -e "" ]]
1264     [[ $# -eq 0 ]] && return 1
1265    
1266     local p r=0
1267     for p in "$@" ; do
1268     [[ -e ${p} ]]
1269     : $(( r += $? ))
1270     done
1271    
1272     case ${opt} in
1273     -a) return $(( r != 0 )) ;;
1274     -o) return $(( r == $# )) ;;
1275     esac
1276     }
1277 mgorny 1.364
1278     # @FUNCTION: in_iuse
1279     # @USAGE: <flag>
1280     # @DESCRIPTION:
1281     # Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1282     # as necessary.
1283     #
1284     # Note that this function should not be used in the global scope.
1285     in_iuse() {
1286     debug-print-function ${FUNCNAME} "${@}"
1287     [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1288    
1289     local flag=${1}
1290     local liuse=( ${IUSE} )
1291    
1292     has "${flag}" "${liuse[@]#[+-]}"
1293     }
1294 vapier 1.365
1295 vapier 1.367 # @FUNCTION: use_if_iuse
1296     # @USAGE: <flag>
1297     # @DESCRIPTION:
1298     # Return true if the given flag is in USE and IUSE.
1299     #
1300     # Note that this function should not be used in the global scope.
1301     use_if_iuse() {
1302     in_iuse $1 || return 1
1303     use $1
1304     }
1305    
1306 vapier 1.365 # @FUNCTION: usex
1307     # @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1308     # @DESCRIPTION:
1309     # If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1310     # otherwise echo [false output][false suffix] (defaults to "no").
1311     usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1312 vapier 1.371
1313 vapier 1.389 # @FUNCTION: makeopts_jobs
1314     # @USAGE: [${MAKEOPTS}]
1315     # @DESCRIPTION:
1316     # Searches the arguments (defaults to ${MAKEOPTS}) and extracts the jobs number
1317 vapier 1.392 # specified therein. Useful for running non-make tools in parallel too.
1318     # i.e. if the user has MAKEOPTS=-j9, this will show "9".
1319 vapier 1.389 # We can't return the number as bash normalizes it to [0, 255]. If the flags
1320 vapier 1.390 # haven't specified a -j flag, then "1" is shown as that is the default `make`
1321 vapier 1.392 # uses. Since there's no way to represent infinity, we return 999 if the user
1322     # has -j without a number.
1323 vapier 1.389 makeopts_jobs() {
1324     [[ $# -eq 0 ]] && set -- ${MAKEOPTS}
1325 vapier 1.392 # This assumes the first .* will be more greedy than the second .*
1326     # since POSIX doesn't specify a non-greedy match (i.e. ".*?").
1327     local jobs=$(echo " $* " | sed -r -n \
1328     -e 's:.*[[:space:]](-j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' \
1329     -e 's:.*[[:space:]](-j|--jobs)[[:space:]].*:999:p')
1330 vapier 1.389 echo ${jobs:-1}
1331     }
1332    
1333 vapier 1.372 check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1334    
1335 vapier 1.371 fi

  ViewVC Help
Powered by ViewVC 1.1.20