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

Diff of /eclass/eutils.eclass

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

Revision 1.144 Revision 1.175
1# Copyright 1999-2004 Gentoo Foundation 1# Copyright 1999-2005 Gentoo Foundation
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.144 2005/02/03 22:11:33 chriswhite Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.175 2005/05/25 00:04:25 vapier 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.
14INHERITED="$INHERITED $ECLASS" 14INHERITED="$INHERITED $ECLASS"
15 15
16DEPEND="!bootstrap? ( sys-devel/patch )" 16DEPEND="!bootstrap? ( sys-devel/patch )"
17 17
18DESCRIPTION="Based on the ${ECLASS} eclass" 18DESCRIPTION="Based on the ${ECLASS} eclass"
19
20# ecpu_check
21# Usage:
22#
23# ecpu_check array_of_cpu_flags
24#
25# array_of_cpu_flags - An array of cpu flags to check against USE flags
26#
27# Checks user USE related cpu flags against /proc/cpuinfo. If user enables a
28# cpu flag that is not supported in their processor flags, it will warn the
29# user if CROSSCOMPILE is not set to 1 ( because cross compile users are
30# obviously using different cpu flags than their own cpu ). Examples:
31#
32# CPU_FLAGS=(mmx mmx2 sse sse2)
33# ecpu_check CPU_FLAGS
34# Chris White <chriswhite@gentoo.org> (03 Feb 2005)
35
36ecpu_check() {
37 CPU_FLAGS=$1
38 USER_CPU=`grep "flags" /proc/cpuinfo`
39
40 for flags in `seq 1 ${#CPU_FLAGS[@]}`
41 do
42 if has ${CPU_FLAGS[$flags - 1]} $USER_CPU && ! has ${CPU_FLAGS[$flags - 1]} $USE
43 then
44 ewarn "Your system is ${CPU_FLAGS[$flags - 1]} capable but you don't have it enabled!"
45 ewarn "You might be cross compiling (in this case set CROSSCOMPILE to 1 to disable this warning."
46 fi
47
48 if ! has ${CPU_FLAGS[$flags - 1]} $USER_CPU && has ${CPU_FLAGS[$flags -1]} $USE
49 then
50 ewarn "You have ${CPU_FLAGS[$flags - 1]} support enabled but your processor doesn't"
51 ewarn "Seem to support it! You might be cross compiling or do not have /proc filesystem"
52 ewarn "enabled. If either is the case, set CROSSCOMPILE to 1 to disable this warning."
53 fi
54 done
55}
56 19
57# Wait for the supplied number of seconds. If no argument is supplied, defaults 20# Wait for the supplied number of seconds. If no argument is supplied, defaults
58# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not 21# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
59# outputting to a terminal, don't wait. For compatability purposes, the argument 22# outputting to a terminal, don't wait. For compatability purposes, the argument
60# must be an integer greater than zero. 23# must be an integer greater than zero.
102gen_usr_ldscript() { 65gen_usr_ldscript() {
103 local libdir="$(get_libdir)" 66 local libdir="$(get_libdir)"
104 # Just make sure it exists 67 # Just make sure it exists
105 dodir /usr/${libdir} 68 dodir /usr/${libdir}
106 69
70 for lib in "${@}" ; do
107 cat > "${D}/usr/${libdir}/${1}" << END_LDSCRIPT 71 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
108/* GNU ld script 72 /* GNU ld script
109 Because Gentoo have critical dynamic libraries 73 Since Gentoo has critical dynamic libraries
110 in /lib, and the static versions in /usr/lib, we 74 in /lib, and the static versions in /usr/lib,
111 need to have a "fake" dynamic lib in /usr/lib, 75 we need to have a "fake" dynamic lib in /usr/lib,
112 otherwise we run into linking problems. 76 otherwise we run into linking problems.
113 See bug #4411 on http://bugs.gentoo.org/ for 77
114 more info. */ 78 See bug http://bugs.gentoo.org/4411 for more info.
79 */
115GROUP ( /${libdir}/${1} ) 80 GROUP ( /${libdir}/${lib} )
116END_LDSCRIPT 81 END_LDSCRIPT
117 fperms a+x "/usr/${libdir}/${1}" 82 fperms a+x "/usr/${libdir}/${lib}"
83 done
118} 84}
119 85
120# Simple function to draw a line consisting of '=' the same length as $* 86# Simple function to draw a line consisting of '=' the same length as $*
87# - only to be used by epatch()
121# 88#
122# <azarah@gentoo.org> (11 Nov 2002) 89# <azarah@gentoo.org> (11 Nov 2002)
123# 90#
124draw_line() { 91draw_line() {
125 local i=0 92 local i=0
151EPATCH_SOURCE="${WORKDIR}/patch" 118EPATCH_SOURCE="${WORKDIR}/patch"
152# Default extension for patches 119# Default extension for patches
153EPATCH_SUFFIX="patch.bz2" 120EPATCH_SUFFIX="patch.bz2"
154# Default options for patch 121# Default options for patch
155# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 122# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
156EPATCH_OPTS="-g0" 123# Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
124EPATCH_OPTS="-g0 --no-backup-if-mismatch"
157# List of patches not to apply. Not this is only file names, 125# List of patches not to apply. Not this is only file names,
158# and not the full path .. 126# and not the full path ..
159EPATCH_EXCLUDE="" 127EPATCH_EXCLUDE=""
160# Change the printed message for a single patch. 128# Change the printed message for a single patch.
161EPATCH_SINGLE_MSG="" 129EPATCH_SINGLE_MSG=""
130# Change the printed message for multiple patches.
131EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
162# Force applying bulk patches even if not following the style: 132# Force applying bulk patches even if not following the style:
163# 133#
164# ??_${ARCH}_foo.${EPATCH_SUFFIX} 134# ??_${ARCH}_foo.${EPATCH_SUFFIX}
165# 135#
166EPATCH_FORCE="no" 136EPATCH_FORCE="no"
207 local x="" 177 local x=""
208 178
209 if [ "$#" -gt 1 ] 179 if [ "$#" -gt 1 ]
210 then 180 then
211 local m="" 181 local m=""
212 einfo "${#} patches to apply ..."
213 for m in "$@" ; do 182 for m in "$@" ; do
214 epatch "${m}" 183 epatch "${m}"
215 done 184 done
216 return 0 185 return 0
217 fi 186 fi
271 ;; 240 ;;
272 esac 241 esac
273 242
274 if [ "${SINGLE_PATCH}" = "no" ] 243 if [ "${SINGLE_PATCH}" = "no" ]
275 then 244 then
276 einfo "Applying various patches (bugfixes/updates) ..." 245 einfo "${EPATCH_MULTI_MSG}"
277 fi 246 fi
278 for x in ${EPATCH_SOURCE} 247 for x in ${EPATCH_SOURCE}
279 do 248 do
280 # New ARCH dependant patch naming scheme ... 249 # New ARCH dependant patch naming scheme ...
281 # 250 #
285 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \ 254 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] || \
286 [ "${EPATCH_FORCE}" = "yes" ]) 255 [ "${EPATCH_FORCE}" = "yes" ])
287 then 256 then
288 local count=0 257 local count=0
289 local popts="${EPATCH_OPTS}" 258 local popts="${EPATCH_OPTS}"
259 local patchname=${x##*/}
290 260
291 if [ -n "${EPATCH_EXCLUDE}" ] 261 if [ -n "${EPATCH_EXCLUDE}" ]
292 then 262 then
293 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 263 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
294 then 264 then
295 continue 265 continue
296 fi 266 fi
297 fi 267 fi
298 268
300 then 270 then
301 if [ -n "${EPATCH_SINGLE_MSG}" ] 271 if [ -n "${EPATCH_SINGLE_MSG}" ]
302 then 272 then
303 einfo "${EPATCH_SINGLE_MSG}" 273 einfo "${EPATCH_SINGLE_MSG}"
304 else 274 else
305 einfo "Applying ${x##*/} ..." 275 einfo "Applying ${patchname} ..."
306 fi 276 fi
307 else 277 else
308 einfo " ${x##*/} ..." 278 einfo " ${patchname} ..."
309 fi 279 fi
310 280
311 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 281 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
312 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 282 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
313 283
314 # Allow for prefix to differ ... im lazy, so shoot me :/ 284 # Allow for prefix to differ ... im lazy, so shoot me :/
315 while [ "${count}" -lt 5 ] 285 while [ "${count}" -lt 5 ]
316 do 286 do
317 # Generate some useful debug info ... 287 # Generate some useful debug info ...
318 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 288 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
319 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 289 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
320 290
321 if [ "${PATCH_SUFFIX}" != "patch" ] 291 if [ "${PATCH_SUFFIX}" != "patch" ]
322 then 292 then
323 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 293 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
324 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 294 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
325 else 295 else
326 PATCH_TARGET="${x}" 296 PATCH_TARGET="${x}"
327 fi 297 fi
328 298
329 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 299 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
330 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 300 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
331 301
332 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 302 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
333 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 303 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
334 304
335 if [ "${PATCH_SUFFIX}" != "patch" ] 305 if [ "${PATCH_SUFFIX}" != "patch" ]
336 then 306 then
337 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 307 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
338 then 308 then
339 echo 309 echo
340 eerror "Could not extract patch!" 310 eerror "Could not extract patch!"
341 #die "Could not extract patch!" 311 #die "Could not extract patch!"
342 count=5 312 count=5
343 break 313 break
344 fi 314 fi
345 fi 315 fi
346 316
347 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 317 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
348 then 318 then
349 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 319 draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
350 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 320 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
351 echo "ACTUALLY APPLYING ${x##*/} ..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 321 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
352 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 322 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
353 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 323 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
354 324
355 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 325 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
356 326
357 if [ "$?" -ne 0 ] 327 if [ "$?" -ne 0 ]
358 then 328 then
359 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 329 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
360 echo 330 echo
361 eerror "A dry-run of patch command succeeded, but actually" 331 eerror "A dry-run of patch command succeeded, but actually"
362 eerror "applying the patch failed!" 332 eerror "applying the patch failed!"
363 #die "Real world sux compared to the dreamworld!" 333 #die "Real world sux compared to the dreamworld!"
364 count=5 334 count=5
365 fi 335 fi
366 336
367 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 337 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
368 338
369 break 339 break
370 fi 340 fi
371 341
372 count=$((count + 1)) 342 count=$((count + 1))
378 fi 348 fi
379 349
380 if [ "${count}" -eq 5 ] 350 if [ "${count}" -eq 5 ]
381 then 351 then
382 echo 352 echo
383 eerror "Failed Patch: ${x##*/}!" 353 eerror "Failed Patch: ${patchname} !"
354 eerror " ( ${PATCH_TARGET} )"
384 eerror 355 eerror
385 eerror "Include in your bugreport the contents of:" 356 eerror "Include in your bugreport the contents of:"
386 eerror 357 eerror
387 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}" 358 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
388 echo 359 echo
389 die "Failed Patch: ${x##*/}!" 360 die "Failed Patch: ${patchname}!"
390 fi 361 fi
391 362
392 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 363 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
393 364
394 eend 0 365 eend 0
395 fi 366 fi
396 done 367 done
397 if [ "${SINGLE_PATCH}" = "no" ] 368 if [ "${SINGLE_PATCH}" = "no" ]
398 then 369 then
399 einfo "Done with patching" 370 einfo "Done with patching"
400 fi
401}
402
403# This function return true if we are using the NPTL pthreads
404# implementation.
405#
406# <azarah@gentoo.org> (06 March 2003)
407#
408have_NPTL() {
409 cat > ${T}/test-nptl.c <<-"END"
410 #define _XOPEN_SOURCE
411 #include <unistd.h>
412 #include <stdio.h>
413
414 int main()
415 {
416 char buf[255];
417 char *str = buf;
418
419 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
420 if (NULL != str) {
421 printf("%s\n", str);
422 if (NULL != strstr(str, "NPTL"))
423 return 0;
424 }
425
426 return 1;
427 }
428 END
429
430 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ..."
431 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
432 then
433 echo "yes"
434 einfon "Checking what PTHREADS implementation we have ..."
435 if ${T}/nptl
436 then
437 return 0
438 else
439 return 1
440 fi
441 else
442 echo "no"
443 fi
444
445 return 1
446}
447
448# This function check how many cpu's are present, and then set
449# -j in MAKEOPTS accordingly.
450#
451# Thanks to nall <nall@gentoo.org> for this.
452#
453get_number_of_jobs() {
454 local jobs=0
455
456 if [ ! -r /proc/cpuinfo ]
457 then
458 return 1
459 fi
460
461 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
462 if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
463 then
464 ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
465 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
466 ADMINPARAM="${ADMINPARAM/-j}"
467 fi
468
469 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
470
471 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
472 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
473 then
474 # these archs will always have "[Pp]rocessor"
475 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
476
477 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
478 then
479 # sparc always has "ncpus active"
480 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
481
482 elif [ "${ARCH}" = "alpha" ]
483 then
484 # alpha has "cpus active", but only when compiled with SMP
485 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
486 then
487 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
488 else
489 jobs=2
490 fi
491
492 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
493 then
494 # ppc has "processor", but only when compiled with SMP
495 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
496 then
497 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
498 else
499 jobs=2
500 fi
501 elif [ "${ARCH}" = "s390" ]
502 then
503 # s390 has "# processors : "
504 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
505 else
506 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
507 die "Unknown ARCH -- ${ARCH}!"
508 fi
509
510 # Make sure the number is valid ...
511 if [ "${jobs}" -lt 1 ]
512 then
513 jobs=1
514 fi
515
516 if [ -n "${ADMINPARAM}" ]
517 then
518 if [ "${jobs}" -gt "${ADMINPARAM}" ]
519 then
520 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge ..."
521 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
522 else
523 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge ..."
524 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
525 fi
526 fi 371 fi
527} 372}
528 373
529# Cheap replacement for when debianutils (and thus mktemp) 374# Cheap replacement for when debianutils (and thus mktemp)
530# does not exist on the users system 375# does not exist on the users system
674 einfo " - Shell: ${eshell}" 519 einfo " - Shell: ${eshell}"
675 opts="${opts} -s ${eshell}" 520 opts="${opts} -s ${eshell}"
676 521
677 # handle homedir 522 # handle homedir
678 local ehome="$1"; shift 523 local ehome="$1"; shift
679 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ] 524 if [ ! -z "${ehome}" ] && [ "${eshell}" != "-1" ]
680 then 525 then
681 ehome="/dev/null" 526 ehome="/dev/null"
682 fi 527 fi
683 einfo " - Home: ${ehome}" 528 einfo " - Home: ${ehome}"
684 opts="${opts} -d ${ehome}" 529 opts="${opts} -d ${ehome}"
901# name: the name that will show up in the menu 746# name: the name that will show up in the menu
902# icon: give your little like a pretty little icon ... 747# icon: give your little like a pretty little icon ...
903# this can be relative (to /usr/share/pixmaps) or 748# this can be relative (to /usr/share/pixmaps) or
904# a full path to an icon 749# a full path to an icon
905# type: what kind of application is this ? for categories: 750# type: what kind of application is this ? for categories:
906# http://www.freedesktop.org/standards/menu-spec/ 751# http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec
907# path: if your app needs to startup in a specific dir 752# path: if your app needs to startup in a specific dir
908make_desktop_entry() { 753make_desktop_entry() {
909 [ -z "$1" ] && eerror "make_desktop_entry: You must specify the executable" && return 1 754 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
910 755
911 local exec="${1}" 756 local exec=${1}
912 local name="${2:-${PN}}" 757 local name=${2:-${PN}}
913 local icon="${3:-${PN}.png}" 758 local icon=${3:-${PN}.png}
914 local type="${4}" 759 local type=${4}
915 local subdir="${6}" 760 local path=${5}
916 local path="${5:-${GAMES_BINDIR}}" 761
917 if [ -z "${type}" ] 762 if [[ -z ${type} ]] ; then
918 then 763 local catmaj=${CATEGORY%%-*}
919 case ${CATEGORY} in 764 local catmin=${CATEGORY##*-}
920 "app-emulation") 765 case ${catmaj} in
921 type=Emulator 766 app)
922 subdir="Emulation" 767 case ${catmin} in
768 admin) type=System;;
769 cdr) type=DiscBurning;;
770 dicts) type=Dictionary;;
771 editors) type=TextEditor;;
772 emacs) type=TextEditor;;
773 emulation) type=Emulator;;
774 laptop) type=HardwareSettings;;
775 office) type=Office;;
776 vim) type=TextEditor;;
777 xemacs) type=TextEditor;;
778 *) type=;;
779 esac
923 ;; 780 ;;
924 "games-"*) 781
925 type=Game 782 dev)
926 subdir="Games" 783 type="Development"
927 ;; 784 ;;
928 "net-"*) 785
929 type=Network 786 games)
930 subdir="${type}" 787 [[ -z ${path} ]] && path=${GAMES_BINDIR}
788
789 case ${catmin} in
790 action) type=ActionGame;;
791 arcade) type=ArcadeGame;;
792 board) type=BoardGame;;
793 kid) type=KidsGame;;
794 emulation) type=Emulator;;
795 puzzle) type=LogicGame;;
796 rpg) type=RolePlaying;;
797 roguelike) type=RolePlaying;;
798 simulation) type=Simulation;;
799 sports) type=SportsGame;;
800 strategy) type=StrategyGame;;
801 *) type=;;
802 esac
803 type="Game;${type}"
931 ;; 804 ;;
805
806 mail)
807 type="Network;Email"
808 ;;
809
810 media)
811 case ${catmin} in
812 gfx) type=Graphics;;
813 radio) type=Tuner;;
814 sound) type=Audio;;
815 tv) type=TV;;
816 video) type=Video;;
817 *) type=;;
818 esac
819 type="AudioVideo;${type}"
820 ;;
821
822 net)
823 case ${catmin} in
824 dialup) type=Dialup;;
825 ftp) type=FileTransfer;;
826 im) type=InstantMessaging;;
827 irc) type=IRCClient;;
828 mail) type=Email;;
829 news) type=News;;
830 nntp) type=News;;
831 p2p) type=FileTransfer;;
832 *) type=;;
833 esac
834 type="Network;${type}"
835 ;;
836
837 sci)
838 case ${catmin} in
839 astro*) type=Astronomoy;;
840 bio*) type=Biology;;
841 calc*) type=Calculator;;
842 chem*) type=Chemistry;;
843 geo*) type=Geology;;
844 math*) type=Math;;
845 *) type=;;
846 esac
847 type="Science;${type}"
848 ;;
849
850 www)
851 case ${catmin} in
852 client) type=WebBrowser;;
853 *) type=;;
854 esac
855 type="Network"
856 ;;
857
932 *) 858 *)
933 type= 859 type=
934 subdir=
935 ;; 860 ;;
936 esac 861 esac
937 fi 862 fi
863
938 local desktop="${T}/${exec}.desktop" 864 local desktop=${T}/${exec%% *}-${P}.desktop
939 865
940echo "[Desktop Entry] 866echo "[Desktop Entry]
941Encoding=UTF-8 867Encoding=UTF-8
942Version=0.9.2 868Version=0.9.2
943Name=${name} 869Name=${name}
959# make_desktop_entry(<title>, <command>) 885# make_desktop_entry(<title>, <command>)
960# title: File to execute to start the Window Manager 886# title: File to execute to start the Window Manager
961# command: Name of the Window Manager 887# command: Name of the Window Manager
962 888
963make_session_desktop() { 889make_session_desktop() {
964
965 [ -z "$1" ] && eerror "make_session_desktop: You must specify the title" && return 1 890 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
966 [ -z "$2" ] && eerror "make_session_desktop: You must specify the command" && return 1 891 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
967 892
968 local title="${1}" 893 local title=$1
969 local command="${2}" 894 local command=$2
970 local desktop="${T}/${wm}.desktop" 895 local desktop=${T}/${wm}.desktop
971 896
972echo "[Desktop Entry] 897echo "[Desktop Entry]
973Encoding=UTF-8 898Encoding=UTF-8
974Name=${title} 899Name=${title}
975Comment=This session logs you into ${title} 900Comment=This session logs you into ${title}
977TryExec=${command} 902TryExec=${command}
978Type=Application" > "${desktop}" 903Type=Application" > "${desktop}"
979 904
980 insinto /usr/share/xsessions 905 insinto /usr/share/xsessions
981 doins "${desktop}" 906 doins "${desktop}"
982
983 return 0
984} 907}
985 908
986domenu() { 909domenu() {
987 local i 910 local i j
988 local j
989 insinto /usr/share/applications 911 insinto /usr/share/applications
990 for i in ${@} 912 for i in "$@" ; do
991 do
992 if [ -f "${i}" ]; 913 if [[ -f ${i} ]] ; then
993 then
994 doins ${i} 914 doins "${i}"
995 elif [ -d "${i}" ]; 915 elif [[ -d ${i} ]] ; then
996 then
997 for j in ${i}/*.desktop 916 for j in "${i}"/*.desktop ; do
998 do
999 doins ${j} 917 doins "${j}"
1000 done 918 done
1001 fi 919 fi
1002 done 920 done
1003} 921}
922newmenu() {
923 insinto /usr/share/applications
924 newins "$1" "$2"
925}
1004 926
1005doicon() { 927doicon() {
1006 local i 928 local i j
1007 local j
1008 insinto /usr/share/pixmaps 929 insinto /usr/share/pixmaps
1009 for i in ${@} 930 for i in "$@" ; do
1010 do
1011 if [ -f "${i}" ]; 931 if [[ -f ${i} ]] ; then
1012 then
1013 doins ${i} 932 doins "${i}"
1014 elif [ -d "${i}" ]; 933 elif [[ -d ${i} ]] ; then
1015 then
1016 for j in ${i}/*.png 934 for j in "${i}"/*.png ; do
1017 do
1018 doins ${j} 935 doins "${j}"
1019 done 936 done
1020 fi 937 fi
1021 done 938 done
939}
940newicon() {
941 insinto /usr/share/pixmaps
942 newins "$1" "$2"
1022} 943}
1023 944
1024############################################################## 945##############################################################
1025# END: Handle .desktop files and menu entries # 946# END: Handle .desktop files and menu entries #
1026############################################################## 947##############################################################
1427 local mline="" 1348 local mline=""
1428 local showedmsg=0 1349 local showedmsg=0
1429 1350
1430 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do 1351 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do
1431 [[ -d ${mline}/${dir} ]] || continue 1352 [[ -d ${mline}/${dir} ]] || continue
1432 [[ ! -z $(find ${mline}/${dir} -iname ${file} -maxdepth 1) ]] \ 1353 [[ ! -z $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] \
1433 && export CDROM_ROOT=${mline} 1354 && export CDROM_ROOT=${mline}
1434 done 1355 done
1435 1356
1436 if [[ -z ${CDROM_ROOT} ]] ; then 1357 if [[ -z ${CDROM_ROOT} ]] ; then
1437 echo 1358 echo
1471# directories and uses the intersection of the lists. 1392# directories and uses the intersection of the lists.
1472# The -u builds a list of po files found in all the 1393# The -u builds a list of po files found in all the
1473# directories and uses the union of the lists. 1394# directories and uses the union of the lists.
1474strip-linguas() { 1395strip-linguas() {
1475 local ls newls 1396 local ls newls
1476 if [ "$1" == "-i" ] || [ "$1" == "-u" ] ; then 1397 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1477 local op="$1"; shift 1398 local op=$1; shift
1478 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift 1399 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1479 local d f 1400 local d f
1480 for d in "$@" ; do 1401 for d in "$@" ; do
1481 if [ "${op}" == "-u" ] ; then 1402 if [[ ${op} == "-u" ]] ; then
1482 newls="${ls}" 1403 newls=${ls}
1483 else 1404 else
1484 newls="" 1405 newls=""
1485 fi 1406 fi
1486 for f in $(find "$d" -name '*.po' -printf '%f ') ; do 1407 for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1487 if [ "${op}" == "-i" ] ; then 1408 if [[ ${op} == "-i" ]] ; then
1488 [ "${ls/ ${f} /}" != "${ls}" ] && newls="${newls} ${f}" 1409 [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1489 else 1410 else
1490 [ "${ls/ ${f} /}" == "${ls}" ] && newls="${newls} ${f}" 1411 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1491 fi 1412 fi
1492 done 1413 done
1493 ls="${newls}" 1414 ls=${newls}
1494 done 1415 done
1495 ls="${ls//.po}" 1416 ls=${ls//.po}
1496 else 1417 else
1497 ls="$@" 1418 ls=$@
1498 fi 1419 fi
1499 1420
1500 ls=" ${ls} " 1421 ls=" ${ls} "
1501 newls="" 1422 newls=""
1502 for f in ${LINGUAS} ; do 1423 for f in ${LINGUAS} ; do
1503 if [ "${ls/ ${f} /}" != "${ls}" ] ; then 1424 if [[ ${ls/ ${f} /} != ${ls} ]] ; then
1504 newls="${newls} ${f}" 1425 newls="${newls} ${f}"
1505 else 1426 else
1506 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA" 1427 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1507 fi 1428 fi
1508 done 1429 done
1509 if [ -z "${newls}" ] ; then 1430 if [[ -z ${newls} ]] ; then
1510 unset LINGUAS 1431 export LINGUAS=""
1511 else 1432 else
1512 export LINGUAS="${newls}" 1433 export LINGUAS=${newls:1}
1513 fi 1434 fi
1514} 1435}
1515 1436
1516# moved from kernel.eclass since they are generally useful outside of 1437# moved from kernel.eclass since they are generally useful outside of
1517# kernel.eclass -iggy (20041002) 1438# kernel.eclass -iggy (20041002)
1639 patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null 1560 patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1640 done 1561 done
1641 eend 0 1562 eend 0
1642} 1563}
1643 1564
1644# dopamd [ file ] [ new file ] 1565# dopamd <file> [more files]
1645# 1566#
1646# Install pam auth config file in /etc/pam.d 1567# Install pam auth config file in /etc/pam.d
1647#
1648# The first argument, 'file' is required. Install as 'new file', if
1649# specified.
1650
1651dopamd() { 1568dopamd() {
1652 local pamd="$1" newpamd="${2:-$1}"
1653 [[ -z "$1" ]] && die "dopamd requires at least one argument." 1569 [[ -z $1 ]] && die "dopamd requires at least one argument"
1654 1570
1655 use pam || return 0 1571 use pam || return 0
1656 1572
1657 insinto /etc/pam.d 1573 INSDESTTREE=/etc/pam.d \
1658 # these are the default doins options, but be explicit just in case 1574 doins "$@" || die "failed to install $@"
1659 insopts -m 0644 -o root -g root
1660 newins ${pamd} ${newpamd} || die "failed to install ${newpamd}"
1661} 1575}
1576# newpamd <old name> <new name>
1577#
1578# Install pam file <old name> as <new name> in /etc/pam.d
1579newpamd() {
1580 [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1581
1582 use pam || return 0
1583
1584 INSDESTTREE=/etc/pam.d \
1585 newins "$1" "$2" || die "failed to install $1 as $2"
1586}
1587
1588# make a wrapper script ...
1589# NOTE: this was originally games_make_wrapper, but I noticed other places where
1590# this could be used, so I have moved it here and made it not games-specific
1591# -- wolf31o2
1592# $1 == wrapper name
1593# $2 == binary to run
1594# $3 == directory to chdir before running binary
1595# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1596# $5 == path for wrapper
1597make_wrapper() {
1598 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1599 local tmpwrapper=$(emktemp)
1600 cat << EOF > "${tmpwrapper}"
1601#!/bin/sh
1602cd "${chdir}"
1603export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1604exec ${bin} "\$@"
1605EOF
1606 chmod go+rx "${tmpwrapper}"
1607 if [ -n "${5}" ]
1608 then
1609 exeinto ${5}
1610 newexe "${tmpwrapper}" "${wrapper}"
1611 else
1612 newbin "${tmpwrapper}" "${wrapper}"
1613 fi
1614}

Legend:
Removed from v.1.144  
changed lines
  Added in v.1.175

  ViewVC Help
Powered by ViewVC 1.1.20