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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.321 - (hide annotations) (download)
Sun Oct 18 07:52:23 2009 UTC (5 years ago) by grobian
Branch: MAIN
Changes since 1.320: +5 -3 lines
move euser argument to the end, to conform to more implementations of useradd, bug #271081

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

  ViewVC Help
Powered by ViewVC 1.1.20