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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.328 - (hide annotations) (download)
Sun Jan 10 15:58:58 2010 UTC (4 years, 7 months ago) by scarabeus
Branch: MAIN
Changes since 1.327: +6 -5 lines
Fix the EPATCH_EXCLUDE properly by patch from Griffon26. Also it fixes bug #300360.

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

  ViewVC Help
Powered by ViewVC 1.1.20