| 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.34 2003/06/21 09:23:24 danarmak 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. |
| … | |
… | |
| 10 | # NB: If you add anything, please comment it! |
10 | # NB: If you add anything, please comment it! |
| 11 | |
11 | |
| 12 | ECLASS=eutils |
12 | ECLASS=eutils |
| 13 | INHERITED="$INHERITED $ECLASS" |
13 | INHERITED="$INHERITED $ECLASS" |
| 14 | |
14 | |
| 15 | DEPEND="$DEPEND !bootstrap? ( sys-devel/patch )" |
15 | newdepend "!bootstrap? ( sys-devel/patch )" |
| 16 | |
16 | |
| 17 | DESCRIPTION="Based on the ${ECLASS} eclass" |
17 | DESCRIPTION="Based on the ${ECLASS} eclass" |
| 18 | |
18 | |
| 19 | # This function generate linker scripts in /usr/lib for dynamic |
19 | # This function generate linker scripts in /usr/lib for dynamic |
| 20 | # 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 |
| … | |
… | |
| 88 | # Default directory where patches are located |
88 | # Default directory where patches are located |
| 89 | EPATCH_SOURCE="${WORKDIR}/patch" |
89 | EPATCH_SOURCE="${WORKDIR}/patch" |
| 90 | # Default extension for patches |
90 | # Default extension for patches |
| 91 | EPATCH_SUFFIX="patch.bz2" |
91 | EPATCH_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 |
| 93 | EPATCH_OPTS="" |
94 | EPATCH_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 .. |
| 96 | EPATCH_EXCLUDE="" |
97 | EPATCH_EXCLUDE="" |
| 97 | # Change the printed message for a single patch. |
98 | # Change the printed message for a single patch. |
| 98 | EPATCH_SINGLE_MSG="" |
99 | EPATCH_SINGLE_MSG="" |
| … | |
… | |
| 400 | ADMINPARAM="${ADMINPARAM/-j}" |
401 | ADMINPARAM="${ADMINPARAM/-j}" |
| 401 | fi |
402 | fi |
| 402 | |
403 | |
| 403 | export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" |
404 | export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`" |
| 404 | |
405 | |
| 405 | if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ |
406 | if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \ |
| 406 | "${ARCH}" = "arm" -o "${ARCH}" = "mips" ] |
407 | "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ] |
| 407 | then |
408 | then |
| 408 | # these archs will always have "[Pp]rocessor" |
409 | # these archs will always have "[Pp]rocessor" |
| 409 | jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" |
410 | jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))" |
| 410 | |
411 | |
| 411 | elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] |
412 | elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ] |
| … | |
… | |
| 451 | export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}" |
452 | export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}" |
| 452 | else |
453 | else |
| 453 | einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..." |
454 | einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..." |
| 454 | export MAKEOPTS="${MAKEOPTS} -j${jobs}" |
455 | export MAKEOPTS="${MAKEOPTS} -j${jobs}" |
| 455 | fi |
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) |
|
|
465 | mymktemp() { |
|
|
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} |
| 456 | fi |
474 | fi |
| 457 | } |
475 | } |
| 458 | |
476 | |
| 459 | # Simplify/standardize adding users to the system |
477 | # Simplify/standardize adding users to the system |
| 460 | # vapier@gentoo.org |
478 | # vapier@gentoo.org |
| … | |
… | |
| 474 | local euser="$1"; shift |
492 | local euser="$1"; shift |
| 475 | if [ -z "${euser}" ] ; then |
493 | if [ -z "${euser}" ] ; then |
| 476 | eerror "No username specified !" |
494 | eerror "No username specified !" |
| 477 | die "Cannot call enewuser without a username" |
495 | die "Cannot call enewuser without a username" |
| 478 | fi |
496 | fi |
| 479 | einfo "Adding user '${euser}' to your system ..." |
|
|
| 480 | |
497 | |
| 481 | # setup a file for testing usernames/groups |
498 | # setup a file for testing usernames/groups |
| 482 | local tmpfile="`mktemp -p ${T}`" |
499 | local tmpfile="`mymktemp ${T}`" |
| 483 | touch ${tmpfile} |
|
|
| 484 | chown ${euser} ${tmpfile} >& /dev/null |
500 | chown ${euser} ${tmpfile} >& /dev/null |
| 485 | local realuser="`ls -l ${tmpfile} | awk '{print $3}'`" |
501 | local realuser="`ls -l ${tmpfile} | awk '{print $3}'`" |
| 486 | |
502 | |
| 487 | # see if user already exists |
503 | # see if user already exists |
| 488 | if [ "${euser}" == "${realuser}" ] ; then |
504 | if [ "${euser}" == "${realuser}" ] ; then |
| 489 | einfo "${euser} already exists on your system :)" |
|
|
| 490 | return 0 |
505 | return 0 |
| 491 | fi |
506 | fi |
|
|
507 | einfo "Adding user '${euser}' to your system ..." |
| 492 | |
508 | |
| 493 | # options to pass to useradd |
509 | # options to pass to useradd |
| 494 | local opts="" |
510 | local opts="" |
| 495 | |
511 | |
| 496 | # handle uid |
512 | # handle uid |
| … | |
… | |
| 549 | fi |
565 | fi |
| 550 | einfo " - Groups: ${egroups}" |
566 | einfo " - Groups: ${egroups}" |
| 551 | |
567 | |
| 552 | # handle extra and add the user |
568 | # handle extra and add the user |
| 553 | local eextra="$@" |
569 | local eextra="$@" |
| 554 | local oldsandbox="${oldsandbox}" |
570 | local oldsandbox=${SANDBOX_ON} |
| 555 | export SANDBOX_ON="0" |
571 | export SANDBOX_ON="0" |
| 556 | if [ -z "${eextra}" ] ; then |
572 | if [ -z "${eextra}" ] ; then |
| 557 | useradd ${opts} ${euser} \ |
573 | useradd ${opts} ${euser} \ |
| 558 | -c "added by portage for ${PN}" \ |
574 | -c "added by portage for ${PN}" \ |
| 559 | || die "enewuser failed" |
575 | || die "enewuser failed" |
| … | |
… | |
| 565 | export SANDBOX_ON="${oldsandbox}" |
581 | export SANDBOX_ON="${oldsandbox}" |
| 566 | |
582 | |
| 567 | if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then |
583 | if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then |
| 568 | einfo " - Creating ${ehome} in ${D}" |
584 | einfo " - Creating ${ehome} in ${D}" |
| 569 | dodir ${ehome} |
585 | dodir ${ehome} |
| 570 | fperms ${euser} ${ehome} |
586 | fowners ${euser} ${ehome} |
|
|
587 | fperms 755 ${ehome} |
| 571 | fi |
588 | fi |
| 572 | } |
589 | } |
| 573 | |
590 | |
| 574 | # Simplify/standardize adding groups to the system |
591 | # Simplify/standardize adding groups to the system |
| 575 | # vapier@gentoo.org |
592 | # vapier@gentoo.org |
| … | |
… | |
| 585 | local egroup="$1"; shift |
602 | local egroup="$1"; shift |
| 586 | if [ -z "${egroup}" ] ; then |
603 | if [ -z "${egroup}" ] ; then |
| 587 | eerror "No group specified !" |
604 | eerror "No group specified !" |
| 588 | die "Cannot call enewgroup without a group" |
605 | die "Cannot call enewgroup without a group" |
| 589 | fi |
606 | fi |
| 590 | einfo "Adding group '${egroup}' to your system ..." |
|
|
| 591 | |
607 | |
| 592 | # setup a file for testing groupname |
608 | # setup a file for testing groupname |
| 593 | local tmpfile="`mktemp -p ${T}`" |
609 | local tmpfile="`mymktemp ${T}`" |
| 594 | touch ${tmpfile} |
|
|
| 595 | chgrp ${egroup} ${tmpfile} >& /dev/null |
610 | chgrp ${egroup} ${tmpfile} >& /dev/null |
| 596 | local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" |
611 | local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`" |
| 597 | |
612 | |
| 598 | # see if group already exists |
613 | # see if group already exists |
| 599 | if [ "${egroup}" == "${realgroup}" ] ; then |
614 | if [ "${egroup}" == "${realgroup}" ] ; then |
| 600 | einfo "${egroup} already exists on your system :)" |
|
|
| 601 | return 0 |
615 | return 0 |
| 602 | fi |
616 | fi |
|
|
617 | einfo "Adding group '${egroup}' to your system ..." |
| 603 | |
618 | |
| 604 | # options to pass to useradd |
619 | # options to pass to useradd |
| 605 | local opts="" |
620 | local opts="" |
| 606 | |
621 | |
| 607 | # handle gid |
622 | # handle gid |
| … | |
… | |
| 621 | # handle extra |
636 | # handle extra |
| 622 | local eextra="$@" |
637 | local eextra="$@" |
| 623 | opts="${opts} ${eextra}" |
638 | opts="${opts} ${eextra}" |
| 624 | |
639 | |
| 625 | # add the group |
640 | # add the group |
| 626 | local oldsandbox="${oldsandbox}" |
641 | local oldsandbox=${SANDBOX_ON} |
| 627 | export SANDBOX_ON="0" |
642 | export SANDBOX_ON="0" |
| 628 | groupadd ${opts} ${egroup} || die "enewgroup failed" |
643 | groupadd ${opts} ${egroup} || die "enewgroup failed" |
| 629 | export SANDBOX_ON="${oldsandbox}" |
644 | export SANDBOX_ON="${oldsandbox}" |
| 630 | } |
645 | } |
| 631 | |
646 | |
| … | |
… | |
| 636 | edos2unix() { |
651 | edos2unix() { |
| 637 | for f in $@ ; do |
652 | for f in $@ ; do |
| 638 | cp ${f} ${T}/edos2unix |
653 | cp ${f} ${T}/edos2unix |
| 639 | sed 's/\r$//' ${T}/edos2unix > ${f} |
654 | sed 's/\r$//' ${T}/edos2unix > ${f} |
| 640 | done |
655 | done |
|
|
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 |
|
|
675 | make_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 | |
|
|
692 | echo "[Desktop Entry] |
|
|
693 | Encoding=UTF-8 |
|
|
694 | Version=0.9.2 |
|
|
695 | Name=${name} |
|
|
696 | Type=Application |
|
|
697 | Comment=${DESCRIPTION} |
|
|
698 | Exec=${exec} |
|
|
699 | Path=${path} |
|
|
700 | Icon=${icon} |
|
|
701 | Categories=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 |
| 641 | } |
726 | } |
| 642 | |
727 | |
| 643 | # new convenience patch wrapper function to eventually replace epatch(), |
728 | # new convenience patch wrapper function to eventually replace epatch(), |
| 644 | # $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and |
729 | # $PATCHES, $PATCHES1, src_unpack:patch, src_unpack:autopatch and |
| 645 | # /usr/bin/patch |
730 | # /usr/bin/patch |
| … | |
… | |
| 755 | eend $? |
840 | eend $? |
| 756 | |
841 | |
| 757 | done |
842 | done |
| 758 | |
843 | |
| 759 | } |
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. |
|
|
855 | unpack_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. |
|
|
923 | check_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 | } |