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

Diff of /eclass/eutils.eclass

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

Revision 1.12 Revision 1.59
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.59 2003/09/22 22:44:49 azarah 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.12 2002/12/14 21:46:25 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 themselves. 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
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,
68 return 0 70 return 0
69 fi 71 fi
70 72
71 # Get the length of $* 73 # Get the length of $*
72 str_length="$(echo -n "$*" | wc -m)" 74 str_length="$(echo -n "$*" | wc -m)"
73 75
74 while [ "$i" -lt "${str_length}" ] 76 while [ "$i" -lt "${str_length}" ]
75 do 77 do
76 echo -n "=" 78 echo -n "="
77 79
78 i=$((i + 1)) 80 i=$((i + 1))
79 done 81 done
80 82
81 echo 83 echo
82 84
86# Default directory where patches are located 88# Default directory where patches are located
87EPATCH_SOURCE="${WORKDIR}/patch" 89EPATCH_SOURCE="${WORKDIR}/patch"
88# Default extension for patches 90# Default extension for patches
89EPATCH_SUFFIX="patch.bz2" 91EPATCH_SUFFIX="patch.bz2"
90# Default options for patch 92# Default options for patch
93# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
91EPATCH_OPTS="" 94EPATCH_OPTS="-g0"
92# List of patches not to apply. Not this is only file names, 95# List of patches not to apply. Not this is only file names,
93# and not the full path .. 96# and not the full path ..
94EPATCH_EXCLUDE="" 97EPATCH_EXCLUDE=""
95# Change the printed message for a single patch. 98# Change the printed message for a single patch.
96EPATCH_SINGLE_MSG="" 99EPATCH_SINGLE_MSG=""
100# Force applying bulk patches even if not following the style:
101#
102# ??_${ARCH}_foo.${EPATCH_SUFFIX}
103#
104EPATCH_FORCE="no"
97 105
98# This function is for bulk patching, or in theory for just one 106# This function is for bulk patching, or in theory for just one
99# or two patches. 107# or two patches.
100# 108#
101# It should work with .bz2, .gz, .zip and plain text patches. 109# It should work with .bz2, .gz, .zip and plain text patches.
143 fi 151 fi
144 152
145 if [ -n "$1" -a -f "$1" ] 153 if [ -n "$1" -a -f "$1" ]
146 then 154 then
147 SINGLE_PATCH="yes" 155 SINGLE_PATCH="yes"
148 156
149 local EPATCH_SOURCE="$1" 157 local EPATCH_SOURCE="$1"
150 local EPATCH_SUFFIX="${1##*\.}" 158 local EPATCH_SUFFIX="${1##*\.}"
151 159
152 elif [ -n "$1" -a -d "$1" ] 160 elif [ -n "$1" -a -d "$1" ]
153 then 161 then
162 # 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
154 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 167 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168 fi
155 else 169 else
156 if [ ! -d ${EPATCH_SOURCE} ] 170 if [ ! -d ${EPATCH_SOURCE} ]
157 then 171 then
172 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
173 then
174 EPATCH_SOURCE="$1"
175 fi
176
158 echo 177 echo
159 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:" 178 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
160 eerror 179 eerror
161 eerror " ${EPATCH_SOURCE}" 180 eerror " ${EPATCH_SOURCE}"
162 echo 181 echo
163 die "Cannot find \$EPATCH_SOURCE!" 182 die "Cannot find \$EPATCH_SOURCE!"
164 fi 183 fi
165 184
166 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 185 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
167 fi 186 fi
168 187
169 case ${EPATCH_SUFFIX##*\.} in 188 case ${EPATCH_SUFFIX##*\.} in
170 bz2) 189 bz2)
194 # New ARCH dependant patch naming scheme... 213 # New ARCH dependant patch naming scheme...
195 # 214 #
196 # ???_arch_foo.patch 215 # ???_arch_foo.patch
197 # 216 #
198 if [ -f ${x} ] && \ 217 if [ -f ${x} ] && \
199 [ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] 218 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
219 [ "${EPATCH_FORCE}" = "yes" ])
200 then 220 then
201 local count=0 221 local count=0
202 local popts="${EPATCH_OPTS}" 222 local popts="${EPATCH_OPTS}"
203 223
204 if [ -n "${EPATCH_EXCLUDE}" ] 224 if [ -n "${EPATCH_EXCLUDE}" ]
206 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 226 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
207 then 227 then
208 continue 228 continue
209 fi 229 fi
210 fi 230 fi
211 231
212 if [ "${SINGLE_PATCH}" = "yes" ] 232 if [ "${SINGLE_PATCH}" = "yes" ]
213 then 233 then
214 if [ -n "${EPATCH_SINGLE_MSG}" ] 234 if [ -n "${EPATCH_SINGLE_MSG}" ]
215 then 235 then
216 einfo "${EPATCH_SINGLE_MSG}" 236 einfo "${EPATCH_SINGLE_MSG}"
236 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 256 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
237 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 257 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
238 else 258 else
239 PATCH_TARGET="${x}" 259 PATCH_TARGET="${x}"
240 fi 260 fi
241 261
242 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
243 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 263 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 264
245 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
247 267
248 if [ "${PATCH_SUFFIX}" != "patch" ] 268 if [ "${PATCH_SUFFIX}" != "patch" ]
249 then 269 then
254 #die "Could not extract patch!" 274 #die "Could not extract patch!"
255 count=5 275 count=5
256 break 276 break
257 fi 277 fi
258 fi 278 fi
259 279
260 if patch ${popts} --dry-run -f -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 280 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
261 then 281 then
262 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
263 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
264 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 285 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 286 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
267 287
268 patch ${popts} -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 288 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
269 289
270 if [ "$?" -ne 0 ] 290 if [ "$?" -ne 0 ]
271 then 291 then
272 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 292 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
273 echo 293 echo
276 #die "Real world sux compared to the dreamworld!" 296 #die "Real world sux compared to the dreamworld!"
277 count=5 297 count=5
278 fi 298 fi
279 299
280 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 300 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
281 301
282 break 302 break
283 fi 303 fi
284 304
285 count=$((count + 1)) 305 count=$((count + 1))
286 done 306 done
311 then 331 then
312 einfo "Done with patching" 332 einfo "Done with patching"
313 fi 333 fi
314} 334}
315 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
342have_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}
382
316# This function check how many cpu's are present, and then set 383# This function check how many cpu's are present, and then set
317# -j in MAKEOPTS accordingly. 384# -j in MAKEOPTS accordingly.
318# 385#
319# Thanks to nall <nall@gentoo.org> for this. 386# Thanks to nall <nall@gentoo.org> for this.
320# 387#
321get_number_of_jobs() { 388get_number_of_jobs() {
389 local jobs=0
390
322 if [ ! -r /proc/cpuinfo ] 391 if [ ! -r /proc/cpuinfo ]
323 then 392 then
324 return 1 393 return 1
325 fi 394 fi
326 395
396 # 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 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
401 ADMINPARAM="${ADMINPARAM/-j}"
402 fi
403
327 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j[0-9]*::g'`" 404 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
405
406 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
407 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
408 then
409 # these archs will always have "[Pp]rocessor"
410 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
411
412 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
413 then
414 # sparc always has "ncpus active"
415 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
416
417 elif [ "${ARCH}" = "alpha" ]
418 then
419 # alpha has "cpus active", but only when compiled with SMP
420 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
421 then
422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
423 else
424 jobs=2
425 fi
426
427 elif [ "${ARCH}" = "ppc" ]
428 then
429 # ppc has "processor", but only when compiled with SMP
430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
431 then
432 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
433 else
434 jobs=2
435 fi
436 else
437 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
438 die "Unknown ARCH -- ${ARCH}!"
439 fi
440
441 # Make sure the number is valid ...
442 if [ "${jobs}" -lt 1 ]
443 then
444 jobs=1
445 fi
446
447 if [ -n "${ADMINPARAM}" ]
448 then
449 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 fi
458}
459
460# 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)
465mymktemp() {
466 local topdir="$1"
328 467
329 if [ "${ARCH}" = "x86" ] 468 [ -z "${topdir}" ] && topdir=/tmp
469 if [ "`which mktemp 2>/dev/null`" ]
470 then
471 mktemp -p ${topdir}
472 else
473 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
474 touch ${tmp}
475 echo ${tmp}
476 fi
477}
478
479# 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# note: pass -1 to get default behavior
488# shell: /bin/false
489# homedir: /dev/null
490# groups: none
491# extra: comment of 'added by portage for ${PN}'
492enewuser() {
493 # get the username
494 local euser="$1"; shift
495 if [ -z "${euser}" ]
496 then
497 eerror "No username specified !"
498 die "Cannot call enewuser without a username"
499 fi
500
501 # setup a file for testing usernames/groups
502 local tmpfile="`mymktemp ${T}`"
503 chown ${euser} ${tmpfile} >& /dev/null
504 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
505
506 # see if user already exists
507 if [ "${euser}" == "${realuser}" ]
508 then
509 return 0
510 fi
511 einfo "Adding user '${euser}' to your system ..."
512
513 # options to pass to useradd
514 local opts=
515
516 # handle uid
517 local euid="$1"; shift
518 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ]
519 then
520 if [ "${euid}" -gt 0 ]
330 then 521 then
331 # x86 always has "processor" 522 opts="${opts} -u ${euid}"
332 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^processor /proc/cpuinfo` * 2))" 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 if [ ! -z "${eshell}" ]
535 then
536 if [ ! -e "${eshell}" ]
537 then
538 eerror "A shell was specified but it does not exist !"
539 die "${eshell} does not exist"
540 fi
541 else
542 eshell="/bin/false"
543 fi
544 einfo " - Shell: ${eshell}"
545 opts="${opts} -s ${eshell}"
546
547 # handle homedir
548 local ehome="$1"; shift
549 if [ -z "${ehome}" ]
550 then
551 ehome="/dev/null"
552 fi
553 einfo " - Home: ${ehome}"
554 opts="${opts} -d ${ehome}"
555
556 # handle groups
557 local egroups="$1"; shift
558 if [ ! -z "${egroups}" ]
559 then
560 local realgroup=
561 local oldifs="${IFS}"
562 export IFS=","
563 for g in ${egroups}
564 do
565 chgrp ${g} ${tmpfile} >& /dev/null
566 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
567 if [ "${g}" != "${realgroup}" ]
568 then
569 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 local oldsandbox="${SANDBOX_ON}"
583 export SANDBOX_ON="0"
584 if [ -z "${eextra}" ]
585 then
586 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 || die "enewuser failed"
593 fi
594 export SANDBOX_ON="${oldsandbox}"
595
596 if [ ! -e "${ehome}" ] && [ ! -e "${D}/${ehome}" ]
597 then
598 einfo " - Creating ${ehome} in ${D}"
599 dodir ${ehome}
600 fowners ${euser} ${ehome}
601 fperms 755 ${ehome}
602 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
614enewgroup() {
615 # get the group
616 local egroup="$1"; shift
617 if [ -z "${egroup}" ]
618 then
619 eerror "No group specified !"
620 die "Cannot call enewgroup without a group"
621 fi
622
623 # setup a file for testing groupname
624 local tmpfile="`mymktemp ${T}`"
625 chgrp ${egroup} ${tmpfile} >& /dev/null
626 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
627
628 # see if group already exists
629 if [ "${egroup}" == "${realgroup}" ]
630 then
631 return 0
632 fi
633 einfo "Adding group '${egroup}' to your system ..."
634
635 # options to pass to useradd
636 local opts=
637
638 # handle gid
639 local egid="$1"; shift
640 if [ ! -z "${egid}" ]
641 then
642 if [ "${egid}" -gt 0 ]
643 then
644 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 local oldsandbox="${SANDBOX_ON}"
660 export SANDBOX_ON="0"
661 groupadd ${opts} ${egroup} || die "enewgroup failed"
662 export SANDBOX_ON="${oldsandbox}"
663}
664
665# Simple script to replace 'dos2unix' binaries
666# vapier@gentoo.org
667#
668# edos2unix(file, <more files>...)
669edos2unix() {
670 for f in $@
671 do
672 cp ${f} ${T}/edos2unix
673 sed 's/\r$//' ${T}/edos2unix > ${f}
674 done
675}
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
694make_desktop_entry() {
695 [ -z "$1" ] && eerror "You must specify the executable" && return 1
696
697 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 case ${CATEGORY} in
705 "app-emulation")
706 type=Emulator
707 ;;
708 "games-"*)
709 type=Game
710 ;;
711 *)
712 type=
713 ;;
714 esac
715 fi
716 local desktop="${T}/${exec}.desktop"
717
718echo "[Desktop Entry]
719Encoding=UTF-8
720Version=0.9.2
721Name=${name}
722Type=Application
723Comment=${DESCRIPTION}
724Exec=${exec}
725Path=${path}
726Icon=${icon}
727Categories=Application;${type};" > ${desktop}
728
729 if [ -d "/usr/share/applications" ]
730 then
731 insinto /usr/share/applications
732 doins ${desktop}
733 fi
734
735 #if [ -d "/usr/share/gnome/apps" ]
736 #then
737 # insinto /usr/share/gnome/apps/Games
738 # doins ${desktop}
739 #fi
740
741 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
742 #then
743 # for ver in /usr/kde/*
744 # do
745 # insinto ${ver}/share/applnk/Games
746 # doins ${desktop}
747 # done
748 #fi
749
750 if [ -d "/usr/share/applnk" ]
751 then
752 insinto /usr/share/applnk/${type}
753 doins ${desktop}
754 fi
755
756 return 0
757}
758
759# new convenience patch wrapper function to eventually replace epatch(),
760# $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
761# /usr/bin/patch
762# Features:
763# - bulk patch handling similar to epatch()'s
764# - automatic patch level detection like epatch()'s
765# - 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
771# accepts zero or more parameters specifying patchfiles and/or patchdirs
772
773# known issues:
774# - 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).
783xpatch() {
784
785 debug-print-function ${FUNCNAME} $*
786
787 local list=
788 local list2=
789 declare -i plevel
790
791 # parse patch sources
792 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 # 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 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 fi
811 done
812 list="`echo ${list2} | sort` ${list}"
813 else
814 die "Couldn't find ${x}"
815 fi
816 done
817
818 debug-print "${FUNCNAME}: final list of patches: ${list}"
819
820 for x in ${list};
821 do
822 debug-print "${FUNCNAME}: processing ${x}"
823 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
824 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 esac
840 debug-print "${FUNCNAME}: patchfile=${patchfile}"
841
842 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
843 target="`/bin/grep -m 1 '^+++ ' ${patchfile}`"
844 debug-print "${FUNCNAME}: raw target=${target}"
845 # 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 debug-print "${FUNCNAME}: stripped target=${target}"
851
852 # look for target
853 for basedir in "${S}" "${WORKDIR}" "${PWD}"; do
854 debug-print "${FUNCNAME}: looking in basedir=${basedir}"
855 cd "${basedir}"
856
857 # try stripping leading directories
858 target2="${target}"
859 plevel=0
860 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
861 while [ ! -f "${target2}" ]
862 do
863 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
864 plevel=$((plevel+1))
865 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
866 [ "${target2}" == "${target2/\/}" ] && break
867 done
868 test -f "${target2}" && break
869
870 # try stripping filename - needed to support patches creating new files
871 target2="${target%/*}"
872 plevel=0
873 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
874 while [ ! -d "${target2}" ]
875 do
876 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
877 plevel=$((plevel+1))
878 debug-print "${FUNCNAME}: trying target2=${target2}, plevel=${plevel}"
879 [ "${target2}" == "${target2/\/}" ] && break
880 done
881 test -d "${target2}" && break
882
883 done
884
885 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" \
886 || die "Could not determine patchlevel for ${x}"
887 debug-print "${FUNCNAME}: determined plevel=${plevel}"
888 # do the patching
889 ebegin "Applying patch ${x##*/}..."
890 /usr/bin/patch -p${plevel} < "${patchfile}" > /dev/null \
891 || die "Failed to apply patch ${x}"
892 eend $?
893
894 done
895
896}
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.
907unpack_makeself() {
908 local src="$1"
909 local skip="$2"
910
911 if [ -z "${src}" ]
912 then
913 src="${DISTDIR}/${A}"
914 else
915 if [ -e "${DISTDIR}/${src}" ]
916 then
917 src="${DISTDIR}/${src}"
918 elif [ -e "${PWD}/${src}" ]
919 then
920 src="${PWD}/${src}"
921 elif [ -e "${src}" ]
922 then
923 src="${src}"
924 fi
925 fi
926 [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}"
927
928 local shrtsrc="`basename ${src}`"
929 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
930 if [ -z "${skip}" ]
931 then
932 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 2.1.1)
942 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
943 let skip="skip + 1"
944 ;;
945 2.1.2)
946 skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
947 let skip="skip + 1"
948 ;;
949 2.1.3)
950 skip=`grep -a ^offset= ${src} | awk '{print $3}'`
951 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 tail -n +${skip} ${src} | gzip -cd | tar -x --no-same-owner -f - 2>/dev/null
967 local pipestatus="${PIPESTATUS[*]}"
968 pipestatus="${pipestatus// }"
969 if [ "${pipestatus//0}" != "" ]
970 then
971 # maybe it isnt gzipped ... they usually are, but not always ...
972 tail -n +${skip} ${src} | tar -x --no-same-owner -f - \
973 || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})"
974 fi
975}
976
977# Display a license for user to accept.
978#
979# Usage: check_license [license]
980# - If the file is not specified then ${LICENSE} is used.
981check_license() {
982 local src="$1"
333 983
334 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] 984 if [ -z "${src}" ]
335 then
336 # sparc always has "ncpus active"
337 export MAKEOPTS="${MAKEOPTS} -j$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
338
339 elif [ "${ARCH}" = "alpha" ]
340 then
341 # alpha has "cpus active", but only when compiled with SMP
342 if [ "`grep -c "^cpus active" /proc/cpuinfo`" = "1" ]
343 then 985 then
344 export MAKEOPTS="${MAKEOPTS} -j$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 986 src="${PORTDIR}/licenses/${LICENSE}"
345 else 987 else
346 export MAKEOPTS="${MAKEOPTS} -j2" 988 if [ -e "${PORTDIR}/licenses/${src}" ]
347 fi
348
349 elif [ "${ARCH}" = "ppc" ]
350 then 989 then
351 # ppc has "processor", but only when compiled with SMP 990 src="${PORTDIR}/licenses/${src}"
352 if [ "`grep -c "^processor" /proc/cpuinfo`" = "1" ] 991 elif [ -e "${PWD}/${src}" ]
992 then
993 src="${PWD}/${src}"
994 elif [ -e "${src}" ]
995 then
996 src="${src}"
997 fi
998 fi
999 [ ! -e "${src}" ] && die "Could not find requested license ${src}"
1000
1001 # here is where we check for the license...
1002 # if we don't find one, we ask the user for it
1003 if [ ! -d "/usr/share/licenses" ]
353 then 1004 then
354 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^processor /proc/cpuinfo` * 2))" 1005 mkdir -p /usr/share/licenses
1006 fi
1007 if [ -f "/usr/share/licenses/${LICENSE}" ]
1008 then
1009 einfo "The license for this application has already been accepted."
355 else 1010 else
356 export MAKEOPTS="${MAKEOPTS} -j2" 1011 ewarn "You MUST accept this license for installation to continue."
1012 eerror "If you CTRL+C out of this, the install will not run!"
1013 echo
1014
1015 ${PAGER} ${src} || die "Could not execute ${PAGER} ${src}"
1016 einfo "Do you accept the terms of this license? [yes/no]"
1017 read ACCEPT_TERMS
1018 case ${ACCEPT_TERMS} in
1019 "yes"|"Yes"|"y"|"Y")
1020 cp ${src} /usr/share/licenses
1021 exit 0
1022 ;;
1023 *)
1024 eerror "You MUST accept the license to continue! Exiting!"
1025 die "Failed to accept license"
1026 ;;
1027 esac
357 fi 1028 fi
358 else
359 export MAKEOPTS="${MAKEOPTS} -j$((`grep -c ^cpu /proc/cpuinfo` * 2))"
360 die "Unknown ARCH -- ${ARCH}!"
361 fi
362} 1029}
363 1030

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.59

  ViewVC Help
Powered by ViewVC 1.1.20