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

Diff of /eclass/eutils.eclass

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

Revision 1.26 Revision 1.56
1# Copyright 1999-2003 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.26 2003/03/06 20:35:26 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.56 2003/09/22 21:08:27 wolf31o2 Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
6# 6#
7# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
8# have to implement themselves. 8# have to implement themselves.
36# 36#
37gen_usr_ldscript() { 37gen_usr_ldscript() {
38 38
39 # Just make sure it exists 39 # Just make sure it exists
40 dodir /usr/lib 40 dodir /usr/lib
41 41
42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
43/* GNU ld script 43/* GNU ld script
44 Because Gentoo have critical dynamic libraries 44 Because Gentoo have critical dynamic libraries
45 in /lib, and the static versions in /usr/lib, we 45 in /lib, and the static versions in /usr/lib, we
46 need to have a "fake" dynamic lib in /usr/lib, 46 need to have a "fake" dynamic lib in /usr/lib,
70 return 0 70 return 0
71 fi 71 fi
72 72
73 # Get the length of $* 73 # Get the length of $*
74 str_length="$(echo -n "$*" | wc -m)" 74 str_length="$(echo -n "$*" | wc -m)"
75 75
76 while [ "$i" -lt "${str_length}" ] 76 while [ "$i" -lt "${str_length}" ]
77 do 77 do
78 echo -n "=" 78 echo -n "="
79 79
80 i=$((i + 1)) 80 i=$((i + 1))
81 done 81 done
82 82
83 echo 83 echo
84 84
88# Default directory where patches are located 88# Default directory where patches are located
89EPATCH_SOURCE="${WORKDIR}/patch" 89EPATCH_SOURCE="${WORKDIR}/patch"
90# Default extension for patches 90# Default extension for patches
91EPATCH_SUFFIX="patch.bz2" 91EPATCH_SUFFIX="patch.bz2"
92# Default options for patch 92# Default options for patch
93# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
93EPATCH_OPTS="" 94EPATCH_OPTS="-g0"
94# 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,
95# and not the full path .. 96# and not the full path ..
96EPATCH_EXCLUDE="" 97EPATCH_EXCLUDE=""
97# Change the printed message for a single patch. 98# Change the printed message for a single patch.
98EPATCH_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"
99 105
100# 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
101# or two patches. 107# or two patches.
102# 108#
103# It should work with .bz2, .gz, .zip and plain text patches. 109# It should work with .bz2, .gz, .zip and plain text patches.
145 fi 151 fi
146 152
147 if [ -n "$1" -a -f "$1" ] 153 if [ -n "$1" -a -f "$1" ]
148 then 154 then
149 SINGLE_PATCH="yes" 155 SINGLE_PATCH="yes"
150 156
151 local EPATCH_SOURCE="$1" 157 local EPATCH_SOURCE="$1"
152 local EPATCH_SUFFIX="${1##*\.}" 158 local EPATCH_SUFFIX="${1##*\.}"
153 159
154 elif [ -n "$1" -a -d "$1" ] 160 elif [ -n "$1" -a -d "$1" ]
155 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
156 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 167 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168 fi
157 else 169 else
158 if [ ! -d ${EPATCH_SOURCE} ] 170 if [ ! -d ${EPATCH_SOURCE} ]
159 then 171 then
160 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 172 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
161 then 173 then
167 eerror 179 eerror
168 eerror " ${EPATCH_SOURCE}" 180 eerror " ${EPATCH_SOURCE}"
169 echo 181 echo
170 die "Cannot find \$EPATCH_SOURCE!" 182 die "Cannot find \$EPATCH_SOURCE!"
171 fi 183 fi
172 184
173 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 185 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
174 fi 186 fi
175 187
176 case ${EPATCH_SUFFIX##*\.} in 188 case ${EPATCH_SUFFIX##*\.} in
177 bz2) 189 bz2)
201 # New ARCH dependant patch naming scheme... 213 # New ARCH dependant patch naming scheme...
202 # 214 #
203 # ???_arch_foo.patch 215 # ???_arch_foo.patch
204 # 216 #
205 if [ -f ${x} ] && \ 217 if [ -f ${x} ] && \
206 [ "${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" ])
207 then 220 then
208 local count=0 221 local count=0
209 local popts="${EPATCH_OPTS}" 222 local popts="${EPATCH_OPTS}"
210 223
211 if [ -n "${EPATCH_EXCLUDE}" ] 224 if [ -n "${EPATCH_EXCLUDE}" ]
213 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 226 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
214 then 227 then
215 continue 228 continue
216 fi 229 fi
217 fi 230 fi
218 231
219 if [ "${SINGLE_PATCH}" = "yes" ] 232 if [ "${SINGLE_PATCH}" = "yes" ]
220 then 233 then
221 if [ -n "${EPATCH_SINGLE_MSG}" ] 234 if [ -n "${EPATCH_SINGLE_MSG}" ]
222 then 235 then
223 einfo "${EPATCH_SINGLE_MSG}" 236 einfo "${EPATCH_SINGLE_MSG}"
243 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 256 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
244 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 257 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 else 258 else
246 PATCH_TARGET="${x}" 259 PATCH_TARGET="${x}"
247 fi 260 fi
248 261
249 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
250 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##*/}
251 264
252 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
254 267
255 if [ "${PATCH_SUFFIX}" != "patch" ] 268 if [ "${PATCH_SUFFIX}" != "patch" ]
256 then 269 then
261 #die "Could not extract patch!" 274 #die "Could not extract patch!"
262 count=5 275 count=5
263 break 276 break
264 fi 277 fi
265 fi 278 fi
266 279
267 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${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
268 then 281 then
269 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
270 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
271 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 #die "Real world sux compared to the dreamworld!" 296 #die "Real world sux compared to the dreamworld!"
284 count=5 297 count=5
285 fi 298 fi
286 299
287 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 300 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
288 301
289 break 302 break
290 fi 303 fi
291 304
292 count=$((count + 1)) 305 count=$((count + 1))
293 done 306 done
387 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`" 400 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
388 ADMINPARAM="${ADMINPARAM/-j}" 401 ADMINPARAM="${ADMINPARAM/-j}"
389 fi 402 fi
390 403
391 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" 404 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
392 405
393 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ 406 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
394 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ] 407 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
395 then 408 then
396 # these archs will always have "[Pp]rocessor" 409 # these archs will always have "[Pp]rocessor"
397 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" 410 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
398 411
399 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] 412 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
400 then 413 then
401 # sparc always has "ncpus active" 414 # sparc always has "ncpus active"
402 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 415 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
403 416
404 elif [ "${ARCH}" = "alpha" ] 417 elif [ "${ARCH}" = "alpha" ]
405 then 418 then
406 # alpha has "cpus active", but only when compiled with SMP 419 # alpha has "cpus active", but only when compiled with SMP
407 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ] 420 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
408 then 421 then
409 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))" 422 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
410 else 423 else
411 jobs=2 424 jobs=2
412 fi 425 fi
413 426
414 elif [ "${ARCH}" = "ppc" ] 427 elif [ "${ARCH}" = "ppc" ]
415 then 428 then
416 # ppc has "processor", but only when compiled with SMP 429 # ppc has "processor", but only when compiled with SMP
417 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ] 430 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
418 then 431 then
428 # Make sure the number is valid ... 441 # Make sure the number is valid ...
429 if [ "${jobs}" -lt 1 ] 442 if [ "${jobs}" -lt 1 ]
430 then 443 then
431 jobs=1 444 jobs=1
432 fi 445 fi
433 446
434 if [ -n "${ADMINPARAM}" ] 447 if [ -n "${ADMINPARAM}" ]
435 then 448 then
436 if [ "${jobs}" -gt "${ADMINPARAM}" ] 449 if [ "${jobs}" -gt "${ADMINPARAM}" ]
437 then 450 then
438 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..." 451 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
442 export MAKEOPTS="${MAKEOPTS} -j${jobs}" 455 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
443 fi 456 fi
444 fi 457 fi
445} 458}
446 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
467 [ -z "${topdir}" ] && topdir=/tmp
468 if [ `which mktemp 2>/dev/null` ] ; then
469 mktemp -p ${topdir}
470 else
471 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
472 touch ${tmp}
473 echo ${tmp}
474 fi
475}
476
447# Simplify/standardize adding users to the system 477# Simplify/standardize adding users to the system
448# vapier@gentoo.org 478# vapier@gentoo.org
449# 479#
450# enewuser(username, uid, shell, homedir, groups, extra options) 480# enewuser(username, uid, shell, homedir, groups, extra options)
451# 481#
452# Default values if you do not specify any: 482# Default values if you do not specify any:
453# username: REQUIRED ! 483# username: REQUIRED !
454# uid: next available (see useradd(8)) 484# uid: next available (see useradd(8))
485# note: pass -1 to get default behavior
455# shell: /bin/false 486# shell: /bin/false
456# homedir: /dev/null 487# homedir: /dev/null
457# groups: none 488# groups: none
458# extra: comment of 'added by portage for ${PN}' 489# extra: comment of 'added by portage for ${PN}'
459enewuser() { 490enewuser() {
461 local euser="$1"; shift 492 local euser="$1"; shift
462 if [ -z "${euser}" ] ; then 493 if [ -z "${euser}" ] ; then
463 eerror "No username specified !" 494 eerror "No username specified !"
464 die "Cannot call enewuser without a username" 495 die "Cannot call enewuser without a username"
465 fi 496 fi
466 einfo "Adding user '${euser}' to your system ..."
467 497
468 # setup a file for testing usernames/groups 498 # setup a file for testing usernames/groups
469 local tmpfile="`mktemp -p ${T}`" 499 local tmpfile="`mymktemp ${T}`"
470 touch ${tmpfile}
471 chown ${euser} ${tmpfile} >& /dev/null 500 chown ${euser} ${tmpfile} >& /dev/null
472 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`" 501 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
473 502
474 # see if user already exists 503 # see if user already exists
475 if [ "${euser}" == "${realuser}" ] ; then 504 if [ "${euser}" == "${realuser}" ] ; then
476 einfo "${euser} already exists on your system :)"
477 return 0 505 return 0
478 fi 506 fi
507 einfo "Adding user '${euser}' to your system ..."
479 508
480 # options to pass to useradd 509 # options to pass to useradd
481 local opts="" 510 local opts=""
482 511
483 # handle uid 512 # handle uid
484 local euid="$1"; shift 513 local euid="$1"; shift
485 if [ ! -z "${euid}" ] ; then 514 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] ; then
486 if [ ${euid} -gt 0 ] ; then 515 if [ ${euid} -gt 0 ] ; then
487 opts="${opts} -u ${euid}" 516 opts="${opts} -u ${euid}"
488 else 517 else
489 eerror "Userid given but is not greater than 0 !" 518 eerror "Userid given but is not greater than 0 !"
490 die "${euid} is not a valid UID" 519 die "${euid} is not a valid UID"
536 fi 565 fi
537 einfo " - Groups: ${egroups}" 566 einfo " - Groups: ${egroups}"
538 567
539 # handle extra and add the user 568 # handle extra and add the user
540 local eextra="$@" 569 local eextra="$@"
541 local oldsandbox="${oldsandbox}" 570 local oldsandbox=${SANDBOX_ON}
542 export SANDBOX_ON="0" 571 export SANDBOX_ON="0"
543 if [ -z "${eextra}" ] ; then 572 if [ -z "${eextra}" ] ; then
544 useradd ${opts} ${euser} \ 573 useradd ${opts} ${euser} \
545 -c "added by portage for ${PN}" \ 574 -c "added by portage for ${PN}" \
546 || die "enewuser failed" 575 || die "enewuser failed"
547 else 576 else
548 einfo " - Extra: ${eextra}" 577 einfo " - Extra: ${eextra}"
549 useradd ${opts} ${euser} ${eextra} \ 578 useradd ${opts} ${euser} ${eextra} \
550 || die "enewuser failed" 579 || die "enewuser failed"
551 fi 580 fi
552 export SANDBOX_ON="${oldsandbox}" 581 export SANDBOX_ON="${oldsandbox}"
553 582
554 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then 583 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then
555 einfo " - Creating ${ehome} in ${D}" 584 einfo " - Creating ${ehome} in ${D}"
556 dodir ${ehome} 585 dodir ${ehome}
557 fperms ${euser} ${ehome} 586 fowners ${euser} ${ehome}
587 fperms 755 ${ehome}
558 fi 588 fi
559} 589}
560 590
561# Simplify/standardize adding groups to the system 591# Simplify/standardize adding groups to the system
562# vapier@gentoo.org 592# vapier@gentoo.org
572 local egroup="$1"; shift 602 local egroup="$1"; shift
573 if [ -z "${egroup}" ] ; then 603 if [ -z "${egroup}" ] ; then
574 eerror "No group specified !" 604 eerror "No group specified !"
575 die "Cannot call enewgroup without a group" 605 die "Cannot call enewgroup without a group"
576 fi 606 fi
577 einfo "Adding group '${egroup}' to your system ..."
578 607
579 # setup a file for testing groupname 608 # setup a file for testing groupname
580 local tmpfile="`mktemp -p ${T}`" 609 local tmpfile="`mymktemp ${T}`"
581 touch ${tmpfile}
582 chgrp ${egroup} ${tmpfile} >& /dev/null 610 chgrp ${egroup} ${tmpfile} >& /dev/null
583 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" 611 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
584 612
585 # see if group already exists 613 # see if group already exists
586 if [ "${egroup}" == "${realgroup}" ] ; then 614 if [ "${egroup}" == "${realgroup}" ] ; then
587 einfo "${egroup} already exists on your system :)"
588 return 0 615 return 0
589 fi 616 fi
617 einfo "Adding group '${egroup}' to your system ..."
590 618
591 # options to pass to useradd 619 # options to pass to useradd
592 local opts="" 620 local opts=""
593 621
594 # handle gid 622 # handle gid
608 # handle extra 636 # handle extra
609 local eextra="$@" 637 local eextra="$@"
610 opts="${opts} ${eextra}" 638 opts="${opts} ${eextra}"
611 639
612 # add the group 640 # add the group
613 local oldsandbox="${oldsandbox}" 641 local oldsandbox=${SANDBOX_ON}
614 export SANDBOX_ON="0" 642 export SANDBOX_ON="0"
615 groupadd ${opts} ${egroup} || die "enewgroup failed" 643 groupadd ${opts} ${egroup} || die "enewgroup failed"
616 export SANDBOX_ON="${oldsandbox}" 644 export SANDBOX_ON="${oldsandbox}"
617} 645}
618 646
620# vapier@gentoo.org 648# vapier@gentoo.org
621# 649#
622# edos2unix(file, <more files>...) 650# edos2unix(file, <more files>...)
623edos2unix() { 651edos2unix() {
624 for f in $@ ; do 652 for f in $@ ; do
625 cp ${f} ${T}/ 653 cp ${f} ${T}/edos2unix
626 sed 's/\r$//' ${T}/${f} > ${f} 654 sed 's/\r$//' ${T}/edos2unix > ${f}
627 done 655 done
628} 656}
657
658# Make a desktop file !
659# Great for making those icons in kde/gnome startmenu !
660# Amaze your friends ! Get the women ! Join today !
661# gnome2 /usr/share/applications
662# gnome1 /usr/share/gnome/apps/
663# KDE ${KDEDIR}/share/applnk /usr/share/applnk
664#
665# make_desktop_entry(<binary>, [name], [icon], [type], [path])
666#
667# binary: what binary does the app run with ?
668# name: the name that will show up in the menu
669# icon: give your little like a pretty little icon ...
670# this can be relative (to /usr/share/pixmaps) or
671# a full path to an icon
672# type: what kind of application is this ? for categories:
673# http://www.freedesktop.org/standards/menu/draft/menu-spec/menu-spec.html
674# path: if your app needs to startup in a specific dir
675make_desktop_entry() {
676 [ -z "$1" ] && eerror "You must specify the executable" && return 1
677
678 local exec=${1}
679 local name=${2:-${PN}}
680 local icon=${3:-${PN}.png}
681 local type=${4}
682 local path=${5:-${GAMES_PREFIX}}
683 if [ -z "${type}" ] ; then
684 case ${CATEGORY} in
685 app-emulation) type=Emulator ;;
686 games-*) type=Game ;;
687 *) type="" ;;
688 esac
689 fi
690 local desktop=${T}/${exec}.desktop
691
692echo "[Desktop Entry]
693Encoding=UTF-8
694Version=0.9.2
695Name=${name}
696Type=Application
697Comment=${DESCRIPTION}
698Exec=${exec}
699Path=${path}
700Icon=${icon}
701Categories=Application;${type};" > ${desktop}
702
703 if [ -d /usr/share/applications ] ; then
704 insinto /usr/share/applications
705 doins ${desktop}
706 fi
707
708 #if [ -d /usr/share/gnome/apps ] ; then
709 # insinto /usr/share/gnome/apps/Games
710 # doins ${desktop}
711 #fi
712
713 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ] ; then
714 # for ver in /usr/kde/* ; do
715 # insinto ${ver}/share/applnk/Games
716 # doins ${desktop}
717 # done
718 #fi
719
720 if [ -d /usr/share/applnk ] ; then
721 insinto /usr/share/applnk/${type}
722 doins ${desktop}
723 fi
724
725 return 0
726}
727
728# new convenience patch wrapper function to eventually replace epatch(),
729# $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and
730# /usr/bin/patch
731# Features:
732# - bulk patch handling similar to epatch()'s
733# - automatic patch level detection like epatch()'s
734# - automatic patch uncompression like epatch()'s
735# - doesn't have the --dry-run overhead of epatch() - inspects patchfiles
736# manually instead
737# - once I decide it's production-ready, it'll be called from base_src_unpack
738# to handle $PATCHES to avoid defining src_unpack just to use xpatch
739
740# accepts zero or more parameters specifying patchfiles and/or patchdirs
741
742# known issues:
743# - only supports unified style patches (does anyone _really_ use anything
744# else?)
745# - because it doesn't use --dry-run there is a risk of it failing
746# to find the files to patch, ie detect the patchlevel, properly. It doesn't use
747# any of the backup heuristics that patch employs to discover a filename.
748# however, this isn't dangerous because if it works for the developer who's
749# writing the ebuild, it'll always work for the users, and if it doesn't,
750# then we'll fix it :-)
751# - no support as yet for patches applying outside $S (and not directly in $WORKDIR).
752xpatch() {
753
754 debug-print-function $FUNCNAME $*
755
756 local list=""
757 local list2=""
758 declare -i plevel
759
760 # parse patch sources
761 for x in $*; do
762 debug-print "$FUNCNAME: parsing parameter $x"
763 if [ -f "$x" ]; then
764 list="$list $x"
765 elif [ -d "$x" ]; then
766 # handles patchdirs like epatch() for now: no recursion.
767 # patches are sorted by filename, so with an xy_foo naming scheme you'll get the right order.
768 # only patches with _$ARCH_ or _all_ in their filenames are applied.
769 for file in `ls -A $x`; do
770 debug-print "$FUNCNAME: parsing in subdir: file $file"
771 if [ -f "$x/$file" ] && [ "${file}" != "${file/_all_}" -o "${file}" != "${file/_$ARCH_}" ]; then
772 list2="$list2 $x/$file"
773 fi
774 done
775 list="`echo $list2 | sort` $list"
776 else
777 die "Couldn't find $x"
778 fi
779 done
780
781 debug-print "$FUNCNAME: final list of patches: $list"
782
783 for x in $list; do
784 debug-print "$FUNCNAME: processing $x"
785 # deal with compressed files. /usr/bin/file is in the system profile, or should be.
786 case "`/usr/bin/file -b $x`" in
787 *gzip*) patchfile="${T}/current.patch"; ungzip -c "$x" > "${patchfile}";;
788 *bzip2*) patchfile="${T}/current.patch"; bunzip2 -c "$x" > "${patchfile}";;
789 *text*) patchfile="$x";;
790 *) die "Could not determine filetype of patch $x";;
791 esac
792 debug-print "$FUNCNAME: patchfile=$patchfile"
793
794 # determine patchlevel. supports p0 and higher with either $S or $WORKDIR as base.
795 target="`/bin/grep -m 1 '^+++ ' $patchfile`"
796 debug-print "$FUNCNAME: raw target=$target"
797 # strip target down to the path/filename, remove leading +++
798 target="${target/+++ }"; target="${target%% *}"
799 # duplicate slashes are discarded by patch wrt the patchlevel. therefore we need
800 # to discard them as well to calculate the correct patchlevel.
801 target="${target//\/\//\/}"
802 debug-print "$FUNCNAME: stripped target=$target"
803
804 # look for target
805 for basedir in "$S" "$WORKDIR" "${PWD}"; do
806 debug-print "$FUNCNAME: looking in basedir=$basedir"
807 cd "$basedir"
808
809 # try stripping leading directories
810 target2="$target"
811 plevel=0
812 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
813 while [ ! -f "$target2" ]; do
814 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
815 plevel=plevel+1
816 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
817 [ "$target2" == "${target2/\/}" ] && break
818 done
819 test -f "$target2" && break
820
821 # try stripping filename - needed to support patches creating new files
822 target2="${target%/*}"
823 plevel=0
824 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
825 while [ ! -d "$target2" ]; do
826 target2="${target2#*/}" # removes piece of target2 upto the first occurence of /
827 plevel=plevel+1
828 debug-print "$FUNCNAME: trying target2=$target2, plevel=$plevel"
829 [ "$target2" == "${target2/\/}" ] && break
830 done
831 test -d "$target2" && break
832
833 done
834
835 test -f "${basedir}/${target2}" || test -d "${basedir}/${target2}" || die "Could not determine patchlevel for $x"
836 debug-print "$FUNCNAME: determined plevel=$plevel"
837 # do the patching
838 ebegin "Applying patch ${x##*/}..."
839 /usr/bin/patch -p$plevel < "$patchfile" > /dev/null || die "Failed to apply patch $x"
840 eend $?
841
842 done
843
844}
845
846# Unpack those pesky makeself generated files ...
847# They're shell scripts with the binary package tagged onto
848# the end of the archive. Loki utilized the format as does
849# many other game companies.
850#
851# Usage: unpack_makeself [file to unpack] [offset]
852# - If the file is not specified then unpack will utilize ${A}.
853# - If the offset is not specified then we will attempt to extract
854# the proper offset from the script itself.
855unpack_makeself() {
856 local src=$1
857 local skip=$2
858
859 if [ -z "${src}" ] ; then
860 src="${DISTDIR}/${A}"
861 else
862 if [ -e "${DISTDIR}/${src}" ] ; then
863 src="${DISTDIR}/${src}"
864 elif [ -e "${PWD}/${src}" ] ; then
865 src="${PWD}/${src}"
866 elif [ -e "${src}" ] ; then
867 src="${src}"
868 fi
869 fi
870 [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}"
871
872 local shrtsrc=`basename ${src}`
873 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
874 if [ -z "${skip}" ] ; then
875 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
876 local skip=0
877 case ${ver} in
878 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
879 skip=`grep -a ^skip= ${src} | cut -d= -f2`
880 ;;
881 2.0|2.0.1)
882 skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-`
883 ;;
884 2.1.1)
885 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-`
886 let skip="skip + 1"
887 ;;
888 2.1.2)
889 skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1`
890 let skip="skip + 1"
891 ;;
892 2.1.3)
893 skip=`grep -a ^offset= ${src} | awk '{print $3}'`
894 let skip="skip + 1"
895 ;;
896 *)
897 eerror "I'm sorry, but I was unable to support the Makeself file."
898 eerror "The version I detected was '${ver}'."
899 eerror "Please file a bug about the file ${shrtsrc} at"
900 eerror "http://bugs.gentoo.org/ so that support can be added."
901 die "makeself version '${ver}' not supported"
902 ;;
903 esac
904 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
905 fi
906
907 # we do this because otherwise a failure in gzip will cause 0 bytes to be sent
908 # to tar which will make tar not extract anything and exit with 0
909 tail -n +${skip} ${src} | gzip -cd | tar -x --no-same-owner -f - 2>/dev/null
910 local pipestatus="${PIPESTATUS[*]}"
911 pipestatus="${pipestatus// }"
912 if [ "${pipestatus//0}" != "" ] ; then
913 # maybe it isnt gzipped ... they usually are, but not always ...
914 tail -n +${skip} ${src} | tar -x --no-same-owner -f - \
915 || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})"
916 fi
917}
918
919# Display a license for user to accept.
920#
921# Usage: check_license [license]
922# - If the file is not specified then ${LICENSE} is used.
923check_license() {
924 local src=$1
925 if [ -z "${src}" ] ; then
926 src="${PORTDIR}/licenses/${LICENSE}"
927 else
928 if [ -e "${PORTDIR}/licenses/${src}" ] ; then
929 src="${PORTDIR}/licenses/${src}"
930 elif [ -e "${PWD}/${src}" ] ; then
931 src="${PWD}/${src}"
932 elif [ -e "${src}" ] ; then
933 src="${src}"
934 fi
935 fi
936 [ ! -e "${src}" ] && die "Could not find requested license ${src}"
937
938 # here is where we check for the license...
939 # if we don't find one, we ask the user for it
940 if [ -f /usr/share/licenses/${LICENSE} ]; then
941 einfo "The license for this application has already been accepted."
942 else
943 ewarn "You MUST accept this license for installation to continue."
944 eerror "If you CTRL+C out of this, the install will not run!"
945 echo
946
947 ${PAGER} ${src} || die "Could not execute ${PAGER} ${src}
948 einfo "Do you accept the terms of this license? [yes/no]"
949 read ACCEPT_TERMS
950 case ${ACCEPT_TERMS} in
951 yes|Yes|y|Y)
952 cp ${src} /usr/share/licenses
953 exit 0
954 ;;
955 *)
956 eerror "You MUST accept the license to continue! Exiting!"
957 die "Failed to accept license"
958 ;;
959 esac
960 fi
961}

Legend:
Removed from v.1.26  
changed lines
  Added in v.1.56

  ViewVC Help
Powered by ViewVC 1.1.20