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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.305 - (hide annotations) (download)
Sat Sep 20 18:55:07 2008 UTC (5 years, 10 months ago) by vapier
Branch: MAIN
Changes since 1.304: +8 -1 lines
start whining about absolute paths in patch files

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

  ViewVC Help
Powered by ViewVC 1.1.20