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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.306 - (hide annotations) (download)
Sat Sep 20 18:58:57 2008 UTC (5 years, 11 months ago) by vapier
Branch: MAIN
Changes since 1.305: +4 -2 lines
filter /dev/null from abs path check and include the offending line in the warning

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

  ViewVC Help
Powered by ViewVC 1.1.20