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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.292 - (hide annotations) (download)
Sun Oct 14 21:55:35 2007 UTC (7 years, 1 month ago) by vapier
Branch: MAIN
Changes since 1.291: +2 -1 lines
fix from James Le Cuirot to check to see if the directory to search exists before searching it to avoid confusing messages being posted #195864

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

  ViewVC Help
Powered by ViewVC 1.1.20