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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.393 - (hide annotations) (download)
Mon May 28 16:45:57 2012 UTC (2 years, 6 months ago) by phajdan.jr
Branch: MAIN
Changes since 1.392: +2 -10 lines
Simplify preserve_old_lib ewarn messages, wrt http://archives.gentoo.org/gentoo-dev/msg_bf159af028ffeeb83c679d6a0eaa73e5.xml . gentoolkit-0.3.0.5 fixing problems blocking this change is now stable on all archs (bug #411479).

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 phajdan.jr 1.393 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.392 2012/05/11 14:22:01 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 phajdan.jr 1.393 ewarn " # revdep-rebuild --library '${lib}' && rm '${lib}'"
1094 vapier 1.267 done
1095 eradicator 1.111 }
1096 vapier 1.125
1097 vapier 1.283 # @FUNCTION: built_with_use
1098     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1099     # @DESCRIPTION:
1100 betelgeuse 1.329 #
1101     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1102     #
1103 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1104     # flags being enabled in packages. This will check to see if the specified
1105     # DEPEND atom was built with the specified list of USE flags. The
1106     # --missing option controls the behavior if called on a package that does
1107     # not actually support the defined USE flags (aka listed in IUSE).
1108     # The default is to abort (call die). The -a and -o flags control
1109     # the requirements of the USE flags. They correspond to "and" and "or"
1110     # logic. So the -a flag means all listed USE flags must be enabled
1111 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1112 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1113     # means the USE flag we're checking is hidden expanded, so it won't be found
1114     # in IUSE like normal USE flags.
1115 swegener 1.286 #
1116 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1117     # flags matter.
1118 vapier 1.125 built_with_use() {
1119 vapier 1.275 local hidden="no"
1120     if [[ $1 == "--hidden" ]] ; then
1121     hidden="yes"
1122     shift
1123     fi
1124    
1125 vapier 1.269 local missing_action="die"
1126     if [[ $1 == "--missing" ]] ; then
1127     missing_action=$2
1128     shift ; shift
1129     case ${missing_action} in
1130     true|false|die) ;;
1131     *) die "unknown action '${missing_action}'";;
1132     esac
1133     fi
1134    
1135 vapier 1.130 local opt=$1
1136     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1137    
1138     local PKG=$(best_version $1)
1139 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1140 vapier 1.130 shift
1141    
1142 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1143 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1144 vapier 1.213
1145 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1146     # this gracefully
1147 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1148 cardoe 1.273 case ${missing_action} in
1149     true) return 0;;
1150     false) return 1;;
1151     die) die "Unable to determine what USE flags $PKG was built with";;
1152     esac
1153     fi
1154    
1155 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1156 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1157 vapier 1.275 # Don't check USE_EXPAND #147237
1158     local expand
1159     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1160     if [[ $1 == ${expand}_* ]] ; then
1161     expand=""
1162     break
1163     fi
1164     done
1165     if [[ -n ${expand} ]] ; then
1166 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1167 vapier 1.275 case ${missing_action} in
1168     true) return 0;;
1169     false) return 1;;
1170     die) die "$PKG does not actually support the $1 USE flag!";;
1171     esac
1172     fi
1173 vapier 1.269 fi
1174 vapier 1.250 fi
1175 vapier 1.249
1176 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1177 vapier 1.130 while [[ $# -gt 0 ]] ; do
1178     if [[ ${opt} = "-o" ]] ; then
1179     has $1 ${USE_BUILT} && return 0
1180     else
1181     has $1 ${USE_BUILT} || return 1
1182     fi
1183 vapier 1.125 shift
1184     done
1185 vapier 1.130 [[ ${opt} = "-a" ]]
1186 vapier 1.125 }
1187 vapier 1.126
1188 vapier 1.289 # @FUNCTION: epunt_cxx
1189 vapier 1.283 # @USAGE: [dir to scan]
1190     # @DESCRIPTION:
1191     # Many configure scripts wrongly bail when a C++ compiler could not be
1192     # detected. If dir is not specified, then it defaults to ${S}.
1193     #
1194     # http://bugs.gentoo.org/73450
1195 vapier 1.126 epunt_cxx() {
1196 vapier 1.127 local dir=$1
1197     [[ -z ${dir} ]] && dir=${S}
1198     ebegin "Removing useless C++ checks"
1199     local f
1200 vapier 1.294 find "${dir}" -name configure | while read f ; do
1201     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1202 vapier 1.127 done
1203     eend 0
1204 vapier 1.126 }
1205 ka0ttic 1.143
1206 vapier 1.283 # @FUNCTION: make_wrapper
1207 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1208 vapier 1.283 # @DESCRIPTION:
1209     # Create a shell wrapper script named wrapper in installpath
1210     # (defaults to the bindir) to execute target (default of wrapper) by
1211     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1212     # libpaths followed by optionally changing directory to chdir.
1213 wolf31o2 1.160 make_wrapper() {
1214 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1215 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1216 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1217     # things as $bin ... "./someprog --args"
1218 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1219     #!/bin/sh
1220 vapier 1.201 cd "${chdir:-.}"
1221 vapier 1.210 if [ -n "${libdir}" ] ; then
1222     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1223     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1224     else
1225     export LD_LIBRARY_PATH="${libdir}"
1226     fi
1227 vapier 1.201 fi
1228 vapier 1.202 exec ${bin} "\$@"
1229 wolf31o2 1.160 EOF
1230     chmod go+rx "${tmpwrapper}"
1231 vapier 1.201 if [[ -n ${path} ]] ; then
1232 vapier 1.283 (
1233 vapier 1.201 exeinto "${path}"
1234 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1235 vapier 1.283 ) || die
1236 wolf31o2 1.164 else
1237 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1238 wolf31o2 1.164 fi
1239 wolf31o2 1.160 }
1240 mr_bones_ 1.311
1241 vapier 1.351 # @FUNCTION: path_exists
1242     # @USAGE: [-a|-o] <paths>
1243     # @DESCRIPTION:
1244     # Check if the specified paths exist. Works for all types of paths
1245     # (files/dirs/etc...). The -a and -o flags control the requirements
1246     # of the paths. They correspond to "and" and "or" logic. So the -a
1247     # flag means all the paths must exist while the -o flag means at least
1248     # one of the paths must exist. The default behavior is "and". If no
1249     # paths are specified, then the return value is "false".
1250     path_exists() {
1251     local opt=$1
1252     [[ ${opt} == -[ao] ]] && shift || opt="-a"
1253    
1254     # no paths -> return false
1255     # same behavior as: [[ -e "" ]]
1256     [[ $# -eq 0 ]] && return 1
1257    
1258     local p r=0
1259     for p in "$@" ; do
1260     [[ -e ${p} ]]
1261     : $(( r += $? ))
1262     done
1263    
1264     case ${opt} in
1265     -a) return $(( r != 0 )) ;;
1266     -o) return $(( r == $# )) ;;
1267     esac
1268     }
1269 mgorny 1.364
1270     # @FUNCTION: in_iuse
1271     # @USAGE: <flag>
1272     # @DESCRIPTION:
1273     # Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1274     # as necessary.
1275     #
1276     # Note that this function should not be used in the global scope.
1277     in_iuse() {
1278     debug-print-function ${FUNCNAME} "${@}"
1279     [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1280    
1281     local flag=${1}
1282     local liuse=( ${IUSE} )
1283    
1284     has "${flag}" "${liuse[@]#[+-]}"
1285     }
1286 vapier 1.365
1287 vapier 1.367 # @FUNCTION: use_if_iuse
1288     # @USAGE: <flag>
1289     # @DESCRIPTION:
1290     # Return true if the given flag is in USE and IUSE.
1291     #
1292     # Note that this function should not be used in the global scope.
1293     use_if_iuse() {
1294     in_iuse $1 || return 1
1295     use $1
1296     }
1297    
1298 vapier 1.365 # @FUNCTION: usex
1299     # @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1300     # @DESCRIPTION:
1301     # If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1302     # otherwise echo [false output][false suffix] (defaults to "no").
1303     usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1304 vapier 1.371
1305 vapier 1.389 # @FUNCTION: makeopts_jobs
1306     # @USAGE: [${MAKEOPTS}]
1307     # @DESCRIPTION:
1308     # Searches the arguments (defaults to ${MAKEOPTS}) and extracts the jobs number
1309 vapier 1.392 # specified therein. Useful for running non-make tools in parallel too.
1310     # i.e. if the user has MAKEOPTS=-j9, this will show "9".
1311 vapier 1.389 # We can't return the number as bash normalizes it to [0, 255]. If the flags
1312 vapier 1.390 # haven't specified a -j flag, then "1" is shown as that is the default `make`
1313 vapier 1.392 # uses. Since there's no way to represent infinity, we return 999 if the user
1314     # has -j without a number.
1315 vapier 1.389 makeopts_jobs() {
1316     [[ $# -eq 0 ]] && set -- ${MAKEOPTS}
1317 vapier 1.392 # This assumes the first .* will be more greedy than the second .*
1318     # since POSIX doesn't specify a non-greedy match (i.e. ".*?").
1319     local jobs=$(echo " $* " | sed -r -n \
1320     -e 's:.*[[:space:]](-j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' \
1321     -e 's:.*[[:space:]](-j|--jobs)[[:space:]].*:999:p')
1322 vapier 1.389 echo ${jobs:-1}
1323     }
1324    
1325 vapier 1.372 check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1326    
1327 vapier 1.371 fi

  ViewVC Help
Powered by ViewVC 1.1.20