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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.303 - (hide annotations) (download)
Sat Sep 20 18:32:35 2008 UTC (6 years ago) by vapier
Branch: MAIN
Changes since 1.302: +5 -1 lines
add support for lzma patches

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

  ViewVC Help
Powered by ViewVC 1.1.20