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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.395 - (hide annotations) (download)
Wed Jun 6 15:37:50 2012 UTC (2 years, 3 months ago) by mgorny
Branch: MAIN
Changes since 1.394: +96 -2 lines
Introduce prune_libtool_files() for .la file removal. Based on one used by autotools-utils.

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 mgorny 1.395 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.394 2012/06/05 17:40:12 hasufell 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 mgorny 1.395 inherit multilib toolchain-funcs 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 hasufell 1.394 # @FUNCTION: _iconins
948     # @INTERNAL
949 vapier 1.283 # @DESCRIPTION:
950 hasufell 1.394 # function for use in doicon and newicon
951     _iconins() {
952 vapier 1.271 (
953     # wrap the env here so that the 'insinto' call
954     # doesn't corrupt the env of the caller
955 hasufell 1.394 local funcname=$1; shift
956     local size dir
957     local context=apps
958     local theme=hicolor
959    
960     while [[ $# -gt 0 ]] ; do
961     case $1 in
962     -s|--size)
963     if [[ ${2%%x*}x${2%%x*} == "$2" ]] ; then
964     size=${2%%x*}
965     else
966     size=${2}
967     fi
968     case ${size} in
969     16|22|24|32|36|48|64|72|96|128|192|256)
970     size=${size}x${size};;
971     scalable)
972     ;;
973     *)
974     eerror "${size} is an unsupported icon size!"
975     exit 1;;
976     esac
977     shift 2;;
978     -t|--theme)
979     theme=${2}
980     shift 2;;
981     -c|--context)
982     context=${2}
983     shift 2;;
984     *)
985     if [[ -z ${size} ]] ; then
986     insinto /usr/share/pixmaps
987     else
988     insinto /usr/share/icons/${theme}/${size}/${context}
989     fi
990    
991     if [[ ${funcname} == doicon ]] ; then
992     if [[ -f $1 ]] ; then
993     doins "${1}"
994     elif [[ -d $1 ]] ; then
995     shopt -s nullglob
996     doins "${1}"/*.{png,svg}
997     shopt -u nullglob
998     else
999     eerror "${1} is not a valid file/directory!"
1000     exit 1
1001     fi
1002     else
1003     break
1004     fi
1005     shift 1;;
1006     esac
1007 lanius 1.133 done
1008 hasufell 1.394 if [[ ${funcname} == newicon ]] ; then
1009     newins "$@"
1010     fi
1011     ) || die
1012     }
1013    
1014     # @FUNCTION: doicon
1015     # @USAGE: [options] <icons>
1016     # @DESCRIPTION:
1017     # Install icon into the icon directory /usr/share/icons or into
1018     # /usr/share/pixmaps if "--size" is not set.
1019     # This is useful in conjunction with creating desktop/menu files.
1020     #
1021     # @CODE
1022     # options:
1023     # -s, --size
1024     # !!! must specify to install into /usr/share/icons/... !!!
1025     # size of the icon, like 48 or 48x48
1026     # supported icon sizes are:
1027     # 16 22 24 32 36 48 64 72 96 128 192 256 scalable
1028     # -c, --context
1029     # defaults to "apps"
1030     # -t, --theme
1031     # defaults to "hicolor"
1032     #
1033     # icons: list of icons
1034     #
1035     # example 1: doicon foobar.png fuqbar.svg
1036     # results in: insinto /usr/share/pixmaps
1037     # doins foobar.png fuqbar.svg
1038     #
1039     # example 2: doicon -s 48 foobar.png fuqbar.png
1040     # results in: insinto /usr/share/icons/hicolor/48x48/apps
1041     # doins foobar.png fuqbar.png
1042     # @CODE
1043     doicon() {
1044     _iconins ${FUNCNAME} "$@"
1045 lanius 1.133 }
1046 vapier 1.283
1047     # @FUNCTION: newicon
1048 hasufell 1.394 # @USAGE: [options] <icon> <newname>
1049 vapier 1.283 # @DESCRIPTION:
1050 hasufell 1.394 # Like doicon, install the specified icon as newname.
1051     #
1052     # @CODE
1053     # example 1: newicon foobar.png NEWNAME.png
1054     # results in: insinto /usr/share/pixmaps
1055     # newins foobar.png NEWNAME.png
1056     #
1057     # example 2: newicon -s 48 foobar.png NEWNAME.png
1058     # results in: insinto /usr/share/icons/hicolor/48x48/apps
1059     # newins foobar.png NEWNAME.png
1060     # @CODE
1061 vapier 1.167 newicon() {
1062 hasufell 1.394 _iconins ${FUNCNAME} "$@"
1063 vapier 1.167 }
1064 lanius 1.133
1065 vapier 1.287 # @FUNCTION: strip-linguas
1066     # @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1067     # @DESCRIPTION:
1068 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1069 vapier 1.287 # a package can support. The first form allows you to
1070     # specify a list of LINGUAS. The -i builds a list of po
1071     # files found in all the directories and uses the
1072     # intersection of the lists. The -u builds a list of po
1073     # files found in all the directories and uses the union
1074     # of the lists.
1075 vapier 1.92 strip-linguas() {
1076 vapier 1.242 local ls newls nols
1077 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1078     local op=$1; shift
1079 vapier 1.315 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1080 vapier 1.92 local d f
1081     for d in "$@" ; do
1082 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1083     newls=${ls}
1084 vapier 1.92 else
1085     newls=""
1086     fi
1087 vapier 1.315 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1088 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1089 ssuominen 1.358 has ${f} ${ls} && newls="${newls} ${f}"
1090 vapier 1.92 else
1091 ssuominen 1.358 has ${f} ${ls} || newls="${newls} ${f}"
1092 vapier 1.92 fi
1093     done
1094 vapier 1.154 ls=${newls}
1095 vapier 1.92 done
1096     else
1097 vapier 1.236 ls="$@"
1098 vapier 1.92 fi
1099    
1100 vapier 1.242 nols=""
1101 vapier 1.92 newls=""
1102     for f in ${LINGUAS} ; do
1103 ssuominen 1.358 if has ${f} ${ls} ; then
1104 vapier 1.120 newls="${newls} ${f}"
1105 vapier 1.92 else
1106 vapier 1.242 nols="${nols} ${f}"
1107 vapier 1.92 fi
1108     done
1109 vapier 1.244 [[ -n ${nols} ]] \
1110 pacho 1.388 && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1111 vapier 1.237 export LINGUAS=${newls:1}
1112 vapier 1.92 }
1113 iggy 1.110
1114 vapier 1.283 # @FUNCTION: preserve_old_lib
1115     # @USAGE: <libs to preserve> [more libs]
1116     # @DESCRIPTION:
1117     # These functions are useful when a lib in your package changes ABI SONAME.
1118     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1119 eradicator 1.111 # would break packages that link against it. Most people get around this
1120     # by using the portage SLOT mechanism, but that is not always a relevant
1121 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1122     # preserve_old_lib_notify function.
1123 eradicator 1.111 preserve_old_lib() {
1124 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1125 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1126 vapier 1.276 die "Invalid preserve_old_lib() usage"
1127 vapier 1.267 fi
1128     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1129    
1130 vapier 1.297 # let portage worry about it
1131     has preserve-libs ${FEATURES} && return 0
1132    
1133 vapier 1.267 local lib dir
1134     for lib in "$@" ; do
1135     [[ -e ${ROOT}/${lib} ]] || continue
1136     dir=${lib%/*}
1137     dodir ${dir} || die "dodir ${dir} failed"
1138     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1139     touch "${D}"/${lib}
1140     done
1141 eradicator 1.111 }
1142    
1143 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1144     # @USAGE: <libs to notify> [more libs]
1145     # @DESCRIPTION:
1146     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1147 eradicator 1.111 preserve_old_lib_notify() {
1148 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1149 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1150 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1151 vapier 1.267 fi
1152    
1153 vapier 1.297 # let portage worry about it
1154     has preserve-libs ${FEATURES} && return 0
1155    
1156 vapier 1.267 local lib notice=0
1157     for lib in "$@" ; do
1158     [[ -e ${ROOT}/${lib} ]] || continue
1159     if [[ ${notice} -eq 0 ]] ; then
1160     notice=1
1161     ewarn "Old versions of installed libraries were detected on your system."
1162     ewarn "In order to avoid breaking packages that depend on these old libs,"
1163     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1164     ewarn "in order to remove these old dependencies. If you do not have this"
1165     ewarn "helper program, simply emerge the 'gentoolkit' package."
1166     ewarn
1167     fi
1168 vapier 1.355 # temp hack for #348634 #357225
1169     [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1170 phajdan.jr 1.393 ewarn " # revdep-rebuild --library '${lib}' && rm '${lib}'"
1171 vapier 1.267 done
1172 eradicator 1.111 }
1173 vapier 1.125
1174 vapier 1.283 # @FUNCTION: built_with_use
1175     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1176     # @DESCRIPTION:
1177 betelgeuse 1.329 #
1178     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1179     #
1180 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1181     # flags being enabled in packages. This will check to see if the specified
1182     # DEPEND atom was built with the specified list of USE flags. The
1183     # --missing option controls the behavior if called on a package that does
1184     # not actually support the defined USE flags (aka listed in IUSE).
1185     # The default is to abort (call die). The -a and -o flags control
1186     # the requirements of the USE flags. They correspond to "and" and "or"
1187     # logic. So the -a flag means all listed USE flags must be enabled
1188 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1189 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1190     # means the USE flag we're checking is hidden expanded, so it won't be found
1191     # in IUSE like normal USE flags.
1192 swegener 1.286 #
1193 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1194     # flags matter.
1195 vapier 1.125 built_with_use() {
1196 vapier 1.275 local hidden="no"
1197     if [[ $1 == "--hidden" ]] ; then
1198     hidden="yes"
1199     shift
1200     fi
1201    
1202 vapier 1.269 local missing_action="die"
1203     if [[ $1 == "--missing" ]] ; then
1204     missing_action=$2
1205     shift ; shift
1206     case ${missing_action} in
1207     true|false|die) ;;
1208     *) die "unknown action '${missing_action}'";;
1209     esac
1210     fi
1211    
1212 vapier 1.130 local opt=$1
1213     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1214    
1215     local PKG=$(best_version $1)
1216 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1217 vapier 1.130 shift
1218    
1219 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1220 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1221 vapier 1.213
1222 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1223     # this gracefully
1224 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1225 cardoe 1.273 case ${missing_action} in
1226     true) return 0;;
1227     false) return 1;;
1228     die) die "Unable to determine what USE flags $PKG was built with";;
1229     esac
1230     fi
1231    
1232 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1233 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1234 vapier 1.275 # Don't check USE_EXPAND #147237
1235     local expand
1236     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1237     if [[ $1 == ${expand}_* ]] ; then
1238     expand=""
1239     break
1240     fi
1241     done
1242     if [[ -n ${expand} ]] ; then
1243 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1244 vapier 1.275 case ${missing_action} in
1245     true) return 0;;
1246     false) return 1;;
1247     die) die "$PKG does not actually support the $1 USE flag!";;
1248     esac
1249     fi
1250 vapier 1.269 fi
1251 vapier 1.250 fi
1252 vapier 1.249
1253 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1254 vapier 1.130 while [[ $# -gt 0 ]] ; do
1255     if [[ ${opt} = "-o" ]] ; then
1256     has $1 ${USE_BUILT} && return 0
1257     else
1258     has $1 ${USE_BUILT} || return 1
1259     fi
1260 vapier 1.125 shift
1261     done
1262 vapier 1.130 [[ ${opt} = "-a" ]]
1263 vapier 1.125 }
1264 vapier 1.126
1265 vapier 1.289 # @FUNCTION: epunt_cxx
1266 vapier 1.283 # @USAGE: [dir to scan]
1267     # @DESCRIPTION:
1268     # Many configure scripts wrongly bail when a C++ compiler could not be
1269     # detected. If dir is not specified, then it defaults to ${S}.
1270     #
1271     # http://bugs.gentoo.org/73450
1272 vapier 1.126 epunt_cxx() {
1273 vapier 1.127 local dir=$1
1274     [[ -z ${dir} ]] && dir=${S}
1275     ebegin "Removing useless C++ checks"
1276     local f
1277 vapier 1.294 find "${dir}" -name configure | while read f ; do
1278     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1279 vapier 1.127 done
1280     eend 0
1281 vapier 1.126 }
1282 ka0ttic 1.143
1283 vapier 1.283 # @FUNCTION: make_wrapper
1284 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1285 vapier 1.283 # @DESCRIPTION:
1286     # Create a shell wrapper script named wrapper in installpath
1287     # (defaults to the bindir) to execute target (default of wrapper) by
1288     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1289     # libpaths followed by optionally changing directory to chdir.
1290 wolf31o2 1.160 make_wrapper() {
1291 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1292 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1293 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1294     # things as $bin ... "./someprog --args"
1295 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1296     #!/bin/sh
1297 vapier 1.201 cd "${chdir:-.}"
1298 vapier 1.210 if [ -n "${libdir}" ] ; then
1299     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1300     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1301     else
1302     export LD_LIBRARY_PATH="${libdir}"
1303     fi
1304 vapier 1.201 fi
1305 vapier 1.202 exec ${bin} "\$@"
1306 wolf31o2 1.160 EOF
1307     chmod go+rx "${tmpwrapper}"
1308 vapier 1.201 if [[ -n ${path} ]] ; then
1309 vapier 1.283 (
1310 vapier 1.201 exeinto "${path}"
1311 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1312 vapier 1.283 ) || die
1313 wolf31o2 1.164 else
1314 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1315 wolf31o2 1.164 fi
1316 wolf31o2 1.160 }
1317 mr_bones_ 1.311
1318 vapier 1.351 # @FUNCTION: path_exists
1319     # @USAGE: [-a|-o] <paths>
1320     # @DESCRIPTION:
1321     # Check if the specified paths exist. Works for all types of paths
1322     # (files/dirs/etc...). The -a and -o flags control the requirements
1323     # of the paths. They correspond to "and" and "or" logic. So the -a
1324     # flag means all the paths must exist while the -o flag means at least
1325     # one of the paths must exist. The default behavior is "and". If no
1326     # paths are specified, then the return value is "false".
1327     path_exists() {
1328     local opt=$1
1329     [[ ${opt} == -[ao] ]] && shift || opt="-a"
1330    
1331     # no paths -> return false
1332     # same behavior as: [[ -e "" ]]
1333     [[ $# -eq 0 ]] && return 1
1334    
1335     local p r=0
1336     for p in "$@" ; do
1337     [[ -e ${p} ]]
1338     : $(( r += $? ))
1339     done
1340    
1341     case ${opt} in
1342     -a) return $(( r != 0 )) ;;
1343     -o) return $(( r == $# )) ;;
1344     esac
1345     }
1346 mgorny 1.364
1347     # @FUNCTION: in_iuse
1348     # @USAGE: <flag>
1349     # @DESCRIPTION:
1350     # Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1351     # as necessary.
1352     #
1353     # Note that this function should not be used in the global scope.
1354     in_iuse() {
1355     debug-print-function ${FUNCNAME} "${@}"
1356     [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1357    
1358     local flag=${1}
1359     local liuse=( ${IUSE} )
1360    
1361     has "${flag}" "${liuse[@]#[+-]}"
1362     }
1363 vapier 1.365
1364 vapier 1.367 # @FUNCTION: use_if_iuse
1365     # @USAGE: <flag>
1366     # @DESCRIPTION:
1367     # Return true if the given flag is in USE and IUSE.
1368     #
1369     # Note that this function should not be used in the global scope.
1370     use_if_iuse() {
1371     in_iuse $1 || return 1
1372     use $1
1373     }
1374    
1375 vapier 1.365 # @FUNCTION: usex
1376     # @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1377     # @DESCRIPTION:
1378     # If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1379     # otherwise echo [false output][false suffix] (defaults to "no").
1380     usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1381 vapier 1.371
1382 vapier 1.389 # @FUNCTION: makeopts_jobs
1383     # @USAGE: [${MAKEOPTS}]
1384     # @DESCRIPTION:
1385     # Searches the arguments (defaults to ${MAKEOPTS}) and extracts the jobs number
1386 vapier 1.392 # specified therein. Useful for running non-make tools in parallel too.
1387     # i.e. if the user has MAKEOPTS=-j9, this will show "9".
1388 vapier 1.389 # We can't return the number as bash normalizes it to [0, 255]. If the flags
1389 vapier 1.390 # haven't specified a -j flag, then "1" is shown as that is the default `make`
1390 vapier 1.392 # uses. Since there's no way to represent infinity, we return 999 if the user
1391     # has -j without a number.
1392 vapier 1.389 makeopts_jobs() {
1393     [[ $# -eq 0 ]] && set -- ${MAKEOPTS}
1394 vapier 1.392 # This assumes the first .* will be more greedy than the second .*
1395     # since POSIX doesn't specify a non-greedy match (i.e. ".*?").
1396     local jobs=$(echo " $* " | sed -r -n \
1397     -e 's:.*[[:space:]](-j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' \
1398     -e 's:.*[[:space:]](-j|--jobs)[[:space:]].*:999:p')
1399 vapier 1.389 echo ${jobs:-1}
1400     }
1401    
1402 mgorny 1.395 # @FUNCTION: prune_libtool_files
1403     # @USAGE: [--all]
1404     # @DESCRIPTION:
1405     # Locate unnecessary libtool files (.la) and libtool static archives
1406     # (.a) and remove them from installation image.
1407     #
1408     # By default, .la files are removed whenever the static linkage can
1409     # either be performed using pkg-config or doesn't introduce additional
1410     # flags.
1411     #
1412     # If '--all' argument is passed, all .la files are removed. This is
1413     # usually useful when the package installs plugins and does not use .la
1414     # files for loading them.
1415     #
1416     # The .a files are only removed whenever corresponding .la files state
1417     # that they should not be linked to, i.e. whenever these files
1418     # correspond to plugins.
1419     #
1420     # Note: if your package installs any .pc files, this function implicitly
1421     # calls pkg-config. You should add it to your DEPEND in that case.
1422     prune_libtool_files() {
1423     debug-print-function ${FUNCNAME} "$@"
1424    
1425     local removing_all opt
1426     for opt; do
1427     case "${opt}" in
1428     --all)
1429     removing_all=1
1430     ;;
1431     *)
1432     die "Invalid argument to ${FUNCNAME}(): ${opt}"
1433     esac
1434     done
1435    
1436     # Create a list of all .pc-covered libs.
1437     local pc_libs=()
1438     if [[ ! ${removing_all} ]]; then
1439     local f
1440     local tf=${T}/prune-lt-files.pc
1441     local pkgconf=$(tc-getPKG_CONFIG)
1442    
1443     while IFS= read -r -d '' f; do # for all .pc files
1444     local arg
1445    
1446     sed -e '/^Requires:/d' "${f}" > "${tf}"
1447     for arg in $("${pkgconf}" --libs "${tf}"); do
1448     [[ ${arg} == -l* ]] && pc_libs+=( lib${arg#-l}.la )
1449     done
1450     done < <(find "${D}" -type f -name '*.pc' -print0)
1451    
1452     rm -f "${tf}"
1453     fi
1454    
1455     local f
1456     while IFS= read -r -d '' f; do # for all .la files
1457     local archivefile=${f/%.la/.a}
1458    
1459     [[ ${f} != ${archivefile} ]] || die 'regex sanity check failed'
1460    
1461     # Remove static libs we're not supposed to link against.
1462     if grep -q '^shouldnotlink=yes$' "${f}"; then
1463     einfo "Removing unnecessary ${archivefile#${D%/}}"
1464     rm -f "${archivefile}"
1465    
1466     # The .la file may be used by a module loader, so avoid removing it
1467     # unless explicitly requested.
1468     [[ ${removing_all} ]] || continue
1469     fi
1470    
1471     # Remove .la files when:
1472     # - user explicitly wants us to remove all .la files,
1473     # - respective static archive doesn't exist,
1474     # - they are covered by a .pc file already,
1475     # - they don't provide any new information (no libs & no flags).
1476     local reason
1477     if [[ ${removing_all} ]]; then
1478     reason='requested'
1479     elif [[ ! -f ${archivefile} ]]; then
1480     reason='no static archive'
1481     elif has "${f##*/}" "${pc_libs[@]}"; then
1482     reason='covered by .pc'
1483     elif [[ ! $(sed -nre \
1484     "s/^(dependency_libs|inherited_linker_flags)='(.*)'$/\2/p" \
1485     "${f}") ]]; then
1486     reason='no libs & flags'
1487     fi
1488    
1489     if [[ ${reason} ]]; then
1490     einfo "Removing unnecessary ${f#${D%/}} (${reason})"
1491     rm -f "${f}"
1492     fi
1493     done < <(find "${D}" -type f -name '*.la' -print0)
1494     }
1495    
1496 vapier 1.372 check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1497    
1498 vapier 1.371 fi

  ViewVC Help
Powered by ViewVC 1.1.20