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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.309 - (hide annotations) (download)
Sat Feb 7 10:57:38 2009 UTC (5 years, 5 months ago) by pva
Branch: MAIN
Changes since 1.308: +2 -2 lines
Fixed typo in comments.

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

  ViewVC Help
Powered by ViewVC 1.1.20