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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.375 - (hide annotations) (download)
Sat Dec 17 04:55:41 2011 UTC (3 years ago) by vapier
Branch: MAIN
Changes since 1.374: +7 -7 lines
keep die message updates in eshopts_{push,pop} to $FUNCNAME

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

  ViewVC Help
Powered by ViewVC 1.1.20