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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.329 - (hide annotations) (download)
Thu Jan 28 22:00:12 2010 UTC (4 years, 7 months ago) by betelgeuse
Branch: MAIN
Changes since 1.328: +10 -3 lines
Only define epause and ebeep in EAPIs 0 1 2. Mark built_with_use as deprecated.

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

  ViewVC Help
Powered by ViewVC 1.1.20