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

Diff of /eclass/eutils.eclass

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

Revision 1.8 Revision 1.24
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.24 2003/03/03 21:27:15 vapier 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.8 2002/12/01 12:34:23 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 themselves. 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
90# Default options for patch 92# Default options for patch
91EPATCH_OPTS="" 93EPATCH_OPTS=""
92# List of patches not to apply. Not this is only file names, 94# List of patches not to apply. Not this is only file names,
93# and not the full path .. 95# and not the full path ..
94EPATCH_EXCLUDE="" 96EPATCH_EXCLUDE=""
97# Change the printed message for a single patch.
98EPATCH_SINGLE_MSG=""
95 99
96# This function is for bulk patching, or in theory for just one 100# This function is for bulk patching, or in theory for just one
97# or two patches. 101# or two patches.
98# 102#
99# It should work with .bz2, .gz, .zip and plain text patches. 103# It should work with .bz2, .gz, .zip and plain text patches.
151 then 155 then
152 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 156 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
153 else 157 else
154 if [ ! -d ${EPATCH_SOURCE} ] 158 if [ ! -d ${EPATCH_SOURCE} ]
155 then 159 then
160 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
161 then
162 EPATCH_SOURCE="$1"
163 fi
164
156 echo 165 echo
157 eerror "Cannot find \$EPATCH_SOURCE!" 166 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
167 eerror
168 eerror " ${EPATCH_SOURCE}"
158 echo 169 echo
159 die "Cannot find \$EPATCH_SOURCE!" 170 die "Cannot find \$EPATCH_SOURCE!"
160 fi 171 fi
161 172
162 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 173 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
190 # New ARCH dependant patch naming scheme... 201 # New ARCH dependant patch naming scheme...
191 # 202 #
192 # ???_arch_foo.patch 203 # ???_arch_foo.patch
193 # 204 #
194 if [ -f ${x} ] && \ 205 if [ -f ${x} ] && \
195 [ -n "$1" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ] 206 [ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "`eval echo \$\{x/_${ARCH}_\}`" != "${x}" ]
196 then 207 then
197 local count=0 208 local count=0
198 local popts="${EPATCH_OPTS}" 209 local popts="${EPATCH_OPTS}"
199 210
200 if [ -n "${EPATCH_EXCLUDE}" ] 211 if [ -n "${EPATCH_EXCLUDE}" ]
201 then 212 then
202 if [ "${EPATCH_EXCLUDE/${x##*/}}" != "${EPATCH_EXCLUDE}" ] 213 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ]
203 then 214 then
204 continue 215 continue
205 fi 216 fi
206 fi 217 fi
207 218
208 if [ "${SINGLE_PATCH}" = "yes" ] 219 if [ "${SINGLE_PATCH}" = "yes" ]
209 then 220 then
221 if [ -n "${EPATCH_SINGLE_MSG}" ]
222 then
223 einfo "${EPATCH_SINGLE_MSG}"
224 else
210 einfo "Applying ${x##*/}..." 225 einfo "Applying ${x##*/}..."
226 fi
211 else 227 else
212 einfo " ${x##*/}..." 228 einfo " ${x##*/}..."
213 fi 229 fi
214 230
215 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 231 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
246 count=5 262 count=5
247 break 263 break
248 fi 264 fi
249 fi 265 fi
250 266
251 if patch ${popts} --dry-run -f -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1 267 if (cat ${PATCH_TARGET} | patch ${popts} --dry-run -f -p${count}) >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 2>&1
252 then 268 then
253 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 269 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
254 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 270 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
255 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 271 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
256 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 272 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
257 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 273 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real
258 274
259 patch ${popts} -p${count} < ${PATCH_TARGET} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1 275 cat ${PATCH_TARGET} | patch ${popts} -p${count} >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 2>&1
260 276
261 if [ "$?" -ne 0 ] 277 if [ "$?" -ne 0 ]
262 then 278 then
263 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 279 cat ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}
264 echo 280 echo
302 then 318 then
303 einfo "Done with patching" 319 einfo "Done with patching"
304 fi 320 fi
305} 321}
306 322
323# This function check how many cpu's are present, and then set
324# -j in MAKEOPTS accordingly.
325#
326# Thanks to nall <nall@gentoo.org> for this.
327#
328get_number_of_jobs() {
329 local jobs=0
330
331 if [ ! -r /proc/cpuinfo ]
332 then
333 return 1
334 fi
335
336 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
337 if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
338 then
339 ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
340 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
341 ADMINPARAM="${ADMINPARAM/-j}"
342 fi
343
344 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
345
346 if [ "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
347 "${ARCH}" = "arm" -o "${ARCH}" = "mips" ]
348 then
349 # these archs will always have "[Pp]rocessor"
350 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
351
352 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
353 then
354 # sparc always has "ncpus active"
355 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
356
357 elif [ "${ARCH}" = "alpha" ]
358 then
359 # alpha has "cpus active", but only when compiled with SMP
360 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
361 then
362 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
363 else
364 jobs=2
365 fi
366
367 elif [ "${ARCH}" = "ppc" ]
368 then
369 # ppc has "processor", but only when compiled with SMP
370 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
371 then
372 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
373 else
374 jobs=2
375 fi
376 else
377 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
378 die "Unknown ARCH -- ${ARCH}!"
379 fi
380
381 # Make sure the number is valid ...
382 if [ "${jobs}" -lt 1 ]
383 then
384 jobs=1
385 fi
386
387 if [ -n "${ADMINPARAM}" ]
388 then
389 if [ "${jobs}" -gt "${ADMINPARAM}" ]
390 then
391 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
392 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
393 else
394 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
395 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
396 fi
397 fi
398}
399
400# Simplify/standardize adding users to the system
401# vapier@gentoo.org
402#
403# enewuser(username, uid, shell, homedir, groups, extra options)
404#
405# Default values if you do not specify any:
406# username: REQUIRED !
407# uid: next available (see useradd(8))
408# shell: /bin/false
409# homedir: /dev/null
410# groups: none
411# extra: comment of 'added by portage for ${PN}'
412enewuser() {
413 # get the username
414 local euser="$1"; shift
415 if [ -z "${euser}" ] ; then
416 eerror "No username specified !"
417 die "Cannot call enewuser without a username"
418 fi
419 einfo "Adding user '${euser}' to your system ..."
420
421 # setup a file for testing usernames/groups
422 local tmpfile="`mktemp -p ${T}`"
423 touch ${tmpfile}
424 chown ${euser} ${tmpfile} >& /dev/null
425 local realuser="`ls -l ${tmpfile} | awk '{print $3}'`"
426
427 # see if user already exists
428 if [ "${euser}" == "${realuser}" ] ; then
429 einfo "${euser} already exists on your system :)"
430 return 0
431 fi
432
433 # options to pass to useradd
434 local opts=""
435
436 # handle uid
437 local euid="$1"; shift
438 if [ ! -z "${euid}" ] ; then
439 if [ ${euid} -gt 0 ] ; then
440 opts="${opts} -u ${euid}"
441 else
442 eerror "Userid given but is not greater than 0 !"
443 die "${euid} is not a valid UID"
444 fi
445 else
446 euid="next available"
447 fi
448 einfo " - Userid: ${euid}"
449
450 # handle shell
451 local eshell="$1"; shift
452 if [ ! -z "${eshell}" ] ; then
453 if [ ! -e ${eshell} ] ; then
454 eerror "A shell was specified but it does not exist !"
455 die "${eshell} does not exist"
456 fi
457 else
458 eshell=/bin/false
459 fi
460 einfo " - Shell: ${eshell}"
461 opts="${opts} -s ${eshell}"
462
463 # handle homedir
464 local ehome="$1"; shift
465 if [ -z "${ehome}" ] ; then
466 ehome=/dev/null
467 fi
468 einfo " - Home: ${ehome}"
469 opts="${opts} -d ${ehome}"
470
471 # handle groups
472 local egroups="$1"; shift
473 if [ ! -z "${egroups}" ] ; then
474 local realgroup
475 local oldifs="${IFS}"
476 export IFS=","
477 for g in ${egroups} ; do
478 chgrp ${g} ${tmpfile} >& /dev/null
479 realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
480 if [ "${g}" != "${realgroup}" ] ; then
481 eerror "You must add ${g} to the system first"
482 die "${g} is not a valid GID"
483 fi
484 done
485 export IFS="${oldifs}"
486 opts="${opts} -g ${egroups}"
487 else
488 egroups="(none)"
489 fi
490 einfo " - Groups: ${egroups}"
491
492 # handle extra and add the user
493 local eextra="$@"
494 local oldsandbox="${oldsandbox}"
495 export SANDBOX_ON="0"
496 if [ -z "${eextra}" ] ; then
497 useradd ${opts} ${euser} \
498 -c "added by portage for ${PN}" \
499 || die "enewuser failed"
500 else
501 einfo " - Extra: ${eextra}"
502 useradd ${opts} ${euser} ${eextra} \
503 || die "enewuser failed"
504 fi
505 export SANDBOX_ON="${oldsandbox}"
506
507 if [ ! -e ${ehome} ] && [ ! -e ${D}/${ehome} ] ; then
508 einfo " - Creating ${ehome} in ${D}"
509 dodir ${ehome}
510 fperms ${euser} ${ehome}
511 fi
512}
513
514# Simplify/standardize adding groups to the system
515# vapier@gentoo.org
516#
517# enewgroup(group, gid)
518#
519# Default values if you do not specify any:
520# groupname: REQUIRED !
521# gid: next available (see groupadd(8))
522# extra: none
523enewgroup() {
524 # get the group
525 local egroup="$1"; shift
526 if [ -z "${egroup}" ] ; then
527 eerror "No group specified !"
528 die "Cannot call enewgroup without a group"
529 fi
530 einfo "Adding group '${egroup}' to your system ..."
531
532 # setup a file for testing groupname
533 local tmpfile="`mktemp -p ${T}`"
534 touch ${tmpfile}
535 chgrp ${egroup} ${tmpfile} >& /dev/null
536 local realgroup="`ls -l ${tmpfile} | awk '{print $4}'`"
537
538 # see if group already exists
539 if [ "${egroup}" == "${realgroup}" ] ; then
540 einfo "${egroup} already exists on your system :)"
541 return 0
542 fi
543
544 # options to pass to useradd
545 local opts=""
546
547 # handle gid
548 local egid="$1"; shift
549 if [ ! -z "${egid}" ] ; then
550 if [ ${egid} -gt 0 ] ; then
551 opts="${opts} -g ${egid}"
552 else
553 eerror "Groupid given but is not greater than 0 !"
554 die "${egid} is not a valid GID"
555 fi
556 else
557 egid="next available"
558 fi
559 einfo " - Groupid: ${egid}"
560
561 # handle extra
562 local eextra="$@"
563 opts="${opts} ${eextra}"
564
565 # add the group
566 local oldsandbox="${oldsandbox}"
567 export SANDBOX_ON="0"
568 groupadd ${opts} ${egroup} || die "enewgroup failed"
569 export SANDBOX_ON="${oldsandbox}"
570}
571
572# Simple script to replace 'dos2unix' binaries
573# vapier@gentoo.org
574#
575# edos2unix(file, <more files>...)
576edos2unix() {
577 for f in $@ ; do
578 cp ${f} ${T}/
579 sed 's/\r$//' ${T}/${f}.old > ${f}
580 done
581}

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.24

  ViewVC Help
Powered by ViewVC 1.1.20