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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20