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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.283 - (hide annotations) (download)
Sat Jun 16 08:03:28 2007 UTC (7 years, 2 months ago) by vapier
Branch: MAIN
Changes since 1.282: +195 -166 lines
move man page documentation to eclass

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

  ViewVC Help
Powered by ViewVC 1.1.20