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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.376 - (hide annotations) (download)
Sat Dec 17 06:13:50 2011 UTC (2 years, 8 months ago) by vapier
Branch: MAIN
Changes since 1.375: +9 -15 lines
escape the brackets so that globbing doesnt kick in, or in the nullglob case, make the arg disappear #395025 by Maciej Mrozowski

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

  ViewVC Help
Powered by ViewVC 1.1.20