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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.313 - (hide annotations) (download)
Wed Feb 18 20:17:18 2009 UTC (5 years, 6 months ago) by betelgeuse
Branch: MAIN
Changes since 1.312: +18 -12 lines
Comment about prepalldocs with approval from lu_zero and dev-zero.

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

  ViewVC Help
Powered by ViewVC 1.1.20