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

Contents of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.57 - (show annotations) (download)
Mon Sep 22 21:39:11 2003 UTC (10 years, 10 months ago) by wolf31o2
Branch: MAIN
Changes since 1.56: +4 -1 lines
Fixing bug in check_license.

1 # Copyright 1999-2003 Gentoo Technologies, Inc.
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /home/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.56 2003/09/22 21:08:27 wolf31o2 Exp $
4 #
5 # Author: Martin Schlemmer <azarah@gentoo.org>
6 #
7 # This eclass is for general purpose functions that most ebuilds
8 # have to implement themselves.
9 #
10 # NB: If you add anything, please comment it!
11
12 ECLASS=eutils
13 INHERITED="$INHERITED $ECLASS"
14
15 newdepend "!bootstrap? ( sys-devel/patch )"
16
17 DESCRIPTION="Based on the ${ECLASS} eclass"
18
19 # This function generate linker scripts in /usr/lib for dynamic
20 # libs in /lib. This is to fix linking problems when you have
21 # the .so in /lib, and the .a in /usr/lib. What happens is that
22 # in some cases when linking dynamic, the .a in /usr/lib is used
23 # instead of the .so in /lib due to gcc/libtool tweaking ld's
24 # library search path. This cause many builds to fail.
25 # See bug #4411 for more info.
26 #
27 # To use, simply call:
28 #
29 # gen_usr_ldscript libfoo.so
30 #
31 # Note that you should in general use the unversioned name of
32 # the library, as ldconfig should usually update it correctly
33 # to point to the latest version of the library present.
34 #
35 # <azarah@gentoo.org> (26 Oct 2002)
36 #
37 gen_usr_ldscript() {
38
39 # Just make sure it exists
40 dodir /usr/lib
41
42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
43 /* GNU ld script
44 Because Gentoo have critical dynamic libraries
45 in /lib, and the static versions in /usr/lib, we
46 need to have a "fake" dynamic lib in /usr/lib,
47 otherwise we run into linking problems.
48 See bug #4411 on http://bugs.gentoo.org/ for
49 more info. */
50 GROUP ( /lib/libxxx )
51 END_LDSCRIPT
52
53 dosed "s:libxxx:$1:" /usr/lib/$1
54
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 #
62 draw_line() {
63 local i=0
64 local str_length=""
65
66 # Handle calls that do not have args, or wc not being installed ...
67 if [ -z "$1" -o ! -x "$(which wc 2>/dev/null)" ]
68 then
69 echo "==============================================================="
70 return 0
71 fi
72
73 # Get the length of $*
74 str_length="$(echo -n "$*" | wc -m)"
75
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 }
87
88 # Default directory where patches are located
89 EPATCH_SOURCE="${WORKDIR}/patch"
90 # Default extension for patches
91 EPATCH_SUFFIX="patch.bz2"
92 # Default options for patch
93 # Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
94 EPATCH_OPTS="-g0"
95 # List of patches not to apply. Not this is only file names,
96 # and not the full path ..
97 EPATCH_EXCLUDE=""
98 # Change the printed message for a single patch.
99 EPATCH_SINGLE_MSG=""
100 # Force applying bulk patches even if not following the style:
101 #
102 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
103 #
104 EPATCH_FORCE="no"
105
106 # This function is for bulk patching, or in theory for just one
107 # or two patches.
108 #
109 # It should work with .bz2, .gz, .zip and plain text patches.
110 # Currently all patches should be the same format.
111 #
112 # You do not have to specify '-p' option to patch, as it will
113 # try with -p0 to -p5 until it succeed, or fail at -p5.
114 #
115 # Above EPATCH_* variables can be used to control various defaults,
116 # bug they should be left as is to ensure an ebuild can rely on
117 # them for.
118 #
119 # Patches are applied in current directory.
120 #
121 # Bulk Patches should preferibly have the form of:
122 #
123 # ??_${ARCH}_foo.${EPATCH_SUFFIX}
124 #
125 # For example:
126 #
127 # 01_all_misc-fix.patch.bz2
128 # 02_sparc_another-fix.patch.bz2
129 #
130 # This ensures that there are a set order, and you can have ARCH
131 # specific patches.
132 #
133 # If you however give an argument to epatch(), it will treat it as a
134 # single patch that need to be applied if its a file. If on the other
135 # hand its a directory, it will set EPATCH_SOURCE to this.
136 #
137 # <azarah@gentoo.org> (10 Nov 2002)
138 #
139 epatch() {
140 local PIPE_CMD=""
141 local STDERR_TARGET="${T}/$$.out"
142 local PATCH_TARGET="${T}/$$.patch"
143 local PATCH_SUFFIX=""
144 local SINGLE_PATCH="no"
145 local x=""
146
147 if [ "$#" -gt 1 ]
148 then
149 eerror "Invalid arguments to epatch()"
150 die "Invalid arguments to epatch()"
151 fi
152
153 if [ -n "$1" -a -f "$1" ]
154 then
155 SINGLE_PATCH="yes"
156
157 local EPATCH_SOURCE="$1"
158 local EPATCH_SUFFIX="${1##*\.}"
159
160 elif [ -n "$1" -a -d "$1" ]
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
167 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168 fi
169 else
170 if [ ! -d ${EPATCH_SOURCE} ]
171 then
172 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
173 then
174 EPATCH_SOURCE="$1"
175 fi
176
177 echo
178 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
179 eerror
180 eerror " ${EPATCH_SOURCE}"
181 echo
182 die "Cannot find \$EPATCH_SOURCE!"
183 fi
184
185 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
186 fi
187
188 case ${EPATCH_SUFFIX##*\.} in
189 bz2)
190 PIPE_CMD="bzip2 -dc"
191 PATCH_SUFFIX="bz2"
192 ;;
193 gz|Z|z)
194 PIPE_CMD="gzip -dc"
195 PATCH_SUFFIX="gz"
196 ;;
197 ZIP|zip)
198 PIPE_CMD="unzip -p"
199 PATCH_SUFFIX="zip"
200 ;;
201 *)
202 PIPE_CMD="cat"
203 PATCH_SUFFIX="patch"
204 ;;
205 esac
206
207 if [ "${SINGLE_PATCH}" = "no" ]
208 then
209 einfo "Applying various patches (bugfixes/updates)..."
210 fi
211 for x in ${EPATCH_SOURCE}
212 do
213 # New ARCH dependant patch naming scheme...
214 #
215 # ???_arch_foo.patch
216 #
217 if [ -f ${x} ] && \
218 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
219 [ "${EPATCH_FORCE}" = "yes" ])
220 then
221 local count=0
222 local popts="${EPATCH_OPTS}"
223
224 if [ -n "${EPATCH_EXCLUDE}" ]
225 then
226 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
227 then
228 continue
229 fi
230 fi
231
232 if [ "${SINGLE_PATCH}" = "yes" ]
233 then
234 if [ -n "${EPATCH_SINGLE_MSG}" ]
235 then
236 einfo "${EPATCH_SINGLE_MSG}"
237 else
238 einfo "Applying ${x##*/}..."
239 fi
240 else
241 einfo " ${x##*/}..."
242 fi
243
244 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246
247 # Allow for prefix to differ ... im lazy, so shoot me :/
248 while [ "${count}" -lt 5 ]
249 do
250 # Generate some useful debug info ...
251 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
252 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
253
254 if [ "${PATCH_SUFFIX}" != "patch" ]
255 then
256 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
257 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
258 else
259 PATCH_TARGET="${x}"
260 fi
261
262 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
263 echo "patch ${popts} -p${count} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264
265 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
266 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
267
268 if [ "${PATCH_SUFFIX}" != "patch" ]
269 then
270 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
271 then
272 echo
273 eerror "Could not extract patch!"
274 #die "Could not extract patch!"
275 count=5
276 break
277 fi
278 fi
279
280 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
281 then
282 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
283 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
284 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
285 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
286 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
287
288 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
289
290 if [ "$?" -ne 0 ]
291 then
292 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
293 echo
294 eerror "A dry-run of patch command succeeded, but actually"
295 eerror "applying the patch failed!"
296 #die "Real world sux compared to the dreamworld!"
297 count=5
298 fi
299
300 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
301
302 break
303 fi
304
305 count=$((count + 1))
306 done
307
308 if [ "${PATCH_SUFFIX}" != "patch" ]
309 then
310 rm -f ${PATCH_TARGET}
311 fi
312
313 if [ "${count}" -eq 5 ]
314 then
315 echo
316 eerror "Failed Patch: ${x##*/}!"
317 eerror
318 eerror "Include in your bugreport the contents of:"
319 eerror
320 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
321 echo
322 die "Failed Patch: ${x##*/}!"
323 fi
324
325 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
326
327 eend 0
328 fi
329 done
330 if [ "${SINGLE_PATCH}" = "no" ]
331 then
332 einfo "Done with patching"
333 fi
334 }
335
336 # This function return true if we are using the NPTL pthreads
337 # implementation.
338 #
339 # <azarah@gentoo.org> (06 March 2003)
340 #
341
342 have_NPTL() {
343
344 cat > ${T}/test-nptl.c <<-"END"
345 #define _XOPEN_SOURCE
346 #include <unistd.h>
347 #include <stdio.h>
348
349 int main()
350 {
351 char buf[255];
352 char *str = buf;
353
354 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
355 if (NULL != str) {
356 printf("%s\n", str);
357 if (NULL != strstr(str, "NPTL"))
358 return 0;
359 }
360
361 return 1;
362 }
363 END
364
365 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
366 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
367 then
368 echo "yes"
369 einfon "Checking what PTHREADS implementation we have ... "
370 if ${T}/nptl
371 then
372 return 0
373 else
374 return 1
375 fi
376 else
377 echo "no"
378 fi
379
380 return 1
381 }
382
383 # This function check how many cpu's are present, and then set
384 # -j in MAKEOPTS accordingly.
385 #
386 # Thanks to nall <nall@gentoo.org> for this.
387 #
388 get_number_of_jobs() {
389 local jobs=0
390
391 if [ ! -r /proc/cpuinfo ]
392 then
393 return 1
394 fi
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
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)
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}
474 fi
475 }
476
477 # Simplify/standardize adding users to the system
478 # vapier@gentoo.org
479 #
480 # enewuser(username, uid, shell, homedir, groups, extra options)
481 #
482 # Default values if you do not specify any:
483 # username: REQUIRED !
484 # uid: next available (see useradd(8))
485 # note: pass -1 to get default behavior
486 # shell: /bin/false
487 # homedir: /dev/null
488 # groups: none
489 # extra: comment of 'added by portage for ${PN}'
490 enewuser() {
491 # get the username
492 local euser="$1"; shift
493 if [ -z "${euser}" ] ; then
494 eerror "No username specified !"
495 die "Cannot call enewuser without a username"
496 fi
497
498 # setup a file for testing usernames/groups
499 local tmpfile="`mymktemp ${T}`"
500 chown ${euser} ${tmpfile} >& /dev/null
501 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
502
503 # see if user already exists
504 if [ "${euser}" == "${realuser}" ] ; then
505 return 0
506 fi
507 einfo "Adding user '${euser}' to your system ..."
508
509 # options to pass to useradd
510 local opts=""
511
512 # handle uid
513 local euid="$1"; shift
514 if [ ! -z "${euid}" ] && [ "${euid}" != "-1" ] ; then
515 if [ ${euid} -gt 0 ] ; then
516 opts="${opts} -u ${euid}"
517 else
518 eerror "Userid given but is not greater than 0 !"
519 die "${euid} is not a valid UID"
520 fi
521 else
522 euid="next available"
523 fi
524 einfo " - Userid: ${euid}"
525
526 # handle shell
527 local eshell="$1"; shift
528 if [ ! -z "${eshell}" ] ; then
529 if [ ! -e ${eshell} ] ; then
530 eerror "A shell was specified but it does not exist !"
531 die "${eshell} does not exist"
532 fi
533 else
534 eshell=/bin/false
535 fi
536 einfo " - Shell: ${eshell}"
537 opts="${opts} -s ${eshell}"
538
539 # handle homedir
540 local ehome="$1"; shift
541 if [ -z "${ehome}" ] ; then
542 ehome=/dev/null
543 fi
544 einfo " - Home: ${ehome}"
545 opts="${opts} -d ${ehome}"
546
547 # handle groups
548 local egroups="$1"; shift
549 if [ ! -z "${egroups}" ] ; then
550 local realgroup
551 local oldifs="${IFS}"
552 export IFS=","
553 for g in ${egroups} ; do
554 chgrp ${g} ${tmpfile} >& /dev/null
555 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
556 if [ "${g}" != "${realgroup}" ] ; then
557 eerror "You must add ${g} to the system first"
558 die "${g} is not a valid GID"
559 fi
560 done
561 export IFS="${oldifs}"
562 opts="${opts} -g ${egroups}"
563 else
564 egroups="(none)"
565 fi
566 einfo " - Groups: ${egroups}"
567
568 # handle extra and add the user
569 local eextra="$@"
570 local oldsandbox=${SANDBOX_ON}
571 export SANDBOX_ON="0"
572 if [ -z "${eextra}" ] ; then
573 useradd ${opts} ${euser} \
574 -c "added by portage for ${PN}" \
575 || die "enewuser failed"
576 else
577 einfo " - Extra: ${eextra}"
578 useradd ${opts} ${euser} ${eextra} \
579 || die "enewuser failed"
580 fi
581 export SANDBOX_ON="${oldsandbox}"
582
583 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then
584 einfo " - Creating ${ehome} in ${D}"
585 dodir ${ehome}
586 fowners ${euser} ${ehome}
587 fperms 755 ${ehome}
588 fi
589 }
590
591 # Simplify/standardize adding groups to the system
592 # vapier@gentoo.org
593 #
594 # enewgroup(group, gid)
595 #
596 # Default values if you do not specify any:
597 # groupname: REQUIRED !
598 # gid: next available (see groupadd(8))
599 # extra: none
600 enewgroup() {
601 # get the group
602 local egroup="$1"; shift
603 if [ -z "${egroup}" ] ; then
604 eerror "No group specified !"
605 die "Cannot call enewgroup without a group"
606 fi
607
608 # setup a file for testing groupname
609 local tmpfile="`mymktemp ${T}`"
610 chgrp ${egroup} ${tmpfile} >& /dev/null
611 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
612
613 # see if group already exists
614 if [ "${egroup}" == "${realgroup}" ] ; then
615 return 0
616 fi
617 einfo "Adding group '${egroup}' to your system ..."
618
619 # options to pass to useradd
620 local opts=""
621
622 # handle gid
623 local egid="$1"; shift
624 if [ ! -z "${egid}" ] ; then
625 if [ ${egid} -gt 0 ] ; then
626 opts="${opts} -g ${egid}"
627 else
628 eerror "Groupid given but is not greater than 0 !"
629 die "${egid} is not a valid GID"
630 fi
631 else
632 egid="next available"
633 fi
634 einfo " - Groupid: ${egid}"
635
636 # handle extra
637 local eextra="$@"
638 opts="${opts} ${eextra}"
639
640 # add the group
641 local oldsandbox=${SANDBOX_ON}
642 export SANDBOX_ON="0"
643 groupadd ${opts} ${egroup} || die "enewgroup failed"
644 export SANDBOX_ON="${oldsandbox}"
645 }
646
647 # Simple script to replace 'dos2unix' binaries
648 # vapier@gentoo.org
649 #
650 # edos2unix(file, <more files>...)
651 edos2unix() {
652 for f in $@ ; do
653 cp ${f} ${T}/edos2unix
654 sed 's/\r$//' ${T}/edos2unix > ${f}
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
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).
752 xpatch() {
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.
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 [ ! -d /usr/share/licenses ]; then
941 mkdir -p /usr/share/licenses
942 fi
943 if [ -f /usr/share/licenses/${LICENSE} ]; then
944 einfo "The license for this application has already been accepted."
945 else
946 ewarn "You MUST accept this license for installation to continue."
947 eerror "If you CTRL+C out of this, the install will not run!"
948 echo
949
950 ${PAGER} ${src} || die "Could not execute ${PAGER} ${src}
951 einfo "Do you accept the terms of this license? [yes/no]"
952 read ACCEPT_TERMS
953 case ${ACCEPT_TERMS} in
954 yes|Yes|y|Y)
955 cp ${src} /usr/share/licenses
956 exit 0
957 ;;
958 *)
959 eerror "You MUST accept the license to continue! Exiting!"
960 die "Failed to accept license"
961 ;;
962 esac
963 fi
964 }

  ViewVC Help
Powered by ViewVC 1.1.20