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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.284 - (hide annotations) (download)
Thu Jun 21 04:44:45 2007 UTC (7 years, 11 months ago) by vapier
Branch: MAIN
Changes since 1.283: +34 -13 lines
update make_desktop_entry to upstream 1.0 spec #182669 and flesh out more default categories

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

  ViewVC Help
Powered by ViewVC 1.1.20