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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.314 - (hide annotations) (download)
Sat Feb 21 07:35:14 2009 UTC (5 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.313: +10 -7 lines
fixup broken make_session_desktop()
 - document $wm var and have it default to $PN
 - set Type to XSession, not Application
 - allow arguments to the command and split Exec/TryExec accordingly

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

  ViewVC Help
Powered by ViewVC 1.1.20