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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.285 - (hide annotations) (download)
Sat Jul 7 17:30:45 2007 UTC (7 years, 2 months ago) by vapier
Branch: MAIN
Changes since 1.284: +5 -1 lines
if we dont handle the args passed to us, dont return 0 #184495

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.285 # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.284 2007/06/21 04:44:45 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 vapier 1.285 else
978     ((++ret))
979 swegener 1.190 fi
980 lanius 1.133 done
981 vapier 1.271 exit ${ret}
982     )
983 lanius 1.133 }
984 vapier 1.283
985     # @FUNCTION: newmenu
986     # @USAGE: <menu> <newname>
987     # @DESCRIPTION:
988     # Like all other new* functions, install the specified menu as newname.
989 vapier 1.167 newmenu() {
990 vapier 1.271 (
991     # wrap the env here so that the 'insinto' call
992     # doesn't corrupt the env of the caller
993 vapier 1.167 insinto /usr/share/applications
994 vapier 1.271 newins "$@"
995     )
996 vapier 1.167 }
997 lanius 1.133
998 vapier 1.283 # @FUNCTION: doicon
999     # @USAGE: <list of icons>
1000     # @DESCRIPTION:
1001     # Install the list of icons into the icon directory (/usr/share/pixmaps).
1002     # This is useful in conjunction with creating desktop/menu files.
1003 lanius 1.133 doicon() {
1004 vapier 1.271 (
1005     # wrap the env here so that the 'insinto' call
1006     # doesn't corrupt the env of the caller
1007     local i j ret
1008 lanius 1.133 insinto /usr/share/pixmaps
1009 vapier 1.167 for i in "$@" ; do
1010     if [[ -f ${i} ]] ; then
1011     doins "${i}"
1012 vapier 1.271 ((ret+=$?))
1013 vapier 1.167 elif [[ -d ${i} ]] ; then
1014     for j in "${i}"/*.png ; do
1015     doins "${j}"
1016 vapier 1.271 ((ret+=$?))
1017 lanius 1.133 done
1018 vapier 1.285 else
1019     ((++ret))
1020 swegener 1.190 fi
1021 lanius 1.133 done
1022 vapier 1.271 exit ${ret}
1023     )
1024 lanius 1.133 }
1025 vapier 1.283
1026     # @FUNCTION: newicon
1027     # @USAGE: <icon> <newname>
1028     # @DESCRIPTION:
1029     # Like all other new* functions, install the specified icon as newname.
1030 vapier 1.167 newicon() {
1031 vapier 1.271 (
1032     # wrap the env here so that the 'insinto' call
1033     # doesn't corrupt the env of the caller
1034 vapier 1.167 insinto /usr/share/pixmaps
1035 vapier 1.271 newins "$@"
1036     )
1037 vapier 1.167 }
1038 lanius 1.133
1039 vapier 1.70 # for internal use only (unpack_pdv and unpack_makeself)
1040     find_unpackable_file() {
1041 vapier 1.196 local src=$1
1042     if [[ -z ${src} ]] ; then
1043     src=${DISTDIR}/${A}
1044 vapier 1.50 else
1045 vapier 1.196 if [[ -e ${DISTDIR}/${src} ]] ; then
1046     src=${DISTDIR}/${src}
1047     elif [[ -e ${PWD}/${src} ]] ; then
1048     src=${PWD}/${src}
1049     elif [[ -e ${src} ]] ; then
1050     src=${src}
1051 vapier 1.50 fi
1052     fi
1053 vapier 1.196 [[ ! -e ${src} ]] && return 1
1054 vapier 1.70 echo "${src}"
1055     }
1056    
1057 vapier 1.283 # @FUNCTION: unpack_pdv
1058     # @USAGE: <file to unpack> <size of off_t>
1059     # @DESCRIPTION:
1060 vapier 1.70 # Unpack those pesky pdv generated files ...
1061     # They're self-unpacking programs with the binary package stuffed in
1062     # the middle of the archive. Valve seems to use it a lot ... too bad
1063     # it seems to like to segfault a lot :(. So lets take it apart ourselves.
1064 vapier 1.283 #
1065     # You have to specify the off_t size ... I have no idea how to extract that
1066     # information out of the binary executable myself. Basically you pass in
1067     # the size of the off_t type (in bytes) on the machine that built the pdv
1068     # archive.
1069 vapier 1.70 #
1070 vapier 1.283 # One way to determine this is by running the following commands:
1071 flameeyes 1.266 # strings <pdv archive> | grep lseek
1072     # strace -elseek <pdv archive>
1073 vapier 1.283 # Basically look for the first lseek command (we do the strings/grep because
1074     # sometimes the function call is _llseek or something) and steal the 2nd
1075     # parameter. Here is an example:
1076     # vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1077 flameeyes 1.266 # lseek
1078 vapier 1.283 # vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1079 flameeyes 1.266 # lseek(3, -4, SEEK_END) = 2981250
1080 vapier 1.283 # Thus we would pass in the value of '4' as the second parameter.
1081 vapier 1.70 unpack_pdv() {
1082 vapier 1.271 local src=$(find_unpackable_file "$1")
1083 vapier 1.196 local sizeoff_t=$2
1084 vapier 1.70
1085 vapier 1.196 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1086     [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1087 vapier 1.70
1088 vapier 1.212 local shrtsrc=$(basename "${src}")
1089 vapier 1.70 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1090 vapier 1.271 local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\")
1091     local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\")
1092 vapier 1.70
1093     # grab metadata for debug reasons
1094 vapier 1.271 local metafile=$(emktemp)
1095     tail -c +$((${metaskip}+1)) "${src}" > "${metafile}"
1096 vapier 1.70
1097     # rip out the final file name from the metadata
1098 vapier 1.271 local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1)
1099     datafile=$(basename "${datafile}")
1100 vapier 1.70
1101 vapier 1.71 # now lets uncompress/untar the file if need be
1102 vapier 1.271 local tmpfile=$(emktemp)
1103 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1104 vapier 1.71
1105 vapier 1.271 local iscompressed=$(file -b "${tmpfile}")
1106     if [[ ${iscompressed:0:8} == "compress" ]] ; then
1107 vapier 1.71 iscompressed=1
1108     mv ${tmpfile}{,.Z}
1109     gunzip ${tmpfile}
1110     else
1111     iscompressed=0
1112     fi
1113 vapier 1.271 local istar=$(file -b "${tmpfile}")
1114     if [[ ${istar:0:9} == "POSIX tar" ]] ; then
1115 vapier 1.71 istar=1
1116     else
1117     istar=0
1118     fi
1119    
1120     #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1121     #dd if=${src} ibs=${metaskip} count=1 \
1122     # | dd ibs=${tailskip} skip=1 \
1123     # | gzip -dc \
1124     # > ${datafile}
1125     if [ ${iscompressed} -eq 1 ] ; then
1126     if [ ${istar} -eq 1 ] ; then
1127     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1128     | head -c $((${metaskip}-${tailskip})) \
1129     | tar -xzf -
1130     else
1131 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1132     | head -c $((${metaskip}-${tailskip})) \
1133     | gzip -dc \
1134     > ${datafile}
1135 vapier 1.71 fi
1136     else
1137     if [ ${istar} -eq 1 ] ; then
1138     tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1139     | head -c $((${metaskip}-${tailskip})) \
1140 vapier 1.73 | tar --no-same-owner -xf -
1141 vapier 1.71 else
1142 vapier 1.70 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1143     | head -c $((${metaskip}-${tailskip})) \
1144     > ${datafile}
1145 vapier 1.71 fi
1146     fi
1147     true
1148     #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1149 vapier 1.70 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1150     }
1151    
1152 vapier 1.283 # @FUNCTION: unpack_makeself
1153     # @USAGE: [file to unpack] [offset] [tail|dd]
1154     # @DESCRIPTION:
1155 vapier 1.70 # Unpack those pesky makeself generated files ...
1156     # They're shell scripts with the binary package tagged onto
1157     # the end of the archive. Loki utilized the format as does
1158     # many other game companies.
1159 vapier 1.283 #
1160     # If the file is not specified, then ${A} is used. If the
1161     # offset is not specified then we will attempt to extract
1162     # the proper offset from the script itself.
1163 vapier 1.70 unpack_makeself() {
1164 vapier 1.217 local src_input=${1:-${A}}
1165     local src=$(find_unpackable_file "${src_input}")
1166 vapier 1.196 local skip=$2
1167     local exe=$3
1168    
1169 vapier 1.217 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1170 vapier 1.50
1171 vapier 1.196 local shrtsrc=$(basename "${src}")
1172 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1173 vapier 1.212 if [[ -z ${skip} ]] ; then
1174     local ver=$(grep -a '#.*Makeself' "${src}" | awk '{print $NF}')
1175 vapier 1.41 local skip=0
1176 vapier 1.112 exe=tail
1177 vapier 1.41 case ${ver} in
1178 wolf31o2 1.240 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
1179 vapier 1.112 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
1180 vapier 1.41 ;;
1181     2.0|2.0.1)
1182 vapier 1.112 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1183 vapier 1.41 ;;
1184 wolf31o2 1.48 2.1.1)
1185 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1186 wolf31o2 1.48 let skip="skip + 1"
1187     ;;
1188 vapier 1.49 2.1.2)
1189 vapier 1.112 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1190 vapier 1.49 let skip="skip + 1"
1191     ;;
1192 wolf31o2 1.48 2.1.3)
1193 vapier 1.112 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1194 vapier 1.41 let skip="skip + 1"
1195     ;;
1196 wolf31o2 1.211 2.1.4|2.1.5)
1197 vapier 1.112 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1198     skip=$(head -n ${skip} "${src}" | wc -c)
1199     exe="dd"
1200     ;;
1201 vapier 1.41 *)
1202     eerror "I'm sorry, but I was unable to support the Makeself file."
1203     eerror "The version I detected was '${ver}'."
1204     eerror "Please file a bug about the file ${shrtsrc} at"
1205     eerror "http://bugs.gentoo.org/ so that support can be added."
1206     die "makeself version '${ver}' not supported"
1207     ;;
1208     esac
1209     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1210     fi
1211 vapier 1.112 case ${exe} in
1212     tail) exe="tail -n +${skip} '${src}'";;
1213     dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1214     *) die "makeself cant handle exe '${exe}'"
1215     esac
1216 vapier 1.41
1217 vapier 1.68 # lets grab the first few bytes of the file to figure out what kind of archive it is
1218 vapier 1.271 local tmpfile=$(emktemp)
1219 vapier 1.112 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1220 vapier 1.271 local filetype=$(file -b "${tmpfile}")
1221 vapier 1.68 case ${filetype} in
1222 vapier 1.257 *tar\ archive*)
1223 vapier 1.112 eval ${exe} | tar --no-same-owner -xf -
1224 vapier 1.68 ;;
1225     bzip2*)
1226 vapier 1.112 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1227 mr_bones_ 1.69 ;;
1228 vapier 1.68 gzip*)
1229 vapier 1.112 eval ${exe} | tar --no-same-owner -xzf -
1230 vapier 1.68 ;;
1231 vapier 1.93 compress*)
1232 vapier 1.112 eval ${exe} | gunzip | tar --no-same-owner -xf -
1233 vapier 1.93 ;;
1234 vapier 1.68 *)
1235 vapier 1.93 eerror "Unknown filetype \"${filetype}\" ?"
1236 vapier 1.68 false
1237     ;;
1238     esac
1239     assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1240 wolf31o2 1.56 }
1241    
1242 vapier 1.283 # @FUNCTION: check_license
1243     # @USAGE: [license]
1244     # @DESCRIPTION:
1245     # Display a license for user to accept. If no license is
1246     # specified, then ${LICENSE} is used.
1247 wolf31o2 1.56 check_license() {
1248 vapier 1.60 local lic=$1
1249     if [ -z "${lic}" ] ; then
1250     lic="${PORTDIR}/licenses/${LICENSE}"
1251 wolf31o2 1.56 else
1252 wolf31o2 1.199 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1253     lic="${PORTDIR}/licenses/${lic}"
1254     elif [ -e "${PWD}/${lic}" ] ; then
1255     lic="${PWD}/${lic}"
1256     elif [ -e "${lic}" ] ; then
1257     lic="${lic}"
1258 wolf31o2 1.56 fi
1259     fi
1260 wolf31o2 1.200 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1261 vapier 1.64 local l="`basename ${lic}`"
1262 wolf31o2 1.56
1263 vapier 1.60 # here is where we check for the licenses the user already
1264     # accepted ... if we don't find a match, we make the user accept
1265 wolf31o2 1.106 local shopts=$-
1266 vapier 1.60 local alic
1267 wolf31o2 1.106 set -o noglob #so that bash doesn't expand "*"
1268 wolf31o2 1.104 for alic in ${ACCEPT_LICENSE} ; do
1269 wolf31o2 1.255 if [[ ${alic} == ${l} ]]; then
1270 wolf31o2 1.106 set +o noglob; set -${shopts} #reset old shell opts
1271     return 0
1272     fi
1273 vapier 1.60 done
1274 wolf31o2 1.106 set +o noglob; set -$shopts #reset old shell opts
1275 vapier 1.60
1276 vapier 1.271 local licmsg=$(emktemp)
1277     cat <<-EOF > ${licmsg}
1278     **********************************************************
1279     The following license outlines the terms of use of this
1280     package. You MUST accept this license for installation to
1281     continue. When you are done viewing, hit 'q'. If you
1282     CTRL+C out of this, the install will not run!
1283     **********************************************************
1284    
1285     EOF
1286 vapier 1.60 cat ${lic} >> ${licmsg}
1287     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1288 vapier 1.64 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1289 vapier 1.60 read alic
1290     case ${alic} in
1291     yes|Yes|y|Y)
1292     return 0
1293     ;;
1294     *)
1295     echo;echo;echo
1296     eerror "You MUST accept the license to continue! Exiting!"
1297     die "Failed to accept license"
1298     ;;
1299     esac
1300 vapier 1.23 }
1301 vapier 1.75
1302 vapier 1.283 # @FUNCTION: cdrom_get_cds
1303     # @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1304     # @DESCRIPTION:
1305 vapier 1.75 # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1306     # the whole 'non-interactive' policy, but damnit I want CD support !
1307 vapier 1.283 #
1308     # With these cdrom functions we handle all the user interaction and
1309     # standardize everything. All you have to do is call cdrom_get_cds()
1310 vapier 1.75 # and when the function returns, you can assume that the cd has been
1311     # found at CDROM_ROOT.
1312 vapier 1.283 #
1313     # The function will attempt to locate a cd based upon a file that is on
1314     # the cd. The more files you give this function, the more cds
1315     # the cdrom functions will handle.
1316     #
1317     # Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1318     # etc... If you want to give the cds better names, then just export
1319 vapier 1.243 # the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1320 vapier 1.283 # Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1321     # also use the CDROM_NAME_SET bash array.
1322     #
1323     # For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1324 vapier 1.75 cdrom_get_cds() {
1325     # first we figure out how many cds we're dealing with by
1326     # the # of files they gave us
1327     local cdcnt=0
1328     local f=
1329     for f in "$@" ; do
1330 vapier 1.214 ((++cdcnt))
1331 vapier 1.75 export CDROM_CHECK_${cdcnt}="$f"
1332     done
1333     export CDROM_TOTAL_CDS=${cdcnt}
1334     export CDROM_CURRENT_CD=1
1335    
1336     # now we see if the user gave use CD_ROOT ...
1337     # if they did, let's just believe them that it's correct
1338 vapier 1.215 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1339 vapier 1.75 local var=
1340     cdcnt=0
1341 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1342 vapier 1.214 ((++cdcnt))
1343 vapier 1.75 var="CD_ROOT_${cdcnt}"
1344 vapier 1.215 [[ -z ${!var} ]] && var="CD_ROOT"
1345 vapier 1.131 if [[ -z ${!var} ]] ; then
1346 vapier 1.75 eerror "You must either use just the CD_ROOT"
1347     eerror "or specify ALL the CD_ROOT_X variables."
1348     eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1349     die "could not locate CD_ROOT_${cdcnt}"
1350     fi
1351     done
1352 vapier 1.215 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1353 vapier 1.75 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1354 vapier 1.215 export CDROM_SET=-1
1355     for f in ${CDROM_CHECK_1//:/ } ; do
1356     ((++CDROM_SET))
1357     [[ -e ${CD_ROOT}/${f} ]] && break
1358     done
1359     export CDROM_MATCH=${f}
1360 vapier 1.75 return
1361     fi
1362    
1363 vapier 1.215 # User didn't help us out so lets make sure they know they can
1364     # simplify the whole process ...
1365 vapier 1.131 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1366 vapier 1.215 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1367 vapier 1.75 echo
1368     einfo "If you do not have the CD, but have the data files"
1369     einfo "mounted somewhere on your filesystem, just export"
1370     einfo "the variable CD_ROOT so that it points to the"
1371     einfo "directory containing the files."
1372     echo
1373 vapier 1.132 einfo "For example:"
1374     einfo "export CD_ROOT=/mnt/cdrom"
1375     echo
1376 vapier 1.75 else
1377 vapier 1.243 if [[ -n ${CDROM_NAME_SET} ]] ; then
1378     # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1379     cdcnt=0
1380     while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1381     ((++cdcnt))
1382     export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1383     done
1384     fi
1385    
1386 vapier 1.75 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1387     cdcnt=0
1388 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1389 vapier 1.214 ((++cdcnt))
1390 vapier 1.75 var="CDROM_NAME_${cdcnt}"
1391 vapier 1.131 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1392 vapier 1.75 done
1393     echo
1394     einfo "If you do not have the CDs, but have the data files"
1395     einfo "mounted somewhere on your filesystem, just export"
1396     einfo "the following variables so they point to the right place:"
1397     einfon ""
1398     cdcnt=0
1399 vapier 1.131 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1400 vapier 1.214 ((++cdcnt))
1401 vapier 1.75 echo -n " CD_ROOT_${cdcnt}"
1402     done
1403     echo
1404     einfo "Or, if you have all the files in the same place, or"
1405     einfo "you only have one cdrom, you can export CD_ROOT"
1406     einfo "and that place will be used as the same data source"
1407     einfo "for all the CDs."
1408     echo
1409 vapier 1.132 einfo "For example:"
1410     einfo "export CD_ROOT_1=/mnt/cdrom"
1411     echo
1412 vapier 1.75 fi
1413 vapier 1.215
1414 vapier 1.214 export CDROM_SET=""
1415 vapier 1.75 export CDROM_CURRENT_CD=0
1416     cdrom_load_next_cd
1417     }
1418    
1419 vapier 1.283 # @FUNCTION: cdrom_load_next_cd
1420     # @DESCRIPTION:
1421     # Some packages are so big they come on multiple CDs. When you're done reading
1422     # files off a CD and want access to the next one, just call this function.
1423     # Again, all the messy details of user interaction are taken care of for you.
1424     # Once this returns, just read the variable CDROM_ROOT for the location of the
1425     # mounted CD. Note that you can only go forward in the CD list, so make sure
1426     # you only call this function when you're done using the current CD.
1427 vapier 1.75 cdrom_load_next_cd() {
1428 vapier 1.215 local var
1429     ((++CDROM_CURRENT_CD))
1430 vapier 1.79
1431 vapier 1.75 unset CDROM_ROOT
1432 vapier 1.215 var=CD_ROOT_${CDROM_CURRENT_CD}
1433     [[ -z ${!var} ]] && var="CD_ROOT"
1434 vapier 1.131 if [[ -z ${!var} ]] ; then
1435 vapier 1.75 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1436 vapier 1.215 _cdrom_locate_file_on_cd ${!var}
1437 vapier 1.75 else
1438 vapier 1.131 export CDROM_ROOT=${!var}
1439 vapier 1.75 fi
1440    
1441     einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1442     }
1443    
1444     # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1445     # functions. this should *never* be called from an ebuild.
1446     # all it does is try to locate a give file on a cd ... if the cd isn't
1447     # found, then a message asking for the user to insert the cdrom will be
1448     # displayed and we'll hang out here until:
1449     # (1) the file is found on a mounted cdrom
1450     # (2) the user hits CTRL+C
1451 vapier 1.215 _cdrom_locate_file_on_cd() {
1452 vapier 1.214 local mline=""
1453     local showedmsg=0
1454    
1455 vapier 1.131 while [[ -z ${CDROM_ROOT} ]] ; do
1456 vapier 1.214 local i=0
1457     local -a cdset=(${*//:/ })
1458     if [[ -n ${CDROM_SET} ]] ; then
1459     cdset=(${cdset[${CDROM_SET}]})
1460     fi
1461    
1462     while [[ -n ${cdset[${i}]} ]] ; do
1463     local dir=$(dirname ${cdset[${i}]})
1464     local file=$(basename ${cdset[${i}]})
1465    
1466 uberlord 1.259 local point= node= fs= foo=
1467     while read point node fs foo ; do
1468 nyhm 1.281 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1469 uberlord 1.264 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1470     && continue
1471 uberlord 1.259 point=${point//\040/ }
1472     [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1473     export CDROM_ROOT=${point}
1474     export CDROM_SET=${i}
1475     export CDROM_MATCH=${cdset[${i}]}
1476     return
1477 kanaka 1.262 done <<< "$(get_mounts)"
1478 vapier 1.214
1479     ((++i))
1480 vapier 1.75 done
1481    
1482 vapier 1.214 echo
1483     if [[ ${showedmsg} -eq 0 ]] ; then
1484     if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1485     if [[ -z ${CDROM_NAME} ]] ; then
1486     einfo "Please insert+mount the cdrom for ${PN} now !"
1487     else
1488     einfo "Please insert+mount the ${CDROM_NAME} cdrom now !"
1489     fi
1490     else
1491     if [[ -z ${CDROM_NAME_1} ]] ; then
1492     einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1493 vapier 1.75 else
1494 vapier 1.214 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1495     einfo "Please insert+mount the ${!var} cdrom now !"
1496 vapier 1.75 fi
1497     fi
1498 vapier 1.214 showedmsg=1
1499 vapier 1.75 fi
1500 vapier 1.214 einfo "Press return to scan for the cd again"
1501     einfo "or hit CTRL+C to abort the emerge."
1502     echo
1503     einfo "If you are having trouble with the detection"
1504     einfo "of your CD, it is possible that you do not have"
1505     einfo "Joliet support enabled in your kernel. Please"
1506     einfo "check that CONFIG_JOLIET is enabled in your kernel."
1507 vapier 1.222 read || die "something is screwed with your system"
1508 vapier 1.75 done
1509     }
1510 vapier 1.92
1511 mr_bones_ 1.100 # Make sure that LINGUAS only contains languages that
1512 vapier 1.92 # a package can support
1513     #
1514     # usage: strip-linguas <allow LINGUAS>
1515 flameeyes 1.266 # strip-linguas -i <directories of .po files>
1516     # strip-linguas -u <directories of .po files>
1517 vapier 1.92 #
1518     # The first form allows you to specify a list of LINGUAS.
1519 mr_bones_ 1.100 # The -i builds a list of po files found in all the
1520 flameeyes 1.266 # directories and uses the intersection of the lists.
1521 mr_bones_ 1.100 # The -u builds a list of po files found in all the
1522 flameeyes 1.266 # directories and uses the union of the lists.
1523 vapier 1.92 strip-linguas() {
1524 vapier 1.242 local ls newls nols
1525 vapier 1.154 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1526     local op=$1; shift
1527 vapier 1.236 ls=$(find "$1" -name '*.po' -exec basename {} .po \;); shift
1528 vapier 1.92 local d f
1529     for d in "$@" ; do
1530 vapier 1.154 if [[ ${op} == "-u" ]] ; then
1531     newls=${ls}
1532 vapier 1.92 else
1533     newls=""
1534     fi
1535 vapier 1.236 for f in $(find "$d" -name '*.po' -exec basename {} .po \;) ; do
1536 vapier 1.154 if [[ ${op} == "-i" ]] ; then
1537 vapier 1.236 hasq ${f} ${ls} && newls="${newls} ${f}"
1538 vapier 1.92 else
1539 vapier 1.236 hasq ${f} ${ls} || newls="${newls} ${f}"
1540 vapier 1.92 fi
1541     done
1542 vapier 1.154 ls=${newls}
1543 vapier 1.92 done
1544     else
1545 vapier 1.236 ls="$@"
1546 vapier 1.92 fi
1547    
1548 vapier 1.242 nols=""
1549 vapier 1.92 newls=""
1550     for f in ${LINGUAS} ; do
1551 vapier 1.236 if hasq ${f} ${ls} ; then
1552 vapier 1.120 newls="${newls} ${f}"
1553 vapier 1.92 else
1554 vapier 1.242 nols="${nols} ${f}"
1555 vapier 1.92 fi
1556     done
1557 vapier 1.244 [[ -n ${nols} ]] \
1558 vapier 1.242 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols}
1559 vapier 1.237 export LINGUAS=${newls:1}
1560 vapier 1.92 }
1561 iggy 1.110
1562 vapier 1.283 # @FUNCTION: set_arch_to_kernel
1563     # @DESCRIPTION:
1564     # Set the env ARCH to match what the kernel expects.
1565 iggy 1.110 set_arch_to_kernel() {
1566 vapier 1.140 i=10
1567     while ((i--)) ; do
1568     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1569     done
1570 iggy 1.110 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1571     case ${ARCH} in
1572 flameeyes 1.266 x86) export ARCH="i386";;
1573     amd64) export ARCH="x86_64";;
1574     hppa) export ARCH="parisc";;
1575     mips) export ARCH="mips";;
1576     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!
1577     *) export ARCH="${ARCH}";;
1578 iggy 1.110 esac
1579     }
1580    
1581 vapier 1.283 # @FUNCTION: set_arch_to_portage
1582     # @DESCRIPTION:
1583     # Set the env ARCH to match what portage expects.
1584 iggy 1.110 set_arch_to_portage() {
1585 vapier 1.140 i=10
1586     while ((i--)) ; do
1587     ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1588     done
1589 iggy 1.110 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1590     }
1591 eradicator 1.111
1592 vapier 1.283 # @FUNCTION: preserve_old_lib
1593     # @USAGE: <libs to preserve> [more libs]
1594     # @DESCRIPTION:
1595     # These functions are useful when a lib in your package changes ABI SONAME.
1596     # An example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1597 eradicator 1.111 # would break packages that link against it. Most people get around this
1598     # by using the portage SLOT mechanism, but that is not always a relevant
1599 vapier 1.283 # solution, so instead you can call this from pkg_preinst. See also the
1600     # preserve_old_lib_notify function.
1601 eradicator 1.111 preserve_old_lib() {
1602 vapier 1.268 if [[ ${EBUILD_PHASE} != "preinst" ]] ; then
1603 vapier 1.267 eerror "preserve_old_lib() must be called from pkg_preinst() only"
1604 vapier 1.276 die "Invalid preserve_old_lib() usage"
1605 vapier 1.267 fi
1606     [[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"
1607    
1608     local lib dir
1609     for lib in "$@" ; do
1610     [[ -e ${ROOT}/${lib} ]] || continue
1611     dir=${lib%/*}
1612     dodir ${dir} || die "dodir ${dir} failed"
1613     cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed"
1614     touch "${D}"/${lib}
1615     done
1616 eradicator 1.111 }
1617    
1618 vapier 1.283 # @FUNCTION: preserve_old_lib_notify
1619     # @USAGE: <libs to notify> [more libs]
1620     # @DESCRIPTION:
1621     # Spit helpful messages about the libraries preserved by preserve_old_lib.
1622 eradicator 1.111 preserve_old_lib_notify() {
1623 vapier 1.268 if [[ ${EBUILD_PHASE} != "postinst" ]] ; then
1624 vapier 1.267 eerror "preserve_old_lib_notify() must be called from pkg_postinst() only"
1625 vapier 1.276 die "Invalid preserve_old_lib_notify() usage"
1626 vapier 1.267 fi
1627    
1628     local lib notice=0
1629     for lib in "$@" ; do
1630     [[ -e ${ROOT}/${lib} ]] || continue
1631     if [[ ${notice} -eq 0 ]] ; then
1632     notice=1
1633     ewarn "Old versions of installed libraries were detected on your system."
1634     ewarn "In order to avoid breaking packages that depend on these old libs,"
1635     ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1636     ewarn "in order to remove these old dependencies. If you do not have this"
1637     ewarn "helper program, simply emerge the 'gentoolkit' package."
1638     ewarn
1639     fi
1640     ewarn " # revdep-rebuild --library ${lib##*/}"
1641     done
1642 eradicator 1.111 }
1643 vapier 1.125
1644 vapier 1.283 # @FUNCTION: built_with_use
1645     # @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1646     # @DESCRIPTION:
1647     # A temporary hack until portage properly supports DEPENDing on USE
1648     # flags being enabled in packages. This will check to see if the specified
1649     # DEPEND atom was built with the specified list of USE flags. The
1650     # --missing option controls the behavior if called on a package that does
1651     # not actually support the defined USE flags (aka listed in IUSE).
1652     # The default is to abort (call die). The -a and -o flags control
1653     # the requirements of the USE flags. They correspond to "and" and "or"
1654     # logic. So the -a flag means all listed USE flags must be enabled
1655     # while the -o flag means at least one of the listed fIUSE flags must be
1656     # enabled. The --hidden option is really for internal use only as it
1657     # means the USE flag we're checking is hidden expanded, so it won't be found
1658     # in IUSE like normal USE flags.
1659     #
1660     # Remember that this function isn't terribly intelligent so order of optional
1661     # flags matter.
1662 vapier 1.125 built_with_use() {
1663 vapier 1.275 local hidden="no"
1664     if [[ $1 == "--hidden" ]] ; then
1665     hidden="yes"
1666     shift
1667     fi
1668    
1669 vapier 1.269 local missing_action="die"
1670     if [[ $1 == "--missing" ]] ; then
1671     missing_action=$2
1672     shift ; shift
1673     case ${missing_action} in
1674     true|false|die) ;;
1675     *) die "unknown action '${missing_action}'";;
1676     esac
1677     fi
1678    
1679 vapier 1.130 local opt=$1
1680     [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1681    
1682     local PKG=$(best_version $1)
1683 vapier 1.247 [[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package"
1684 vapier 1.130 shift
1685    
1686 vapier 1.213 local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE
1687 vapier 1.249 local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE
1688 vapier 1.213
1689 cardoe 1.273 # if the IUSE file doesn't exist, the read will error out, we need to handle
1690     # this gracefully
1691 vapier 1.275 if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]] ; then
1692 cardoe 1.273 case ${missing_action} in
1693     true) return 0;;
1694     false) return 1;;
1695     die) die "Unable to determine what USE flags $PKG was built with";;
1696     esac
1697     fi
1698    
1699 vapier 1.275 if [[ ${hidden} == "no" ]] ; then
1700     local IUSE_BUILT=$(<${IUSEFILE})
1701     # Don't check USE_EXPAND #147237
1702     local expand
1703     for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]') ; do
1704     if [[ $1 == ${expand}_* ]] ; then
1705     expand=""
1706     break
1707     fi
1708     done
1709     if [[ -n ${expand} ]] ; then
1710     if ! has $1 ${IUSE_BUILT} ; then
1711     case ${missing_action} in
1712     true) return 0;;
1713     false) return 1;;
1714     die) die "$PKG does not actually support the $1 USE flag!";;
1715     esac
1716     fi
1717 vapier 1.269 fi
1718 vapier 1.250 fi
1719 vapier 1.249
1720 vapier 1.125 local USE_BUILT=$(<${USEFILE})
1721 vapier 1.130 while [[ $# -gt 0 ]] ; do
1722     if [[ ${opt} = "-o" ]] ; then
1723     has $1 ${USE_BUILT} && return 0
1724     else
1725     has $1 ${USE_BUILT} || return 1
1726     fi
1727 vapier 1.125 shift
1728     done
1729 vapier 1.130 [[ ${opt} = "-a" ]]
1730 vapier 1.125 }
1731 vapier 1.126
1732 vapier 1.283 # @DESCRIPTION: epunt_cxx
1733     # @USAGE: [dir to scan]
1734     # @DESCRIPTION:
1735     # Many configure scripts wrongly bail when a C++ compiler could not be
1736     # detected. If dir is not specified, then it defaults to ${S}.
1737     #
1738     # http://bugs.gentoo.org/73450
1739 vapier 1.126 epunt_cxx() {
1740 vapier 1.127 local dir=$1
1741     [[ -z ${dir} ]] && dir=${S}
1742     ebegin "Removing useless C++ checks"
1743     local f
1744     for f in $(find ${dir} -name configure) ; do
1745     patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1746     done
1747     eend 0
1748 vapier 1.126 }
1749 ka0ttic 1.143
1750 vapier 1.283 # @FUNCTION: make_wrapper
1751     # @USAGE: <wrapper> <target> <chdir> [libpaths] [installpath]
1752     # @DESCRIPTION:
1753     # Create a shell wrapper script named wrapper in installpath
1754     # (defaults to the bindir) to execute target (default of wrapper) by
1755     # first optionally setting LD_LIBRARY_PATH to the colon-delimited
1756     # libpaths followed by optionally changing directory to chdir.
1757 wolf31o2 1.160 make_wrapper() {
1758 wolf31o2 1.164 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1759 wolf31o2 1.160 local tmpwrapper=$(emktemp)
1760 vapier 1.202 # We don't want to quote ${bin} so that people can pass complex
1761     # things as $bin ... "./someprog --args"
1762 wolf31o2 1.160 cat << EOF > "${tmpwrapper}"
1763     #!/bin/sh
1764 vapier 1.201 cd "${chdir:-.}"
1765 vapier 1.210 if [ -n "${libdir}" ] ; then
1766     if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
1767     export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1768     else
1769     export LD_LIBRARY_PATH="${libdir}"
1770     fi
1771 vapier 1.201 fi
1772 vapier 1.202 exec ${bin} "\$@"
1773 wolf31o2 1.160 EOF
1774     chmod go+rx "${tmpwrapper}"
1775 vapier 1.201 if [[ -n ${path} ]] ; then
1776 vapier 1.283 (
1777 vapier 1.201 exeinto "${path}"
1778 wolf31o2 1.164 newexe "${tmpwrapper}" "${wrapper}"
1779 vapier 1.283 ) || die
1780 wolf31o2 1.164 else
1781 vapier 1.283 newbin "${tmpwrapper}" "${wrapper}" || die
1782 wolf31o2 1.164 fi
1783 wolf31o2 1.160 }

  ViewVC Help
Powered by ViewVC 1.1.20