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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.325 - (hide annotations) (download)
Sat Jan 9 20:06:24 2010 UTC (4 years, 3 months ago) by vapier
Branch: MAIN
Changes since 1.324: +207 -219 lines
rewrite epatch greatly -- clean up logging, quoting, shell opts, file name checking, and decompression

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

  ViewVC Help
Powered by ViewVC 1.1.20