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

Diff of /eclass/eutils.eclass

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

Revision 1.3 Revision 1.56
1# Copyright 1999-2002 Gentoo Technologies, Inc. 1# Copyright 1999-2003 Gentoo Technologies, Inc.
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.56 2003/09/22 21:08:27 wolf31o2 Exp $
4#
3# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@gentoo.org>
4# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.3 2002/11/11 19:51:20 azarah Exp $ 6#
5# This eclass is for general purpose functions that most ebuilds 7# This eclass is for general purpose functions that most ebuilds
6# have to implement themselfs. 8# have to implement themselves.
7# 9#
8# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
9 11
10ECLASS=eutils 12ECLASS=eutils
11INHERITED="$INHERITED $ECLASS" 13INHERITED="$INHERITED $ECLASS"
12 14
13newdepend sys-devel/patch 15newdepend "!bootstrap? ( sys-devel/patch )"
14 16
15DESCRIPTION="Based on the ${ECLASS} eclass" 17DESCRIPTION="Based on the ${ECLASS} eclass"
16 18
17# This function generate linker scripts in /usr/lib for dynamic 19# This function generate linker scripts in /usr/lib for dynamic
18# 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
34# 36#
35gen_usr_ldscript() { 37gen_usr_ldscript() {
36 38
37 # Just make sure it exists 39 # Just make sure it exists
38 dodir /usr/lib 40 dodir /usr/lib
39 41
40 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT" 42 cat > ${D}/usr/lib/$1 <<"END_LDSCRIPT"
41/* GNU ld script 43/* GNU ld script
42 Because Gentoo have critical dynamic libraries 44 Because Gentoo have critical dynamic libraries
43 in /lib, and the static versions in /usr/lib, we 45 in /lib, and the static versions in /usr/lib, we
44 need to have a "fake" dynamic lib in /usr/lib, 46 need to have a "fake" dynamic lib in /usr/lib,
47 more info. */ 49 more info. */
48GROUP ( /lib/libxxx ) 50GROUP ( /lib/libxxx )
49END_LDSCRIPT 51END_LDSCRIPT
50 52
51 dosed "s:libxxx:$1:" /usr/lib/$1 53 dosed "s:libxxx:$1:" /usr/lib/$1
52}
53 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#
62draw_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}
54 87
55# Default directory where patches are located 88# Default directory where patches are located
56EPATCH_SOURCE="${WORKDIR}/patch" 89EPATCH_SOURCE="${WORKDIR}/patch"
57# Default extension for patches 90# Default extension for patches
58EPATCH_SUFFIX="patch.bz2" 91EPATCH_SUFFIX="patch.bz2"
59# Default options for patch 92# Default options for patch
93# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571
60EPATCH_OPTS="" 94EPATCH_OPTS="-g0"
95# List of patches not to apply. Not this is only file names,
96# and not the full path ..
97EPATCH_EXCLUDE=""
98# Change the printed message for a single patch.
99EPATCH_SINGLE_MSG=""
100# Force applying bulk patches even if not following the style:
101#
102# ??_${ARCH}_foo.${EPATCH_SUFFIX}
103#
104EPATCH_FORCE="no"
61 105
62# 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
63# or two patches. 107# or two patches.
64# 108#
65# It should work with .bz2, .gz, .zip and plain text patches. 109# It should work with .bz2, .gz, .zip and plain text patches.
93# <azarah@gentoo.org> (10 Nov 2002) 137# <azarah@gentoo.org> (10 Nov 2002)
94# 138#
95epatch() { 139epatch() {
96 local PIPE_CMD="" 140 local PIPE_CMD=""
97 local STDERR_TARGET="${T}/$$.out" 141 local STDERR_TARGET="${T}/$$.out"
142 local PATCH_TARGET="${T}/$$.patch"
143 local PATCH_SUFFIX=""
98 local SINGLE_PATCH="no" 144 local SINGLE_PATCH="no"
145 local x=""
99 146
100 if [ "$#" -gt 1 ] 147 if [ "$#" -gt 1 ]
101 then 148 then
102 eerror "Invalid arguments to epatch()" 149 eerror "Invalid arguments to epatch()"
103 die "Invalid arguments to epatch()" 150 die "Invalid arguments to epatch()"
104 fi 151 fi
105 152
106 if [ -n "$1" -a -f "$1" ] 153 if [ -n "$1" -a -f "$1" ]
107 then 154 then
108 SINGLE_PATCH="yes" 155 SINGLE_PATCH="yes"
109 156
110 EPATCH_SOURCE="$1" 157 local EPATCH_SOURCE="$1"
111 EPATCH_SUFFIX="${1##*\.}" 158 local EPATCH_SUFFIX="${1##*\.}"
112 159
113 elif [ -n "$1" -a -d "$1" ] 160 elif [ -n "$1" -a -d "$1" ]
114 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
115 EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 167 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
168 fi
116 else 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
117 EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 185 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
118 fi 186 fi
119 187
120 case ${EPATCH_SUFFIX##*\.} in 188 case ${EPATCH_SUFFIX##*\.} in
121 bz2) 189 bz2)
122 PIPE_CMD="bzip2 -dc" 190 PIPE_CMD="bzip2 -dc"
191 PATCH_SUFFIX="bz2"
123 ;; 192 ;;
124 gz) 193 gz|Z|z)
125 PIPE_CMD="gzip -dc" 194 PIPE_CMD="gzip -dc"
195 PATCH_SUFFIX="gz"
126 ;; 196 ;;
127 zip) 197 ZIP|zip)
128 PIPE_CMD="unzip -p" 198 PIPE_CMD="unzip -p"
199 PATCH_SUFFIX="zip"
129 ;; 200 ;;
130 *) 201 *)
131 PIPE_CMD="cat" 202 PIPE_CMD="cat"
203 PATCH_SUFFIX="patch"
132 ;; 204 ;;
133 esac 205 esac
134 206
135 if [ "${SINGLE_PATCH}" = "no" ] 207 if [ "${SINGLE_PATCH}" = "no" ]
136 then 208 then
141 # New ARCH dependant patch naming scheme... 213 # New ARCH dependant patch naming scheme...
142 # 214 #
143 # ???_arch_foo.patch 215 # ???_arch_foo.patch
144 # 216 #
145 if [ -f ${x} ] && \ 217 if [ -f ${x} ] && \
146 [ -n "$1" -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" ])
147 then 220 then
148 local count=0 221 local count=0
149 local popts="${EPATCH_OPTS}" 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
150 230 fi
231
151 if [ "${SINGLE_PATCH}" = "yes" ] 232 if [ "${SINGLE_PATCH}" = "yes" ]
152 then 233 then
234 if [ -n "${EPATCH_SINGLE_MSG}" ]
235 then
236 einfo "${EPATCH_SINGLE_MSG}"
237 else
153 einfo "Applying ${x##*/}..." 238 einfo "Applying ${x##*/}..."
239 fi
154 else 240 else
155 einfo " ${x##*/}..." 241 einfo " ${x##*/}..."
156 fi 242 fi
157 243
158 echo "*** Patch ${x##*/} ***" > ${STDERR_TARGET} 244 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
245 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
159 246
160 # Allow for prefix to differ ... im lazy, so shoot me :/ 247 # Allow for prefix to differ ... im lazy, so shoot me :/
161 while [ "${count}" -lt 5 ] 248 while [ "${count}" -lt 5 ]
162 do 249 do
163 if eval ${PIPE_CMD} ${x} | patch ${popts} --dry-run -f -p${count} 2>&1 >> ${STDERR_TARGET} 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" ]
164 then 255 then
165 eval ${PIPE_CMD} ${x} | patch ${popts} -p${count} 2>&1 >> ${STDERR_TARGET} 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
166 break 302 break
167 fi 303 fi
168 304
169 count=$((count + 1)) 305 count=$((count + 1))
170 done 306 done
171 307
308 if [ "${PATCH_SUFFIX}" != "patch" ]
309 then
310 rm -f ${PATCH_TARGET}
311 fi
312
172 if [ "${count}" -eq 5 ] 313 if [ "${count}" -eq 5 ]
173 then 314 then
315 echo
174 eerror "Failed Patch: ${x##*/}!" 316 eerror "Failed Patch: ${x##*/}!"
175 eerror 317 eerror
176 eerror "Include in your bugreport the contents of:" 318 eerror "Include in your bugreport the contents of:"
177 eerror 319 eerror
178 eerror " ${STDERR_TARGET}" 320 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}"
179 eerror 321 echo
180 die "Failed Patch: ${x##*/}!" 322 die "Failed Patch: ${x##*/}!"
181 fi 323 fi
182 324
325 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
326
183 eend 0 327 eend 0
184 fi 328 fi
185 done 329 done
186 if [ "${SINGLE_PATCH}" = "no" ] 330 if [ "${SINGLE_PATCH}" = "no" ]
187 then 331 then
188 einfo "Done with patching" 332 einfo "Done with patching"
189 fi 333 fi
190} 334}
191 335
336# This function return true if we are using the NPTL pthreads
337# implementation.
338#
339# <azarah@gentoo.org> (06 March 2003)
340#
341
342have_NPTL() {
343
344 cat > ${T}/test-nptl.c <<-"END"
345 #define _XOPEN_SOURCE
346 #include <unistd.h>
347 #include <stdio.h>
348
349 int main()
350 {
351 char buf[255];
352 char *str = buf;
353
354 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
355 if (NULL != str) {
356 printf("%s\n", str);
357 if (NULL != strstr(str, "NPTL"))
358 return 0;
359 }
360
361 return 1;
362 }
363 END
364
365 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
366 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
367 then
368 echo "yes"
369 einfon "Checking what PTHREADS implementation we have ... "
370 if ${T}/nptl
371 then
372 return 0
373 else
374 return 1
375 fi
376 else
377 echo "no"
378 fi
379
380 return 1
381}
382
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#
388get_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)
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
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}'
490enewuser() {
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
600enewgroup() {
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>...)
651edos2unix() {
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
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.3  
changed lines
  Added in v.1.56

  ViewVC Help
Powered by ViewVC 1.1.20