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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.301 - (hide annotations) (download)
Sat Apr 5 22:38:26 2008 UTC (6 years, 5 months ago) by zmedico
Branch: MAIN
Changes since 1.300: +3 -3 lines
Bug #215673 - Make built_with_use() handle default IUSE properly. Thanks
to David Leverton for suggesting this approach which uses a bash array.

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

  ViewVC Help
Powered by ViewVC 1.1.20