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

Diff of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.41

  ViewVC Help
Powered by ViewVC 1.1.20