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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.402 - (hide annotations) (download)
Wed Aug 29 13:42:42 2012 UTC (23 months ago) by mgorny
Branch: MAIN
Changes since 1.401: +29 -25 lines
prune_libtool_files: run pkg-config code only if necessary.

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.402 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.401 2012/08/20 19:45:57 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 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 vapier 1.401 # icon: the icon to use in the menu entry
662 jlec 1.377 # 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 hasufell 1.398 # example 1: doicon foobar.png fuqbar.svg suckbar.png
1036 hasufell 1.394 # results in: insinto /usr/share/pixmaps
1037 hasufell 1.398 # doins foobar.png fuqbar.svg suckbar.png
1038 hasufell 1.394 #
1039 ssuominen 1.399 # example 2: doicon -s 48 foobar.png fuqbar.png blobbar.png
1040 hasufell 1.394 # results in: insinto /usr/share/icons/hicolor/48x48/apps
1041 ssuominen 1.399 # doins foobar.png fuqbar.png blobbar.png
1042 hasufell 1.394 # @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 phajdan.jr 1.393 ewarn " # revdep-rebuild --library '${lib}' && rm '${lib}'"
1169 vapier 1.267 done
1170 eradicator 1.111 }
1171 vapier 1.125
1172 vapier 1.283 # @FUNCTION: built_with_use
1173     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1174     # @DESCRIPTION:
1175 betelgeuse 1.329 #
1176     # Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1177     #
1178 vapier 1.283 # A temporary hack until portage properly supports DEPENDing on USE
1179     # flags being enabled in packages. This will check to see if the specified
1180     # DEPEND atom was built with the specified list of USE flags. The
1181     # --missing option controls the behavior if called on a package that does
1182     # not actually support the defined USE flags (aka listed in IUSE).
1183     # The default is to abort (call die). The -a and -o flags control
1184     # the requirements of the USE flags. They correspond to "and" and "or"
1185     # logic. So the -a flag means all listed USE flags must be enabled
1186 opfer 1.302 # while the -o flag means at least one of the listed IUSE flags must be
1187 vapier 1.283 # enabled. The --hidden option is really for internal use only as it
1188     # means the USE flag we're checking is hidden expanded, so it won't be found
1189     # in IUSE like normal USE flags.
1190 swegener 1.286 #
1191 vapier 1.283 # Remember that this function isn't terribly intelligent so order of optional
1192     # flags matter.
1193 vapier 1.125 built_with_use() {
1194 vapier 1.275 local hidden="no"
1195     if [[ $1 == "--hidden" ]] ; then
1196     hidden="yes"
1197     shift
1198     fi
1199    
1200 vapier 1.269 local missing_action="die"
1201     if [[ $1 == "--missing" ]] ; then
1202     missing_action=$2
1203     shift ; shift
1204     case ${missing_action} in
1205     true|false|die) ;;
1206     *) die "unknown action '${missing_action}'";;
1207     esac
1208     fi
1209    
1210 vapier 1.130 local opt=$1
1211     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1212    
1213     local PKG=$(best_version $1)
1214 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1215 vapier 1.130 shift
1216    
1217 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1218 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1219 vapier 1.213
1220 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1221     # this gracefully
1222 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1223 cardoe 1.273 case ${missing_action} in
1224     true) return 0;;
1225     false) return 1;;
1226     die) die "Unable to determine what USE flags $PKG was built with";;
1227     esac
1228     fi
1229    
1230 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1231 zmedico 1.301 local IUSE_BUILT=( $(<"${IUSEFILE}") )
1232 vapier 1.275 # Don't check USE_EXPAND #147237
1233     local expand
1234     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1235     if [[ $1 == ${expand}_* ]] ; then
1236     expand=""
1237     break
1238     fi
1239     done
1240     if [[ -n ${expand} ]] ; then
1241 zmedico 1.301 if ! has $1 ${IUSE_BUILT[@]#[-+]} ; then
1242 vapier 1.275 case ${missing_action} in
1243     true) return 0;;
1244     false) return 1;;
1245     die) die "$PKG does not actually support the $1 USE flag!";;
1246     esac
1247     fi
1248 vapier 1.269 fi
1249 vapier 1.250 fi
1250 vapier 1.249
1251 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1252 vapier 1.130 while [[ $# -gt 0 ]] ; do
1253     if [[ ${opt} = "-o" ]] ; then
1254     has $1 ${USE_BUILT} && return 0
1255     else
1256     has $1 ${USE_BUILT} || return 1
1257     fi
1258 vapier 1.125 shift
1259     done
1260 vapier 1.130 [[ ${opt} = "-a" ]]
1261 vapier 1.125 }
1262 vapier 1.126
1263 vapier 1.289 # @FUNCTION: epunt_cxx
1264 vapier 1.283 # @USAGE: [dir to scan]
1265     # @DESCRIPTION:
1266     # Many configure scripts wrongly bail when a C++ compiler could not be
1267     # detected. If dir is not specified, then it defaults to ${S}.
1268     #
1269     # http://bugs.gentoo.org/73450
1270 vapier 1.126 epunt_cxx() {
1271 vapier 1.127 local dir=$1
1272     [[ -z ${dir} ]] && dir=${S}
1273     ebegin "Removing useless C++ checks"
1274     local f
1275 vapier 1.294 find "${dir}" -name configure | while read f ; do
1276     patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1277 vapier 1.127 done
1278     eend 0
1279 vapier 1.126 }
1280 ka0ttic 1.143
1281 vapier 1.283 # @FUNCTION: make_wrapper
1282 wolf31o2 1.295 # @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
1283 vapier 1.283 # @DESCRIPTION:
1284     # Create a shell wrapper script named wrapper in installpath
1285     # (defaults to the bindir) to execute target (default of wrapper) by
1286     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1287     # libpaths followed by optionally changing directory to chdir.
1288 wolf31o2 1.160 make_wrapper() {
1289 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1290 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1291 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1292     # things as $bin ... "./someprog --args"
1293 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1294     #!/bin/sh
1295 vapier 1.201 cd "${chdir:-.}"
1296 vapier 1.210 if [ -n "${libdir}" ] ; then
1297     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1298     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1299     else
1300     export LD_LIBRARY_PATH="${libdir}"
1301     fi
1302 vapier 1.201 fi
1303 vapier 1.202 exec ${bin} "\$@"
1304 wolf31o2 1.160 EOF
1305     chmod go+rx "${tmpwrapper}"
1306 vapier 1.201 if [[ -n ${path} ]] ; then
1307 vapier 1.283 (
1308 vapier 1.201 exeinto "${path}"
1309 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1310 vapier 1.283 ) || die
1311 wolf31o2 1.164 else
1312 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1313 wolf31o2 1.164 fi
1314 wolf31o2 1.160 }
1315 mr_bones_ 1.311
1316 vapier 1.351 # @FUNCTION: path_exists
1317     # @USAGE: [-a|-o] <paths>
1318     # @DESCRIPTION:
1319     # Check if the specified paths exist. Works for all types of paths
1320     # (files/dirs/etc...). The -a and -o flags control the requirements
1321     # of the paths. They correspond to "and" and "or" logic. So the -a
1322     # flag means all the paths must exist while the -o flag means at least
1323     # one of the paths must exist. The default behavior is "and". If no
1324     # paths are specified, then the return value is "false".
1325     path_exists() {
1326     local opt=$1
1327     [[ ${opt} == -[ao] ]] && shift || opt="-a"
1328    
1329     # no paths -> return false
1330     # same behavior as: [[ -e "" ]]
1331     [[ $# -eq 0 ]] && return 1
1332    
1333     local p r=0
1334     for p in "$@" ; do
1335     [[ -e ${p} ]]
1336     : $(( r += $? ))
1337     done
1338    
1339     case ${opt} in
1340     -a) return $(( r != 0 )) ;;
1341     -o) return $(( r == $# )) ;;
1342     esac
1343     }
1344 mgorny 1.364
1345     # @FUNCTION: in_iuse
1346     # @USAGE: <flag>
1347     # @DESCRIPTION:
1348     # Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1349     # as necessary.
1350     #
1351     # Note that this function should not be used in the global scope.
1352     in_iuse() {
1353     debug-print-function ${FUNCNAME} "${@}"
1354     [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1355    
1356     local flag=${1}
1357     local liuse=( ${IUSE} )
1358    
1359     has "${flag}" "${liuse[@]#[+-]}"
1360     }
1361 vapier 1.365
1362 vapier 1.367 # @FUNCTION: use_if_iuse
1363     # @USAGE: <flag>
1364     # @DESCRIPTION:
1365     # Return true if the given flag is in USE and IUSE.
1366     #
1367     # Note that this function should not be used in the global scope.
1368     use_if_iuse() {
1369     in_iuse $1 || return 1
1370     use $1
1371     }
1372    
1373 vapier 1.365 # @FUNCTION: usex
1374     # @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1375     # @DESCRIPTION:
1376     # If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1377     # otherwise echo [false output][false suffix] (defaults to "no").
1378     usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1379 vapier 1.371
1380 mgorny 1.395 # @FUNCTION: prune_libtool_files
1381     # @USAGE: [--all]
1382     # @DESCRIPTION:
1383     # Locate unnecessary libtool files (.la) and libtool static archives
1384     # (.a) and remove them from installation image.
1385     #
1386     # By default, .la files are removed whenever the static linkage can
1387     # either be performed using pkg-config or doesn't introduce additional
1388     # flags.
1389     #
1390     # If '--all' argument is passed, all .la files are removed. This is
1391     # usually useful when the package installs plugins and does not use .la
1392     # files for loading them.
1393     #
1394     # The .a files are only removed whenever corresponding .la files state
1395     # that they should not be linked to, i.e. whenever these files
1396     # correspond to plugins.
1397     #
1398 mgorny 1.402 # Note: if your package installs both static libraries and .pc files,
1399     # you need to add pkg-config to your DEPEND.
1400 mgorny 1.395 prune_libtool_files() {
1401     debug-print-function ${FUNCNAME} "$@"
1402    
1403     local removing_all opt
1404     for opt; do
1405     case "${opt}" in
1406     --all)
1407     removing_all=1
1408     ;;
1409     *)
1410     die "Invalid argument to ${FUNCNAME}(): ${opt}"
1411     esac
1412     done
1413    
1414     local f
1415     while IFS= read -r -d '' f; do # for all .la files
1416     local archivefile=${f/%.la/.a}
1417    
1418     [[ ${f} != ${archivefile} ]] || die 'regex sanity check failed'
1419    
1420     # Remove static libs we're not supposed to link against.
1421     if grep -q '^shouldnotlink=yes$' "${f}"; then
1422 mgorny 1.400 if [[ -f ${archivefile} ]]; then
1423     einfo "Removing unnecessary ${archivefile#${D%/}} (static plugin)"
1424     rm -f "${archivefile}"
1425     fi
1426 mgorny 1.395
1427     # The .la file may be used by a module loader, so avoid removing it
1428     # unless explicitly requested.
1429     [[ ${removing_all} ]] || continue
1430     fi
1431    
1432     # Remove .la files when:
1433     # - user explicitly wants us to remove all .la files,
1434     # - respective static archive doesn't exist,
1435     # - they are covered by a .pc file already,
1436     # - they don't provide any new information (no libs & no flags).
1437 mgorny 1.402 local reason pkgconfig_scanned
1438 mgorny 1.395 if [[ ${removing_all} ]]; then
1439     reason='requested'
1440     elif [[ ! -f ${archivefile} ]]; then
1441     reason='no static archive'
1442     elif [[ ! $(sed -nre \
1443     "s/^(dependency_libs|inherited_linker_flags)='(.*)'$/\2/p" \
1444     "${f}") ]]; then
1445     reason='no libs & flags'
1446 mgorny 1.402 else
1447     if [[ ! ${pkgconfig_scanned} ]]; then
1448     # Create a list of all .pc-covered libs.
1449     local pc_libs=()
1450     if [[ ! ${removing_all} ]]; then
1451     local f
1452     local tf=${T}/prune-lt-files.pc
1453     local pkgconf=$(tc-getPKG_CONFIG)
1454    
1455     while IFS= read -r -d '' f; do # for all .pc files
1456     local arg
1457    
1458     sed -e '/^Requires:/d' "${f}" > "${tf}"
1459     for arg in $("${pkgconf}" --libs "${tf}"); do
1460     [[ ${arg} == -l* ]] && pc_libs+=( lib${arg#-l}.la )
1461     done
1462     done < <(find "${D}" -type f -name '*.pc' -print0)
1463    
1464     rm -f "${tf}"
1465     fi
1466    
1467     pkgconfig_scanned=1
1468     fi
1469    
1470     has "${f##*/}" "${pc_libs[@]}" && reason='covered by .pc'
1471 mgorny 1.395 fi
1472    
1473     if [[ ${reason} ]]; then
1474     einfo "Removing unnecessary ${f#${D%/}} (${reason})"
1475     rm -f "${f}"
1476     fi
1477     done < <(find "${D}" -type f -name '*.la' -print0)
1478     }
1479    
1480 vapier 1.372 check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1481    
1482 vapier 1.371 fi

  ViewVC Help
Powered by ViewVC 1.1.20