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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.319 - (hide annotations) (download)
Sat Sep 12 14:37:51 2009 UTC (5 years ago) by grobian
Branch: MAIN
Changes since 1.318: +11 -11 lines
properly detect OSX 10.6/Darwin 10, thanks Sören Kuklau in bug #284701

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

  ViewVC Help
Powered by ViewVC 1.1.20