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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20