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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.293 - (hide annotations) (download)
Tue Nov 20 22:32:01 2007 UTC (6 years, 4 months ago) by wolf31o2
Branch: MAIN
Changes since 1.292: +4 -5 lines
Added a couple minor fixes for make_desktop_entry to clean it up, per discussion on the gentoo-dev mailing list.  This closes bug #181999 and bug #197891.  Thanks to Carsten Lohrke <carlo@gentoo.org>, Samuli Suominen <drac@gentoo.org, and Daniel Pielmeier <daniel.pielmeier@googlemail.com>.

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

  ViewVC Help
Powered by ViewVC 1.1.20