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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.244 - (hide annotations) (download)
Thu Jul 6 23:53:57 2006 UTC (7 years, 9 months ago) by vapier
Branch: MAIN
Changes since 1.243: +2 -2 lines
check $nols in strip-linguas before warning #138884 by Phil Richards

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

  ViewVC Help
Powered by ViewVC 1.1.20