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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.320 - (hide annotations) (download)
Thu Sep 24 02:49:32 2009 UTC (4 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.319: +1 -2 lines
make_desktop_entry: dont bother writing Version= anymore #285920 by Josh Saddler

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

  ViewVC Help
Powered by ViewVC 1.1.20