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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.63 - (hide annotations) (download)
Mon Oct 13 15:00:19 2003 UTC (10 years, 9 months ago) by vapier
Branch: MAIN
Changes since 1.62: +2 -2 lines
fix expansion

1 vapier 1.18 # Copyright 1999-2003 Gentoo Technologies, Inc.
2 azarah 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.63 # $Header: /home/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.62 2003/10/05 02:42:24 vapier Exp $
4 vapier 1.18 #
5 azarah 1.1 # Author: Martin Schlemmer <azarah@gentoo.org>
6 vapier 1.18 #
7 azarah 1.1 # This eclass is for general purpose functions that most ebuilds
8 vapier 1.7 # have to implement themselves.
9 azarah 1.1 #
10     # NB: If you add anything, please comment it!
11    
12     ECLASS=eutils
13     INHERITED="$INHERITED $ECLASS"
14    
15 azarah 1.51 newdepend "!bootstrap? ( sys-devel/patch )"
16 azarah 1.1
17 vapier 1.22 DESCRIPTION="Based on the ${ECLASS} eclass"
18 azarah 1.1
19     # This function generate linker scripts in /usr/lib for dynamic
20     # libs in /lib. This is to fix linking problems when you have
21     # the .so in /lib, and the .a in /usr/lib. What happens is that
22     # in some cases when linking dynamic, the .a in /usr/lib is used
23     # instead of the .so in /lib due to gcc/libtool tweaking ld's
24     # library search path. This cause many builds to fail.
25     # See bug #4411 for more info.
26     #
27     # To use, simply call:
28     #
29     # gen_usr_ldscript libfoo.so
30     #
31     # Note that you should in general use the unversioned name of
32     # the library, as ldconfig should usually update it correctly
33     # to point to the latest version of the library present.
34     #
35     # <azarah@gentoo.org> (26 Oct 2002)
36     #
37     gen_usr_ldscript() {
38    
39     # Just make sure it exists
40     dodir /usr/lib
41 danarmak 1.32
42 azarah 1.1 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
43     /* GNU ld script
44     Because Gentoo have critical dynamic libraries
45     in /lib, and the static versions in /usr/lib, we
46     need to have a "fake" dynamic lib in /usr/lib,
47     otherwise we run into linking problems.
48     See bug #4411 on http://bugs.gentoo.org/ for
49     more info. */
50     GROUP ( /lib/libxxx )
51     END_LDSCRIPT
52    
53     dosed "s:libxxx:$1:" /usr/lib/$1
54 azarah 1.5
55     return 0
56 azarah 1.2 }
57    
58 azarah 1.5 # Simple function to draw a line consisting of '=' the same length as $*
59     #
60     # <azarah@gentoo.org> (11 Nov 2002)
61     #
62     draw_line() {
63     local i=0
64     local str_length=""
65    
66     # Handle calls that do not have args, or wc not being installed ...
67     if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
68     then
69     echo "==============================================================="
70     return 0
71     fi
72    
73     # Get the length of $*
74     str_length="$(echo -n "$*" | wc -m)"
75 danarmak 1.32
76 azarah 1.5 while [ "$i" -lt "${str_length}" ]
77     do
78     echo -n "="
79 danarmak 1.32
80 azarah 1.5 i=$((i + 1))
81     done
82    
83     echo
84    
85     return 0
86     }
87 azarah 1.2
88     # Default directory where patches are located
89     EPATCH_SOURCE="${WORKDIR}/patch"
90     # Default extension for patches
91     EPATCH_SUFFIX="patch.bz2"
92     # Default options for patch
93 solar 1.55 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
94     EPATCH_OPTS="-g0"
95 azarah 1.6 # List of patches not to apply. Not this is only file names,
96     # and not the full path ..
97     EPATCH_EXCLUDE=""
98 azarah 1.9 # Change the printed message for a single patch.
99     EPATCH_SINGLE_MSG=""
100 azarah 1.29 # Force applying bulk patches even if not following the style:
101     #
102     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
103     #
104     EPATCH_FORCE="no"
105 azarah 1.2
106     # This function is for bulk patching, or in theory for just one
107     # or two patches.
108     #
109     # It should work with .bz2, .gz, .zip and plain text patches.
110     # Currently all patches should be the same format.
111     #
112     # You do not have to specify '-p' option to patch, as it will
113     # try with -p0 to -p5 until it succeed, or fail at -p5.
114     #
115     # Above EPATCH_* variables can be used to control various defaults,
116     # bug they should be left as is to ensure an ebuild can rely on
117     # them for.
118     #
119 azarah 1.3 # Patches are applied in current directory.
120     #
121     # Bulk Patches should preferibly have the form of:
122 azarah 1.2 #
123     # ??_${ARCH}_foo.${EPATCH_SUFFIX}
124     #
125     # For example:
126     #
127     # 01_all_misc-fix.patch.bz2
128     # 02_sparc_another-fix.patch.bz2
129     #
130     # This ensures that there are a set order, and you can have ARCH
131     # specific patches.
132     #
133 azarah 1.3 # If you however give an argument to epatch(), it will treat it as a
134     # single patch that need to be applied if its a file. If on the other
135     # hand its a directory, it will set EPATCH_SOURCE to this.
136     #
137 azarah 1.2 # <azarah@gentoo.org> (10 Nov 2002)
138     #
139     epatch() {
140     local PIPE_CMD=""
141     local STDERR_TARGET="${T}/$$.out"
142 azarah 1.8 local PATCH_TARGET="${T}/$$.patch"
143     local PATCH_SUFFIX=""
144 azarah 1.3 local SINGLE_PATCH="no"
145 azarah 1.4 local x=""
146 azarah 1.3
147     if [ "$#" -gt 1 ]
148     then
149     eerror "Invalid arguments to epatch()"
150     die "Invalid arguments to epatch()"
151     fi
152    
153     if [ -n "$1" -a -f "$1" ]
154     then
155     SINGLE_PATCH="yes"
156 danarmak 1.32
157 azarah 1.4 local EPATCH_SOURCE="$1"
158     local EPATCH_SUFFIX="${1##*\.}"
159 danarmak 1.32
160 azarah 1.3 elif [ -n "$1" -a -d "$1" ]
161     then
162 azarah 1.29 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ...
163     if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ]
164     then
165     local EPATCH_SOURCE="$1/*"
166     else
167     local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168     fi
169 azarah 1.3 else
170 azarah 1.8 if [ ! -d ${EPATCH_SOURCE} ]
171     then
172 azarah 1.19 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
173     then
174     EPATCH_SOURCE="$1"
175     fi
176    
177 azarah 1.8 echo
178 azarah 1.11 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
179     eerror
180     eerror " ${EPATCH_SOURCE}"
181 azarah 1.8 echo
182     die "Cannot find \$EPATCH_SOURCE!"
183     fi
184 danarmak 1.32
185 azarah 1.4 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
186 azarah 1.3 fi
187 azarah 1.2
188     case ${EPATCH_SUFFIX##*\.} in
189     bz2)
190     PIPE_CMD="bzip2 -dc"
191 azarah 1.8 PATCH_SUFFIX="bz2"
192 azarah 1.2 ;;
193 azarah 1.6 gz|Z|z)
194 azarah 1.2 PIPE_CMD="gzip -dc"
195 azarah 1.8 PATCH_SUFFIX="gz"
196 azarah 1.2 ;;
197 azarah 1.6 ZIP|zip)
198 azarah 1.2 PIPE_CMD="unzip -p"
199 azarah 1.8 PATCH_SUFFIX="zip"
200 azarah 1.2 ;;
201     *)
202     PIPE_CMD="cat"
203 azarah 1.8 PATCH_SUFFIX="patch"
204 azarah 1.2 ;;
205     esac
206    
207 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
208     then
209     einfo "Applying various patches (bugfixes/updates)..."
210     fi
211     for x in ${EPATCH_SOURCE}
212 azarah 1.2 do
213     # New ARCH dependant patch naming scheme...
214     #
215     # ???_arch_foo.patch
216     #
217     if [ -f ${x} ] && \
218 azarah 1.29 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
219     [ "${EPATCH_FORCE}" = "yes" ])
220 azarah 1.2 then
221     local count=0
222     local popts="${EPATCH_OPTS}"
223 azarah 1.6
224     if [ -n "${EPATCH_EXCLUDE}" ]
225     then
226 azarah 1.9 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
227 azarah 1.6 then
228     continue
229     fi
230     fi
231 danarmak 1.32
232 azarah 1.3 if [ "${SINGLE_PATCH}" = "yes" ]
233     then
234 azarah 1.9 if [ -n "${EPATCH_SINGLE_MSG}" ]
235     then
236     einfo "${EPATCH_SINGLE_MSG}"
237     else
238     einfo "Applying ${x##*/}..."
239     fi
240 azarah 1.3 else
241     einfo " ${x##*/}..."
242     fi
243 azarah 1.2
244 azarah 1.8 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 azarah 1.2
247     # Allow for prefix to differ ... im lazy, so shoot me :/
248     while [ "${count}" -lt 5 ]
249     do
250 azarah 1.5 # Generate some useful debug info ...
251 azarah 1.8 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
252     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253    
254     if [ "${PATCH_SUFFIX}" != "patch" ]
255     then
256     echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
257     echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
258     else
259     PATCH_TARGET="${x}"
260     fi
261 danarmak 1.32
262 azarah 1.8 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
263     echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264 danarmak 1.32
265 azarah 1.8 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267    
268     if [ "${PATCH_SUFFIX}" != "patch" ]
269     then
270     if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
271     then
272     echo
273     eerror "Could not extract patch!"
274     #die "Could not extract patch!"
275     count=5
276     break
277     fi
278     fi
279 danarmak 1.32
280 azarah 1.19 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
281 azarah 1.2 then
282 azarah 1.8 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
284     echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
285     echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
286     draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287    
288 azarah 1.19 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
289 azarah 1.8
290     if [ "$?" -ne 0 ]
291     then
292     cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
293     echo
294     eerror "A dry-run of patch command succeeded, but actually"
295     eerror "applying the patch failed!"
296     #die "Real world sux compared to the dreamworld!"
297     count=5
298     fi
299    
300     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
301 danarmak 1.32
302 azarah 1.2 break
303     fi
304    
305     count=$((count + 1))
306     done
307    
308 azarah 1.8 if [ "${PATCH_SUFFIX}" != "patch" ]
309     then
310     rm -f ${PATCH_TARGET}
311     fi
312    
313 azarah 1.2 if [ "${count}" -eq 5 ]
314     then
315 azarah 1.8 echo
316 azarah 1.2 eerror "Failed Patch: ${x##*/}!"
317     eerror
318     eerror "Include in your bugreport the contents of:"
319     eerror
320 azarah 1.8 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
321     echo
322 azarah 1.2 die "Failed Patch: ${x##*/}!"
323     fi
324 azarah 1.8
325     rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
326 azarah 1.3
327     eend 0
328 azarah 1.2 fi
329     done
330 azarah 1.3 if [ "${SINGLE_PATCH}" = "no" ]
331     then
332     einfo "Done with patching"
333 azarah 1.10 fi
334 azarah 1.26 }
335    
336     # This function return true if we are using the NPTL pthreads
337     # implementation.
338     #
339     # <azarah@gentoo.org> (06 March 2003)
340     #
341    
342     have_NPTL() {
343    
344     cat > ${T}/test-nptl.c <<-"END"
345     #define _XOPEN_SOURCE
346     #include <unistd.h>
347     #include <stdio.h>
348    
349     int main()
350     {
351     char buf[255];
352     char *str = buf;
353    
354     confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
355     if (NULL != str) {
356     printf("%s\n", str);
357     if (NULL != strstr(str, "NPTL"))
358     return 0;
359     }
360    
361     return 1;
362     }
363     END
364    
365     einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
366     if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
367     then
368     echo "yes"
369     einfon "Checking what PTHREADS implementation we have ... "
370     if ${T}/nptl
371     then
372     return 0
373     else
374     return 1
375     fi
376     else
377     echo "no"
378     fi
379    
380     return 1
381 azarah 1.10 }
382    
383     # This function check how many cpu's are present, and then set
384     # -j in MAKEOPTS accordingly.
385     #
386     # Thanks to nall <nall@gentoo.org> for this.
387     #
388     get_number_of_jobs() {
389 azarah 1.13 local jobs=0
390    
391 azarah 1.10 if [ ! -r /proc/cpuinfo ]
392     then
393     return 1
394     fi
395    
396 azarah 1.14 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
397     if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
398     then
399     ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
400 azarah 1.17 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
401     ADMINPARAM="${ADMINPARAM/-j}"
402 azarah 1.14 fi
403    
404 azarah 1.17 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
405 danarmak 1.32
406 drobbins 1.35 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
407 avenj 1.54 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
408 azarah 1.10 then
409 zwelch 1.21 # these archs will always have "[Pp]rocessor"
410     jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
411 danarmak 1.32
412 azarah 1.10 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
413     then
414     # sparc always has "ncpus active"
415 azarah 1.13 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
416 danarmak 1.32
417 azarah 1.10 elif [ "${ARCH}" = "alpha" ]
418     then
419     # alpha has "cpus active", but only when compiled with SMP
420 azarah 1.13 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
421 azarah 1.10 then
422 azarah 1.13 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 azarah 1.10 else
424 azarah 1.13 jobs=2
425 azarah 1.10 fi
426 danarmak 1.32
427 azarah 1.10 elif [ "${ARCH}" = "ppc" ]
428     then
429     # ppc has "processor", but only when compiled with SMP
430 azarah 1.13 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 azarah 1.10 then
432 azarah 1.13 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
433 azarah 1.10 else
434 azarah 1.13 jobs=2
435 azarah 1.10 fi
436     else
437 azarah 1.13 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
438 azarah 1.10 die "Unknown ARCH -- ${ARCH}!"
439 azarah 1.3 fi
440 azarah 1.13
441     # Make sure the number is valid ...
442     if [ "${jobs}" -lt 1 ]
443     then
444     jobs=1
445     fi
446 danarmak 1.32
447 azarah 1.15 if [ -n "${ADMINPARAM}" ]
448 azarah 1.14 then
449 azarah 1.15 if [ "${jobs}" -gt "${ADMINPARAM}" ]
450     then
451     einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
452     export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
453     else
454     einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
455     export MAKEOPTS="${MAKEOPTS} -j${jobs}"
456     fi
457 azarah 1.14 fi
458 azarah 1.1 }
459    
460 vapier 1.52 # Cheap replacement for when debianutils (and thus mktemp)
461     # do not exist on the users system
462     # vapier@gentoo.org
463     #
464     # Takes just 1 parameter (the directory to create tmpfile in)
465     mymktemp() {
466 azarah 1.59 local topdir="$1"
467    
468 vapier 1.52 [ -z "${topdir}" ] && topdir=/tmp
469 azarah 1.59 if [ "`which mktemp 2>/dev/null`" ]
470     then
471 vapier 1.52 mktemp -p ${topdir}
472     else
473     local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474     touch ${tmp}
475     echo ${tmp}
476     fi
477     }
478    
479 vapier 1.23 # Simplify/standardize adding users to the system
480     # vapier@gentoo.org
481     #
482     # enewuser(username, uid, shell, homedir, groups, extra options)
483     #
484     # Default values if you do not specify any:
485     # username: REQUIRED !
486     # uid: next available (see useradd(8))
487 vapier 1.27 # note: pass -1 to get default behavior
488 vapier 1.23 # shell: /bin/false
489     # homedir: /dev/null
490     # groups: none
491     # extra: comment of 'added by portage for ${PN}'
492     enewuser() {
493     # get the username
494     local euser="$1"; shift
495 azarah 1.59 if [ -z "${euser}" ]
496     then
497 vapier 1.23 eerror "No username specified !"
498     die "Cannot call enewuser without a username"
499     fi
500    
501     # setup a file for testing usernames/groups
502 vapier 1.52 local tmpfile="`mymktemp ${T}`"
503 vapier 1.23 chown ${euser} ${tmpfile} >& /dev/null
504     local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
505    
506     # see if user already exists
507 azarah 1.59 if [ "${euser}" == "${realuser}" ]
508     then
509 vapier 1.23 return 0
510     fi
511 wolf31o2 1.44 einfo "Adding user '${euser}' to your system ..."
512 vapier 1.23
513     # options to pass to useradd
514 azarah 1.59 local opts=
515 vapier 1.23
516     # handle uid
517     local euid="$1"; shift
518 azarah 1.59 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519     then
520     if [ "${euid}" -gt 0 ]
521     then
522 vapier 1.23 opts="${opts} -u ${euid}"
523     else
524     eerror "Userid given but is not greater than 0 !"
525     die "${euid} is not a valid UID"
526     fi
527     else
528     euid="next available"
529     fi
530     einfo " - Userid: ${euid}"
531    
532     # handle shell
533     local eshell="$1"; shift
534 azarah 1.59 if [ ! -z "${eshell}" ]
535     then
536     if [ ! -e "${eshell}" ]
537     then
538 vapier 1.23 eerror "A shell was specified but it does not exist !"
539     die "${eshell} does not exist"
540     fi
541     else
542 azarah 1.59 eshell="/bin/false"
543 vapier 1.23 fi
544     einfo " - Shell: ${eshell}"
545     opts="${opts} -s ${eshell}"
546    
547     # handle homedir
548     local ehome="$1"; shift
549 azarah 1.59 if [ -z "${ehome}" ]
550     then
551     ehome="/dev/null"
552 vapier 1.23 fi
553     einfo " - Home: ${ehome}"
554     opts="${opts} -d ${ehome}"
555    
556     # handle groups
557     local egroups="$1"; shift
558 azarah 1.59 if [ ! -z "${egroups}" ]
559     then
560     local realgroup=
561 vapier 1.23 local oldifs="${IFS}"
562     export IFS=","
563 azarah 1.59 for g in ${egroups}
564     do
565 vapier 1.23 chgrp ${g} ${tmpfile} >& /dev/null
566     realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
567 azarah 1.59 if [ "${g}" != "${realgroup}" ]
568     then
569 vapier 1.23 eerror "You must add ${g} to the system first"
570     die "${g} is not a valid GID"
571     fi
572     done
573     export IFS="${oldifs}"
574     opts="${opts} -g ${egroups}"
575     else
576     egroups="(none)"
577     fi
578     einfo " - Groups: ${egroups}"
579    
580     # handle extra and add the user
581     local eextra="$@"
582 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
583 vapier 1.23 export SANDBOX_ON="0"
584 azarah 1.59 if [ -z "${eextra}" ]
585     then
586 vapier 1.23 useradd ${opts} ${euser} \
587     -c "added by portage for ${PN}" \
588     || die "enewuser failed"
589     else
590     einfo " - Extra: ${eextra}"
591     useradd ${opts} ${euser} ${eextra} \
592 danarmak 1.32 || die "enewuser failed"
593 vapier 1.23 fi
594     export SANDBOX_ON="${oldsandbox}"
595    
596 azarah 1.59 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597     then
598 vapier 1.23 einfo " - Creating ${ehome} in ${D}"
599     dodir ${ehome}
600 vapier 1.37 fowners ${euser} ${ehome}
601 vapier 1.38 fperms 755 ${ehome}
602 vapier 1.23 fi
603     }
604    
605     # Simplify/standardize adding groups to the system
606     # vapier@gentoo.org
607     #
608     # enewgroup(group, gid)
609     #
610     # Default values if you do not specify any:
611     # groupname: REQUIRED !
612     # gid: next available (see groupadd(8))
613     # extra: none
614     enewgroup() {
615     # get the group
616     local egroup="$1"; shift
617 azarah 1.59 if [ -z "${egroup}" ]
618     then
619 vapier 1.23 eerror "No group specified !"
620     die "Cannot call enewgroup without a group"
621     fi
622    
623     # setup a file for testing groupname
624 vapier 1.52 local tmpfile="`mymktemp ${T}`"
625 vapier 1.23 chgrp ${egroup} ${tmpfile} >& /dev/null
626     local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
627    
628     # see if group already exists
629 azarah 1.59 if [ "${egroup}" == "${realgroup}" ]
630     then
631 vapier 1.23 return 0
632     fi
633 wolf31o2 1.44 einfo "Adding group '${egroup}' to your system ..."
634 vapier 1.23
635     # options to pass to useradd
636 azarah 1.59 local opts=
637 vapier 1.23
638     # handle gid
639     local egid="$1"; shift
640 azarah 1.59 if [ ! -z "${egid}" ]
641     then
642     if [ "${egid}" -gt 0 ]
643     then
644 vapier 1.23 opts="${opts} -g ${egid}"
645     else
646     eerror "Groupid given but is not greater than 0 !"
647     die "${egid} is not a valid GID"
648     fi
649     else
650     egid="next available"
651     fi
652     einfo " - Groupid: ${egid}"
653    
654     # handle extra
655     local eextra="$@"
656     opts="${opts} ${eextra}"
657    
658     # add the group
659 azarah 1.59 local oldsandbox="${SANDBOX_ON}"
660 vapier 1.23 export SANDBOX_ON="0"
661     groupadd ${opts} ${egroup} || die "enewgroup failed"
662     export SANDBOX_ON="${oldsandbox}"
663 vapier 1.24 }
664    
665     # Simple script to replace 'dos2unix' binaries
666     # vapier@gentoo.org
667     #
668     # edos2unix(file, <more files>...)
669     edos2unix() {
670 vapier 1.61 for f in "$@"
671 azarah 1.59 do
672 vapier 1.61 cp "${f}" ${T}/edos2unix
673     sed 's/\r$//' ${T}/edos2unix > "${f}"
674 vapier 1.24 done
675 vapier 1.39 }
676    
677     # Make a desktop file !
678     # Great for making those icons in kde/gnome startmenu !
679     # Amaze your friends ! Get the women ! Join today !
680     # gnome2 /usr/share/applications
681     # gnome1 /usr/share/gnome/apps/
682     # KDE ${KDEDIR}/share/applnk /usr/share/applnk
683     #
684     # make_desktop_entry(<binary>, [name], [icon], [type], [path])
685     #
686     # binary: what binary does the app run with ?
687     # name: the name that will show up in the menu
688     # icon: give your little like a pretty little icon ...
689     # this can be relative (to /usr/share/pixmaps) or
690     # a full path to an icon
691     # type: what kind of application is this ? for categories:
692     # http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
693     # path: if your app needs to startup in a specific dir
694     make_desktop_entry() {
695     [ -z "$1" ] && eerror "You must specify the executable" && return 1
696    
697 azarah 1.59 local exec="${1}"
698     local name="${2:-${PN}}"
699     local icon="${3:-${PN}.png}"
700     local type="${4}"
701     local path="${5:-${GAMES_PREFIX}}"
702     if [ -z "${type}" ]
703     then
704 vapier 1.39 case ${CATEGORY} in
705 azarah 1.59 "app-emulation")
706     type=Emulator
707     ;;
708     "games-"*)
709     type=Game
710     ;;
711     *)
712     type=
713     ;;
714 vapier 1.39 esac
715     fi
716 azarah 1.59 local desktop="${T}/${exec}.desktop"
717 vapier 1.39
718     echo "[Desktop Entry]
719     Encoding=UTF-8
720     Version=0.9.2
721     Name=${name}
722     Type=Application
723     Comment=${DESCRIPTION}
724     Exec=${exec}
725     Path=${path}
726     Icon=${icon}
727 vapier 1.40 Categories=Application;${type};" > ${desktop}
728 vapier 1.39
729 azarah 1.59 if [ -d "/usr/share/applications" ]
730     then
731 vapier 1.39 insinto /usr/share/applications
732 vapier 1.40 doins ${desktop}
733 vapier 1.39 fi
734    
735 azarah 1.59 #if [ -d "/usr/share/gnome/apps" ]
736     #then
737 vapier 1.40 # insinto /usr/share/gnome/apps/Games
738     # doins ${desktop}
739     #fi
740    
741 azarah 1.59 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
742     #then
743     # for ver in /usr/kde/*
744     # do
745 vapier 1.40 # insinto ${ver}/share/applnk/Games
746     # doins ${desktop}
747     # done
748     #fi
749 vapier 1.39
750 azarah 1.59 if [ -d "/usr/share/applnk" ]
751     then
752 vapier 1.40 insinto /usr/share/applnk/${type}
753     doins ${desktop}
754 vapier 1.39 fi
755    
756     return 0
757 danarmak 1.32 }
758    
759 danarmak 1.34 # new convenience patch wrapper function to eventually replace epatch(),
760     # $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
761     # /usr/bin/patch
762 danarmak 1.32 # Features:
763     # - bulk patch handling similar to epatch()'s
764     # - automatic patch level detection like epatch()'s
765 danarmak 1.34 # - automatic patch uncompression like epatch()'s
766     # - doesn't have the --dry-run overhead of epatch() - inspects patchfiles
767     # manually instead
768     # - once I decide it's production-ready, it'll be called from base_src_unpack
769     # to handle $PATCHES to avoid defining src_unpack just to use xpatch
770 danarmak 1.32
771     # accepts zero or more parameters specifying patchfiles and/or patchdirs
772    
773     # known issues:
774 danarmak 1.34 # - only supports unified style patches (does anyone _really_ use anything
775     # else?)
776     # - because it doesn't use --dry-run there is a risk of it failing
777     # to find the files to patch, ie detect the patchlevel, properly. It doesn't use
778     # any of the backup heuristics that patch employs to discover a filename.
779     # however, this isn't dangerous because if it works for the developer who's
780     # writing the ebuild, it'll always work for the users, and if it doesn't,
781     # then we'll fix it :-)
782     # - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
783 danarmak 1.32 xpatch() {
784    
785 azarah 1.59 debug-print-function ${FUNCNAME} $*
786 danarmak 1.32
787 azarah 1.59 local list=
788     local list2=
789 danarmak 1.32 declare -i plevel
790    
791     # parse patch sources
792 azarah 1.59 for x in $*
793     do
794     debug-print "${FUNCNAME}: parsing parameter ${x}"
795     if [ -f "${x}" ]
796     then
797     list="${list} ${x}"
798     elif [ -d "${x}" ]
799     then
800 danarmak 1.32 # handles patchdirs like epatch() for now: no recursion.
801     # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
802     # only patches with _$ARCH_ or _all_ in their filenames are applied.
803 azarah 1.59 for file in `ls -A ${x}`
804     do
805     debug-print "${FUNCNAME}: parsing in subdir: file ${file}"
806     if [ -f "${x}/${file}" -a "${file}" != "${file/_all_}" -o \
807     "${file}" != "${file/_$ARCH_}" ]
808     then
809     list2="${list2} ${x}/${file}"
810 danarmak 1.32 fi
811     done
812 azarah 1.59 list="`echo ${list2} | sort` ${list}"
813 danarmak 1.32 else
814 azarah 1.59 die "Couldn't find ${x}"
815 danarmak 1.32 fi
816     done
817    
818 azarah 1.59 debug-print "${FUNCNAME}: final list of patches: ${list}"
819 danarmak 1.32
820 azarah 1.59 for x in ${list};
821     do
822     debug-print "${FUNCNAME}: processing ${x}"
823 danarmak 1.32 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
824 azarah 1.59 case "`/usr/bin/file -b ${x}`" in
825     *gzip*)
826     patchfile="${T}/current.patch"
827     ungzip -c "${x}" > "${patchfile}"
828     ;;
829     *bzip2*)
830     patchfile="${T}/current.patch"
831     bunzip2 -c "${x}" > "${patchfile}"
832     ;;
833     *text*)
834     patchfile="${x}"
835     ;;
836     *)
837     die "Could not determine filetype of patch ${x}"
838     ;;
839 danarmak 1.32 esac
840 azarah 1.59 debug-print "${FUNCNAME}: patchfile=${patchfile}"
841 danarmak 1.32
842     # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
843 azarah 1.59 target="`/bin/grep -m 1 '^+++ ' ${patchfile}`"
844     debug-print "${FUNCNAME}: raw target=${target}"
845 danarmak 1.34 # strip target down to the path/filename, remove leading +++
846     target="${target/+++ }"; target="${target%% *}"
847     # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
848     # to discard them as well to calculate the correct patchlevel.
849     target="${target//\/\//\/}"
850 azarah 1.59 debug-print "${FUNCNAME}: stripped target=${target}"
851 danarmak 1.32
852     # look for target
853 azarah 1.59 for basedir in "${S}" "${WORKDIR}" "${PWD}"; do
854     debug-print "${FUNCNAME}: looking in basedir=${basedir}"
855     cd "${basedir}"
856 danarmak 1.32
857     # try stripping leading directories
858 azarah 1.59 target2="${target}"
859 danarmak 1.32 plevel=0
860 azarah 1.59 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
861     while [ ! -f "${target2}" ]
862     do
863 danarmak 1.32 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
864 azarah 1.59 plevel=$((plevel+1))
865     debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
866     [ "${target2}" == "${target2/\/}" ] && break
867 danarmak 1.32 done
868 azarah 1.59 test -f "${target2}" && break
869 danarmak 1.32
870     # try stripping filename - needed to support patches creating new files
871     target2="${target%/*}"
872     plevel=0
873 azarah 1.59 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
874     while [ ! -d "${target2}" ]
875     do
876 danarmak 1.32 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
877 azarah 1.59 plevel=$((plevel+1))
878     debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
879     [ "${target2}" == "${target2/\/}" ] && break
880 danarmak 1.32 done
881 azarah 1.59 test -d "${target2}" && break
882 danarmak 1.32
883     done
884    
885 azarah 1.59 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" \
886     || die "Could not determine patchlevel for ${x}"
887     debug-print "${FUNCNAME}: determined plevel=${plevel}"
888 danarmak 1.32 # do the patching
889     ebegin "Applying patch ${x##*/}..."
890 azarah 1.59 /usr/bin/patch -p${plevel} < "${patchfile}" > /dev/null \
891     || die "Failed to apply patch ${x}"
892 danarmak 1.32 eend $?
893    
894     done
895    
896 vapier 1.41 }
897    
898     # Unpack those pesky makeself generated files ...
899     # They're shell scripts with the binary package tagged onto
900     # the end of the archive. Loki utilized the format as does
901     # many other game companies.
902     #
903     # Usage: unpack_makeself [file to unpack] [offset]
904     # - If the file is not specified then unpack will utilize ${A}.
905     # - If the offset is not specified then we will attempt to extract
906     # the proper offset from the script itself.
907     unpack_makeself() {
908 azarah 1.59 local src="$1"
909     local skip="$2"
910 vapier 1.41
911 azarah 1.59 if [ -z "${src}" ]
912     then
913 vapier 1.50 src="${DISTDIR}/${A}"
914     else
915 azarah 1.59 if [ -e "${DISTDIR}/${src}" ]
916     then
917 vapier 1.50 src="${DISTDIR}/${src}"
918 azarah 1.59 elif [ -e "${PWD}/${src}" ]
919     then
920 vapier 1.50 src="${PWD}/${src}"
921 azarah 1.59 elif [ -e "${src}" ]
922     then
923 vapier 1.50 src="${src}"
924     fi
925     fi
926     [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}"
927    
928 azarah 1.59 local shrtsrc="`basename ${src}`"
929 vapier 1.41 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
930 azarah 1.59 if [ -z "${skip}" ]
931     then
932 vapier 1.41 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
933     local skip=0
934     case ${ver} in
935     1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
936     skip=`grep -a ^skip= ${src} | cut -d= -f2`
937     ;;
938     2.0|2.0.1)
939     skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
940     ;;
941 wolf31o2 1.48 2.1.1)
942 vapier 1.41 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
943 wolf31o2 1.48 let skip="skip + 1"
944     ;;
945 vapier 1.49 2.1.2)
946     skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
947     let skip="skip + 1"
948     ;;
949 wolf31o2 1.48 2.1.3)
950     skip=`grep -a ^offset= ${src} | awk '{print $3}'`
951 vapier 1.41 let skip="skip + 1"
952     ;;
953     *)
954     eerror "I'm sorry, but I was unable to support the Makeself file."
955     eerror "The version I detected was '${ver}'."
956     eerror "Please file a bug about the file ${shrtsrc} at"
957     eerror "http://bugs.gentoo.org/ so that support can be added."
958     die "makeself version '${ver}' not supported"
959     ;;
960     esac
961     debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
962     fi
963    
964     # we do this because otherwise a failure in gzip will cause 0 bytes to be sent
965     # to tar which will make tar not extract anything and exit with 0
966 vapier 1.62 tail -n +${skip} ${src} 2>/dev/null \
967     | gzip -cd 2>/dev/null \
968     | tar -x --no-same-owner -f - 2>/dev/null
969 vapier 1.49 local pipestatus="${PIPESTATUS[*]}"
970     pipestatus="${pipestatus// }"
971 azarah 1.59 if [ "${pipestatus//0}" != "" ]
972     then
973 vapier 1.46 # maybe it isnt gzipped ... they usually are, but not always ...
974 vapier 1.49 tail -n +${skip} ${src} | tar -x --no-same-owner -f - \
975 vapier 1.46 || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})"
976 wolf31o2 1.56 fi
977     }
978    
979     # Display a license for user to accept.
980     #
981     # Usage: check_license [license]
982     # - If the file is not specified then ${LICENSE} is used.
983     check_license() {
984 vapier 1.60 local lic=$1
985     if [ -z "${lic}" ] ; then
986     lic="${PORTDIR}/licenses/${LICENSE}"
987 wolf31o2 1.56 else
988 vapier 1.60 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
989     lic="${PORTDIR}/licenses/${src}"
990     elif [ -e "${PWD}/${src}" ] ; then
991     lic="${PWD}/${src}"
992     elif [ -e "${src}" ] ; then
993     lic="${src}"
994 wolf31o2 1.56 fi
995     fi
996 vapier 1.60 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
997 wolf31o2 1.56
998 vapier 1.60 # here is where we check for the licenses the user already
999     # accepted ... if we don't find a match, we make the user accept
1000     local alic
1001 vapier 1.63 for alic in "${ACCEPT_LICENSE}" ; do
1002 vapier 1.60 [ "${alic}" == "*" ] && return 0
1003     [ "${alic}" == "${lic}" ] && return 0
1004     done
1005    
1006     local licmsg="`mymktemp ${T}`"
1007     cat << EOF > ${licmsg}
1008     **********************************************************
1009     The following license outlines the terms of use of this
1010     package. You MUST accept this license for installation to
1011     continue. When you are done viewing, hit 'q'. If you
1012     CTRL+C out of this, the install will not run!
1013     **********************************************************
1014    
1015     EOF
1016     cat ${lic} >> ${licmsg}
1017     ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1018     einfon "Do you accept the terms of this license? [yes/no] "
1019     read alic
1020     case ${alic} in
1021     yes|Yes|y|Y)
1022     return 0
1023     ;;
1024     *)
1025     echo;echo;echo
1026     eerror "You MUST accept the license to continue! Exiting!"
1027     die "Failed to accept license"
1028     ;;
1029     esac
1030 vapier 1.23 }

  ViewVC Help
Powered by ViewVC 1.1.20