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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.282 - (hide annotations) (download)
Sat Jun 16 07:11:43 2007 UTC (7 years, 5 months ago) by vapier
Branch: MAIN
Changes since 1.281: +1 -49 lines
finish gen_usr_ldscript to toolchain-funcs from eutils

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

  ViewVC Help
Powered by ViewVC 1.1.20