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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.296 - (hide annotations) (download)
Wed Feb 13 20:50:06 2008 UTC (6 years, 4 months ago) by wolf31o2
Branch: MAIN
Changes since 1.295: +11 -6 lines
Change the Joliet information in cdrom_get_cds to only display after a failed attempt to find the CD since we're now using ewarn and ebeep to get the user's attention.  Yes, this sucks, but I'm getting tired of trying to support people who cannot seem to read the last 4 lines of output from the CD detection when it doesn't find a CD and hope that maybe the beeps will help.

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

  ViewVC Help
Powered by ViewVC 1.1.20