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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.370 - (hide annotations) (download)
Fri Dec 2 10:22:41 2011 UTC (2 years, 9 months ago) by ferringb
Branch: MAIN
Changes since 1.369: +2 -1 lines
fix eqawarn to always return 0; this matches portage behaviour which annoyingly, certain high profile ebuilds like freetype rely on via autotools eclass

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

  ViewVC Help
Powered by ViewVC 1.1.20