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

Diff of /eclass/eutils.eclass

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

Revision 1.95 Revision 1.177
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.95 2004/08/15 03:25:19 lv Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.177 2005/05/26 15:13:36 carlo 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.
9# 9#
10# NB: If you add anything, please comment it! 10# NB: If you add anything, please comment it!
11 11
12inherit multilib
12ECLASS=eutils 13ECLASS=eutils
13INHERITED="$INHERITED $ECLASS" 14INHERITED="$INHERITED $ECLASS"
14 15
15DEPEND="!bootstrap? ( sys-devel/patch )" 16DEPEND="!bootstrap? ( sys-devel/patch )"
16 17
17DESCRIPTION="Based on the ${ECLASS} eclass" 18DESCRIPTION="Based on the ${ECLASS} eclass"
19
20# Wait for the supplied number of seconds. If no argument is supplied, defaults
21# to five seconds. If the EPAUSE_IGNORE env var is set, don't wait. If we're not
22# outputting to a terminal, don't wait. For compatability purposes, the argument
23# must be an integer greater than zero.
24# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
25epause() {
26 if [ -z "$EPAUSE_IGNORE" ] && [ -t 1 ] ; then
27 sleep ${1:-5}
28 fi
29}
30
31# Beep the specified number of times (defaults to five). If our output
32# is not a terminal, don't beep. If the EBEEP_IGNORE env var is set,
33# don't beep.
34# Bug 62950, Ciaran McCreesh <ciaranm@gentoo.org> (05 Sep 2004)
35ebeep() {
36 local n
37 if [ -z "$EBEEP_IGNORE" ] && [ -t 1 ] ; then
38 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
39 echo -ne "\a"
40 sleep 0.1 &>/dev/null ; sleep 0,1 &>/dev/null
41 echo -ne "\a"
42 sleep 1
43 done
44 fi
45}
18 46
19# This function generate linker scripts in /usr/lib for dynamic 47# This function generate linker scripts in /usr/lib for dynamic
20# libs in /lib. This is to fix linking problems when you have 48# 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 49# 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 50# in some cases when linking dynamic, the .a in /usr/lib is used
33# to point to the latest version of the library present. 61# to point to the latest version of the library present.
34# 62#
35# <azarah@gentoo.org> (26 Oct 2002) 63# <azarah@gentoo.org> (26 Oct 2002)
36# 64#
37gen_usr_ldscript() { 65gen_usr_ldscript() {
38 # this adds support for installing to lib64/lib32. since only portage 66 local libdir="$(get_libdir)"
39 # 2.0.51 will have this functionality supported in dolib and friends,
40 # and since it isnt expected that many profiles will define it, we need
41 # to make this variable default to lib.
42 [ -z "${CONF_LIBDIR}" ] && CONF_LIBDIR="lib"
43
44 # Just make sure it exists 67 # Just make sure it exists
45 dodir /usr/${CONF_LIBDIR} 68 dodir /usr/${libdir}
46 69
47 cat > ${D}/usr/${CONF_LIBDIR}/$1 <<"END_LDSCRIPT" 70 for lib in "${@}" ; do
71 cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
48/* GNU ld script 72 /* GNU ld script
49 Because Gentoo have critical dynamic libraries 73 Since Gentoo has critical dynamic libraries
50 in /lib, and the static versions in /usr/lib, we 74 in /lib, and the static versions in /usr/lib,
51 need to have a "fake" dynamic lib in /usr/lib, 75 we need to have a "fake" dynamic lib in /usr/lib,
52 otherwise we run into linking problems. 76 otherwise we run into linking problems.
53 See bug #4411 on http://bugs.gentoo.org/ for 77
54 more info. */ 78 See bug http://bugs.gentoo.org/4411 for more info.
79 */
80 GROUP ( /${libdir}/${lib} )
55END_LDSCRIPT 81 END_LDSCRIPT
56 82 fperms a+x "/usr/${libdir}/${lib}"
57 echo "GROUP ( /${CONF_LIBDIR}/libxxx )" >> ${D}/usr/${CONF_LIBDIR}/$1 83 done
58 dosed "s:libxxx:$1:" /usr/${CONF_LIBDIR}/$1
59
60 return 0
61} 84}
62 85
63# 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()
64# 88#
65# <azarah@gentoo.org> (11 Nov 2002) 89# <azarah@gentoo.org> (11 Nov 2002)
66# 90#
67draw_line() { 91draw_line() {
68 local i=0 92 local i=0
94EPATCH_SOURCE="${WORKDIR}/patch" 118EPATCH_SOURCE="${WORKDIR}/patch"
95# Default extension for patches 119# Default extension for patches
96EPATCH_SUFFIX="patch.bz2" 120EPATCH_SUFFIX="patch.bz2"
97# Default options for patch 121# Default options for patch
98# 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
99EPATCH_OPTS="-g0" 123# Set --no-backup-if-mismatch so we don't leave '.orig' files behind.
124EPATCH_OPTS="-g0 --no-backup-if-mismatch"
100# 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,
101# and not the full path .. 126# and not the full path ..
102EPATCH_EXCLUDE="" 127EPATCH_EXCLUDE=""
103# Change the printed message for a single patch. 128# Change the printed message for a single patch.
104EPATCH_SINGLE_MSG="" 129EPATCH_SINGLE_MSG=""
130# Change the printed message for multiple patches.
131EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
105# Force applying bulk patches even if not following the style: 132# Force applying bulk patches even if not following the style:
106# 133#
107# ??_${ARCH}_foo.${EPATCH_SUFFIX} 134# ??_${ARCH}_foo.${EPATCH_SUFFIX}
108# 135#
109EPATCH_FORCE="no" 136EPATCH_FORCE="no"
150 local x="" 177 local x=""
151 178
152 if [ "$#" -gt 1 ] 179 if [ "$#" -gt 1 ]
153 then 180 then
154 local m="" 181 local m=""
155 einfo "${#} patches to apply..."
156 for m in "$@" ; do 182 for m in "$@" ; do
157 epatch "${m}" 183 epatch "${m}"
158 done 184 done
159 return 0 185 return 0
160 fi 186 fi
174 local EPATCH_SOURCE="$1/*" 200 local EPATCH_SOURCE="$1/*"
175 else 201 else
176 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 202 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
177 fi 203 fi
178 else 204 else
179 if [ ! -d ${EPATCH_SOURCE} ] 205 if [ ! -d ${EPATCH_SOURCE} ] || [ -n "$1" ]
180 then 206 then
181 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 207 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
182 then 208 then
183 EPATCH_SOURCE="$1" 209 EPATCH_SOURCE="$1"
184 fi 210 fi
185 211
186 echo 212 echo
187 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:" 213 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
188 eerror 214 eerror
189 eerror " ${EPATCH_SOURCE}" 215 eerror " ${EPATCH_SOURCE}"
216 eerror " ( ${EPATCH_SOURCE##*/} )"
190 echo 217 echo
191 die "Cannot find \$EPATCH_SOURCE!" 218 die "Cannot find \$EPATCH_SOURCE!"
192 fi 219 fi
193 220
194 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}" 221 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
213 ;; 240 ;;
214 esac 241 esac
215 242
216 if [ "${SINGLE_PATCH}" = "no" ] 243 if [ "${SINGLE_PATCH}" = "no" ]
217 then 244 then
218 einfo "Applying various patches (bugfixes/updates)..." 245 einfo "${EPATCH_MULTI_MSG}"
219 fi 246 fi
220 for x in ${EPATCH_SOURCE} 247 for x in ${EPATCH_SOURCE}
221 do 248 do
222 # New ARCH dependant patch naming scheme... 249 # New ARCH dependant patch naming scheme ...
223 # 250 #
224 # ???_arch_foo.patch 251 # ???_arch_foo.patch
225 # 252 #
226 if [ -f ${x} ] && \ 253 if [ -f ${x} ] && \
227 ([ "${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}" ] || \
228 [ "${EPATCH_FORCE}" = "yes" ]) 255 [ "${EPATCH_FORCE}" = "yes" ])
229 then 256 then
230 local count=0 257 local count=0
231 local popts="${EPATCH_OPTS}" 258 local popts="${EPATCH_OPTS}"
259 local patchname=${x##*/}
232 260
233 if [ -n "${EPATCH_EXCLUDE}" ] 261 if [ -n "${EPATCH_EXCLUDE}" ]
234 then 262 then
235 if [ "`eval echo \$\{EPATCH_EXCLUDE/${x##*/}\}`" != "${EPATCH_EXCLUDE}" ] 263 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
236 then 264 then
237 continue 265 continue
238 fi 266 fi
239 fi 267 fi
240 268
242 then 270 then
243 if [ -n "${EPATCH_SINGLE_MSG}" ] 271 if [ -n "${EPATCH_SINGLE_MSG}" ]
244 then 272 then
245 einfo "${EPATCH_SINGLE_MSG}" 273 einfo "${EPATCH_SINGLE_MSG}"
246 else 274 else
247 einfo "Applying ${x##*/}..." 275 einfo "Applying ${patchname} ..."
248 fi 276 fi
249 else 277 else
250 einfo " ${x##*/}..." 278 einfo " ${patchname} ..."
251 fi 279 fi
252 280
253 echo "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 281 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
254 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 282 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
255 283
256 # Allow for prefix to differ ... im lazy, so shoot me :/ 284 # Allow for prefix to differ ... im lazy, so shoot me :/
257 while [ "${count}" -lt 5 ] 285 while [ "${count}" -lt 5 ]
258 do 286 do
259 # Generate some useful debug info ... 287 # Generate some useful debug info ...
260 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 288 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
261 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 289 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
262 290
263 if [ "${PATCH_SUFFIX}" != "patch" ] 291 if [ "${PATCH_SUFFIX}" != "patch" ]
264 then 292 then
265 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 293 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
266 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 294 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
267 else 295 else
268 PATCH_TARGET="${x}" 296 PATCH_TARGET="${x}"
269 fi 297 fi
270 298
271 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 299 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
272 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##*/}
273 301
274 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 302 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
275 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 303 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
276 304
277 if [ "${PATCH_SUFFIX}" != "patch" ] 305 if [ "${PATCH_SUFFIX}" != "patch" ]
278 then 306 then
279 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
280 then 308 then
281 echo 309 echo
282 eerror "Could not extract patch!" 310 eerror "Could not extract patch!"
283 #die "Could not extract patch!" 311 #die "Could not extract patch!"
284 count=5 312 count=5
285 break 313 break
286 fi 314 fi
287 fi 315 fi
288 316
289 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
290 then 318 then
291 draw_line "***** ${x##*/} *****" > ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 319 draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
292 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 320 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
293 echo "ACTUALLY APPLYING ${x##*/}..." >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 321 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
294 echo >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 322 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
295 draw_line "***** ${x##*/} *****" >> ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 323 draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
296 324
297 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
298 326
299 if [ "$?" -ne 0 ] 327 if [ "$?" -ne 0 ]
300 then 328 then
301 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##*/}
302 echo 330 echo
303 eerror "A dry-run of patch command succeeded, but actually" 331 eerror "A dry-run of patch command succeeded, but actually"
304 eerror "applying the patch failed!" 332 eerror "applying the patch failed!"
305 #die "Real world sux compared to the dreamworld!" 333 #die "Real world sux compared to the dreamworld!"
306 count=5 334 count=5
307 fi 335 fi
308 336
309 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}.real 337 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
310 338
311 break 339 break
312 fi 340 fi
313 341
314 count=$((count + 1)) 342 count=$((count + 1))
320 fi 348 fi
321 349
322 if [ "${count}" -eq 5 ] 350 if [ "${count}" -eq 5 ]
323 then 351 then
324 echo 352 echo
325 eerror "Failed Patch: ${x##*/}!" 353 eerror "Failed Patch: ${patchname} !"
354 eerror " ( ${PATCH_TARGET} )"
326 eerror 355 eerror
327 eerror "Include in your bugreport the contents of:" 356 eerror "Include in your bugreport the contents of:"
328 eerror 357 eerror
329 eerror " ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/}" 358 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
330 echo 359 echo
331 die "Failed Patch: ${x##*/}!" 360 die "Failed Patch: ${patchname}!"
332 fi 361 fi
333 362
334 rm -f ${STDERR_TARGET%/*}/${x##*/}-${STDERR_TARGET##*/} 363 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
335 364
336 eend 0 365 eend 0
337 fi 366 fi
338 done 367 done
339 if [ "${SINGLE_PATCH}" = "no" ] 368 if [ "${SINGLE_PATCH}" = "no" ]
340 then 369 then
341 einfo "Done with patching" 370 einfo "Done with patching"
342 fi
343}
344
345# This function return true if we are using the NPTL pthreads
346# implementation.
347#
348# <azarah@gentoo.org> (06 March 2003)
349#
350
351have_NPTL() {
352
353 cat > ${T}/test-nptl.c <<-"END"
354 #define _XOPEN_SOURCE
355 #include <unistd.h>
356 #include <stdio.h>
357
358 int main()
359 {
360 char buf[255];
361 char *str = buf;
362
363 confstr(_CS_GNU_LIBPTHREAD_VERSION, str, 255);
364 if (NULL != str) {
365 printf("%s\n", str);
366 if (NULL != strstr(str, "NPTL"))
367 return 0;
368 }
369
370 return 1;
371 }
372 END
373
374 einfon "Checking for _CS_GNU_LIBPTHREAD_VERSION support in glibc ... "
375 if gcc -o ${T}/nptl ${T}/test-nptl.c &> /dev/null
376 then
377 echo "yes"
378 einfon "Checking what PTHREADS implementation we have ... "
379 if ${T}/nptl
380 then
381 return 0
382 else
383 return 1
384 fi
385 else
386 echo "no"
387 fi
388
389 return 1
390}
391
392# This function check how many cpu's are present, and then set
393# -j in MAKEOPTS accordingly.
394#
395# Thanks to nall <nall@gentoo.org> for this.
396#
397get_number_of_jobs() {
398 local jobs=0
399
400 if [ ! -r /proc/cpuinfo ]
401 then
402 return 1
403 fi
404
405 # This bit is from H?kan Wessberg <nacka-gentoo@refug.org>, bug #13565.
406 if [ "`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | wc -l`" -gt 0 ]
407 then
408 ADMINOPTS="`egrep "^[[:space:]]*MAKEOPTS=" /etc/make.conf | cut -d= -f2 | sed 's/\"//g'`"
409 ADMINPARAM="`echo ${ADMINOPTS} | gawk '{match($0, /-j *[0-9]*/, opt); print opt[0]}'`"
410 ADMINPARAM="${ADMINPARAM/-j}"
411 fi
412
413 export MAKEOPTS="`echo ${MAKEOPTS} | sed -e 's:-j *[0-9]*::g'`"
414
415 if [ "${ARCH}" = "amd64" -o "${ARCH}" = "x86" -o "${ARCH}" = "hppa" -o \
416 "${ARCH}" = "arm" -o "${ARCH}" = "mips" -o "${ARCH}" = "ia64" ]
417 then
418 # these archs will always have "[Pp]rocessor"
419 jobs="$((`grep -c ^[Pp]rocessor /proc/cpuinfo` * 2))"
420
421 elif [ "${ARCH}" = "sparc" -o "${ARCH}" = "sparc64" ]
422 then
423 # sparc always has "ncpus active"
424 jobs="$((`grep "^ncpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
425
426 elif [ "${ARCH}" = "alpha" ]
427 then
428 # alpha has "cpus active", but only when compiled with SMP
429 if [ "`grep -c "^cpus active" /proc/cpuinfo`" -eq 1 ]
430 then
431 jobs="$((`grep "^cpus active" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
432 else
433 jobs=2
434 fi
435
436 elif [ "${ARCH}" = "ppc" -o "${ARCH}" = "ppc64" ]
437 then
438 # ppc has "processor", but only when compiled with SMP
439 if [ "`grep -c "^processor" /proc/cpuinfo`" -eq 1 ]
440 then
441 jobs="$((`grep -c ^processor /proc/cpuinfo` * 2))"
442 else
443 jobs=2
444 fi
445 elif [ "${ARCH}" = "s390" ]
446 then
447 # s390 has "# processors : "
448 jobs="$((`grep "^\# processors" /proc/cpuinfo | sed -e "s/^.*: //"` * 2))"
449 else
450 jobs="$((`grep -c ^cpu /proc/cpuinfo` * 2))"
451 die "Unknown ARCH -- ${ARCH}!"
452 fi
453
454 # Make sure the number is valid ...
455 if [ "${jobs}" -lt 1 ]
456 then
457 jobs=1
458 fi
459
460 if [ -n "${ADMINPARAM}" ]
461 then
462 if [ "${jobs}" -gt "${ADMINPARAM}" ]
463 then
464 einfo "Setting make jobs to \"-j${ADMINPARAM}\" to ensure successful merge..."
465 export MAKEOPTS="${MAKEOPTS} -j${ADMINPARAM}"
466 else
467 einfo "Setting make jobs to \"-j${jobs}\" to ensure successful merge..."
468 export MAKEOPTS="${MAKEOPTS} -j${jobs}"
469 fi
470 fi 371 fi
471} 372}
472 373
473# Cheap replacement for when debianutils (and thus mktemp) 374# Cheap replacement for when debianutils (and thus mktemp)
474# does not exist on the users system 375# does not exist on the users system
475# vapier@gentoo.org 376# vapier@gentoo.org
476# 377#
477# Takes just 1 parameter (the directory to create tmpfile in) 378# Takes just 1 optional parameter (the directory to create tmpfile in)
478mymktemp() { 379emktemp() {
380 local exe="touch"
381 [ "$1" == "-d" ] && exe="mkdir" && shift
479 local topdir="$1" 382 local topdir="$1"
480 383
481 [ -z "${topdir}" ] && topdir=/tmp 384 if [ -z "${topdir}" ]
482 if [ "`which mktemp 2>/dev/null`" ]
483 then 385 then
484 mktemp -p ${topdir} 386 [ -z "${T}" ] \
485 else 387 && topdir="/tmp" \
388 || topdir="${T}"
389 fi
390
391 if [ -z "$(type -p mktemp)" ]
392 then
393 local tmp=/
394 while [ -e "${tmp}" ] ; do
486 local tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}" 395 tmp="${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}"
487 touch ${tmp} 396 done
397 ${exe} "${tmp}"
488 echo ${tmp} 398 echo "${tmp}"
399 else
400 [ "${exe}" == "touch" ] \
401 && exe="-p" \
402 || exe="-d"
403 mktemp ${exe} "${topdir}"
489 fi 404 fi
490} 405}
491 406
492# Small wrapper for getent (Linux) and nidump (Mac OS X) 407# Small wrapper for getent (Linux), nidump (Mac OS X),
493# used in enewuser()/enewgroup() 408# and pw (FreeBSD) used in enewuser()/enewgroup()
494# Joe Jezak <josejx@gmail.com> and usata@gentoo.org 409# Joe Jezak <josejx@gmail.com> and usata@gentoo.org
410# FBSD stuff: Aaron Walker <ka0ttic@gentoo.org>
495# 411#
496# egetent(database, key) 412# egetent(database, key)
497egetent() { 413egetent() {
498 if [ "${ARCH}" == "macos" ] ; then 414 if useq ppc-macos ; then
499 case "$2" in 415 case "$2" in
500 *[!0-9]*) # Non numeric 416 *[!0-9]*) # Non numeric
501 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 417 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
502 ;; 418 ;;
503 *) # Numeric 419 *) # Numeric
504 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }" 420 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
505 ;; 421 ;;
506 esac 422 esac
423 elif useq x86-fbsd ; then
424 local action
425 if [ "$1" == "passwd" ]
426 then
427 action="user"
507 else 428 else
429 action="group"
430 fi
431 pw show "${action}" "$2" -q
432 else
433 which nscd >& /dev/null && nscd -i "$1"
508 getent $1 $2 434 getent "$1" "$2"
509 fi 435 fi
510} 436}
511 437
512# Simplify/standardize adding users to the system 438# Simplify/standardize adding users to the system
513# vapier@gentoo.org 439# vapier@gentoo.org
559 euid="next" 485 euid="next"
560 fi 486 fi
561 if [ "${euid}" == "next" ] 487 if [ "${euid}" == "next" ]
562 then 488 then
563 local pwrange 489 local pwrange
564 if [ "${ARCH}" == "macos" ] ; then 490 if [ "${USERLAND}" == "BSD" ] ; then
565 pwrange="`jot 898 101`" 491 pwrange="`jot 898 101`"
566 else 492 else
567 pwrange="`seq 101 999`" 493 pwrange="`seq 101 999`"
568 fi 494 fi
569 for euid in ${pwrange} ; do 495 for euid in ${pwrange} ; do
581 then 507 then
582 eerror "A shell was specified but it does not exist !" 508 eerror "A shell was specified but it does not exist !"
583 die "${eshell} does not exist" 509 die "${eshell} does not exist"
584 fi 510 fi
585 else 511 else
512 if [ "${USERLAND}" == "BSD" ]
513 then
514 eshell="/usr/bin/false"
515 else
586 eshell="/bin/false" 516 eshell="/bin/false"
517 fi
587 fi 518 fi
588 einfo " - Shell: ${eshell}" 519 einfo " - Shell: ${eshell}"
589 opts="${opts} -s ${eshell}" 520 opts="${opts} -s ${eshell}"
590 521
591 # handle homedir 522 # handle homedir
592 local ehome="$1"; shift 523 local ehome="$1"; shift
593 if [ -z "${ehome}" ] && [ "${eshell}" != "-1" ] 524 if [ -z "${ehome}" ] || [ "${eshell}" == "-1" ]
594 then 525 then
595 ehome="/dev/null" 526 ehome="/dev/null"
596 fi 527 fi
597 einfo " - Home: ${ehome}" 528 einfo " - Home: ${ehome}"
598 opts="${opts} -d ${ehome}" 529 opts="${opts} -d ${ehome}"
600 # handle groups 531 # handle groups
601 local egroups="$1"; shift 532 local egroups="$1"; shift
602 if [ ! -z "${egroups}" ] 533 if [ ! -z "${egroups}" ]
603 then 534 then
604 local oldifs="${IFS}" 535 local oldifs="${IFS}"
536 local defgroup="" exgroups=""
537
605 export IFS="," 538 export IFS=","
606 for g in ${egroups} 539 for g in ${egroups}
607 do 540 do
541 export IFS="${oldifs}"
608 if [ -z "`egetent group \"${g}\"`" ] 542 if [ -z "`egetent group \"${g}\"`" ]
609 then 543 then
610 eerror "You must add group ${g} to the system first" 544 eerror "You must add group ${g} to the system first"
611 die "${g} is not a valid GID" 545 die "${g} is not a valid GID"
612 fi 546 fi
547 if [ -z "${defgroup}" ]
548 then
549 defgroup="${g}"
550 else
551 exgroups="${exgroups},${g}"
552 fi
553 export IFS=","
613 done 554 done
614 export IFS="${oldifs}" 555 export IFS="${oldifs}"
556
615 opts="${opts} -g ${egroups}" 557 opts="${opts} -g ${defgroup}"
558 if [ ! -z "${exgroups}" ]
559 then
560 opts="${opts} -G ${exgroups:1}"
561 fi
616 else 562 else
617 egroups="(none)" 563 egroups="(none)"
618 fi 564 fi
619 einfo " - Groups: ${egroups}" 565 einfo " - Groups: ${egroups}"
620 566
621 # handle extra and add the user 567 # handle extra and add the user
622 local eextra="$@" 568 local eextra="$@"
623 local oldsandbox="${SANDBOX_ON}" 569 local oldsandbox="${SANDBOX_ON}"
624 export SANDBOX_ON="0" 570 export SANDBOX_ON="0"
625 if [ "${ARCH}" == "macos" ]; 571 if useq ppc-macos
626 then 572 then
627 ### Make the user 573 ### Make the user
628 if [ -z "${eextra}" ] 574 if [ -z "${eextra}" ]
629 then 575 then
630 dscl . create /users/${euser} uid ${euid} 576 dscl . create /users/${euser} uid ${euid}
631 dscl . create /users/${euser} shell ${eshell} 577 dscl . create /users/${euser} shell ${eshell}
632 dscl . create /users/${euser} home ${ehome} 578 dscl . create /users/${euser} home ${ehome}
633 dscl . create /users/${euser} realname "added by portage for ${PN}" 579 dscl . create /users/${euser} realname "added by portage for ${PN}"
634 ### Add the user to the groups specified 580 ### Add the user to the groups specified
581 local oldifs="${IFS}"
582 export IFS=","
635 for g in ${egroups} 583 for g in ${egroups}
636 do 584 do
637 dscl . merge /groups/${g} users ${euser} 585 dscl . merge /groups/${g} users ${euser}
638 done 586 done
587 export IFS="${oldifs}"
639 else 588 else
640 einfo "Extra options are not supported on macos yet" 589 einfo "Extra options are not supported on macos yet"
641 einfo "Please report the ebuild along with the info below" 590 einfo "Please report the ebuild along with the info below"
642 einfo "eextra: ${eextra}" 591 einfo "eextra: ${eextra}"
643 die "Required function missing" 592 die "Required function missing"
593 fi
594 elif use x86-fbsd ; then
595 if [ -z "${eextra}" ]
596 then
597 pw useradd ${euser} ${opts} \
598 -c "added by portage for ${PN}" \
599 die "enewuser failed"
600 else
601 einfo " - Extra: ${eextra}"
602 pw useradd ${euser} ${opts} \
603 -c ${eextra} || die "enewuser failed"
644 fi 604 fi
645 else 605 else
646 if [ -z "${eextra}" ] 606 if [ -z "${eextra}" ]
647 then 607 then
648 useradd ${opts} ${euser} \ 608 useradd ${opts} ${euser} \
699 then 659 then
700 if [ "${egid}" -gt 0 ] 660 if [ "${egid}" -gt 0 ]
701 then 661 then
702 if [ -z "`egetent group ${egid}`" ] 662 if [ -z "`egetent group ${egid}`" ]
703 then 663 then
704 if [ "${ARCH}" == "macos" ] ; then 664 if useq ppc-macos ; then
705 opts="${opts} ${egid}" 665 opts="${opts} ${egid}"
706 else 666 else
707 opts="${opts} -g ${egid}" 667 opts="${opts} -g ${egid}"
708 fi 668 fi
709 else 669 else
723 opts="${opts} ${eextra}" 683 opts="${opts} ${eextra}"
724 684
725 # add the group 685 # add the group
726 local oldsandbox="${SANDBOX_ON}" 686 local oldsandbox="${SANDBOX_ON}"
727 export SANDBOX_ON="0" 687 export SANDBOX_ON="0"
728 if [ "${ARCH}" == "macos" ]; 688 if useq ppc-macos ; then
729 then
730 if [ ! -z "${eextra}" ]; 689 if [ ! -z "${eextra}" ];
731 then 690 then
732 einfo "Extra options are not supported on macos yet" 691 einfo "Extra options are not supported on macos yet"
733 einfo "Please report the ebuild along with the info below" 692 einfo "Please report the ebuild along with the info below"
734 einfo "eextra: ${eextra}" 693 einfo "eextra: ${eextra}"
735 die "Required function missing" 694 die "Required function missing"
736 fi 695 fi
737 696
738 # If we need the next available 697 # If we need the next available
739 case ${egid} in 698 case ${egid} in
740 *[!0-9]*) # Non numeric 699 *[!0-9]*) # Non numeric
741 for egid in `jot 898 101`; do 700 for egid in `jot 898 101`; do
742 [ -z "`egetent group ${egid}`" ] && break 701 [ -z "`egetent group ${egid}`" ] && break
743 done 702 done
744 esac 703 esac
745 dscl . create /groups/${egroup} gid ${egid} 704 dscl . create /groups/${egroup} gid ${egid}
746 dscl . create /groups/${egroup} passwd '*' 705 dscl . create /groups/${egroup} passwd '*'
706 elif use x86-fbsd ; then
707 case ${egid} in
708 *[!0-9]*) # Non numeric
709 for egid in `jot 898 101`; do
710 [ -z "`egetent group ${egid}`" ] && break
711 done
712 esac
713 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
747 else 714 else
748 groupadd ${opts} ${egroup} || die "enewgroup failed" 715 groupadd ${opts} ${egroup} || die "enewgroup failed"
749 fi 716 fi
750 export SANDBOX_ON="${oldsandbox}" 717 export SANDBOX_ON="${oldsandbox}"
751} 718}
752 719
753# Simple script to replace 'dos2unix' binaries 720# Simple script to replace 'dos2unix' binaries
754# vapier@gentoo.org 721# vapier@gentoo.org
755# 722#
756# edos2unix(file, <more files>...) 723# edos2unix(file, <more files> ...)
757edos2unix() { 724edos2unix() {
758 for f in "$@" 725 for f in "$@"
759 do 726 do
760 cp "${f}" ${T}/edos2unix 727 cp "${f}" ${T}/edos2unix
761 sed 's/\r$//' ${T}/edos2unix > "${f}" 728 sed 's/\r$//' ${T}/edos2unix > "${f}"
762 done 729 done
763} 730}
764 731
732
733##############################################################
734# START: Handle .desktop files and menu entries #
735# maybe this should be separated into a new eclass some time #
736# lanius@gentoo.org #
737##############################################################
738
765# Make a desktop file ! 739# Make a desktop file !
766# Great for making those icons in kde/gnome startmenu ! 740# Great for making those icons in kde/gnome startmenu !
767# Amaze your friends ! Get the women ! Join today ! 741# Amaze your friends ! Get the women ! Join today !
768# gnome2 /usr/share/applications
769# gnome1 /usr/share/gnome/apps/
770# KDE ${KDEDIR}/share/applnk /usr/share/applnk
771# 742#
772# make_desktop_entry(<binary>, [name], [icon], [type], [path]) 743# make_desktop_entry(<binary>, [name], [icon], [type], [path])
773# 744#
774# binary: what binary does the app run with ? 745# binary: what binary does the app run with ?
775# name: the name that will show up in the menu 746# name: the name that will show up in the menu
776# icon: give your little like a pretty little icon ... 747# icon: give your little like a pretty little icon ...
777# this can be relative (to /usr/share/pixmaps) or 748# this can be relative (to /usr/share/pixmaps) or
778# a full path to an icon 749# a full path to an icon
779# type: what kind of application is this ? for categories: 750# type: what kind of application is this ? for categories:
780# http://www.freedesktop.org/standards/menu-spec/ 751# http://www.freedesktop.org/wiki/Standards_2fmenu_2dspec
781# path: if your app needs to startup in a specific dir 752# path: if your app needs to startup in a specific dir
782make_desktop_entry() { 753make_desktop_entry() {
783 [ -z "$1" ] && eerror "You must specify the executable" && return 1 754 [[ -z $1 ]] && eerror "make_desktop_entry: You must specify the executable" && return 1
784 755
785 local exec="${1}" 756 local exec=${1}
786 local name="${2:-${PN}}" 757 local name=${2:-${PN}}
787 local icon="${3:-${PN}.png}" 758 local icon=${3:-${PN}.png}
788 local type="${4}" 759 local type=${4}
789 local subdir="${6}" 760 local path=${5}
790 local path="${5:-${GAMES_PREFIX}}" 761
791 if [ -z "${type}" ] 762 if [[ -z ${type} ]] ; then
792 then 763 local catmaj=${CATEGORY%%-*}
793 case ${CATEGORY} in 764 local catmin=${CATEGORY##*-}
794 "app-emulation") 765 case ${catmaj} in
795 type=Emulator 766 app)
796 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
797 ;; 780 ;;
798 "games-"*) 781
799 type=Game 782 dev)
800 subdir="Games" 783 type="Development"
801 ;; 784 ;;
802 "net-"*) 785
803 type=Network 786 games)
804 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}"
805 ;; 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
806 *) 858 *)
807 type= 859 type=
808 subdir=
809 ;; 860 ;;
810 esac 861 esac
811 fi 862 fi
863 if [ "${SLOT}" == "0" ] ; then
864 local desktop_name="${PN}"
865 else
866 local desktop_name="${PN}-${SLOT}"
867 fi
812 local desktop="${T}/${exec}.desktop" 868 local desktop=${T}/${exec%% *}-${desktop_name}.desktop
813 869
814echo "[Desktop Entry] 870echo "[Desktop Entry]
815Encoding=UTF-8 871Encoding=UTF-8
816Version=0.9.2 872Version=0.9.2
817Name=${name} 873Name=${name}
818Type=Application 874Type=Application
819Comment=${DESCRIPTION} 875Comment=${DESCRIPTION}
820Exec=${exec} 876Exec=${exec}
821Path=${path} 877Path=${path}
822Icon=${icon} 878Icon=${icon}
823Categories=Application;${type};" > ${desktop} 879Categories=Application;${type};" > "${desktop}"
824 880
825 if [ -d "/usr/share/applications" ]
826 then
827 insinto /usr/share/applications 881 insinto /usr/share/applications
828 doins ${desktop} 882 doins "${desktop}"
829 fi
830
831 #if [ -d "/usr/share/gnome/apps" ]
832 #then
833 # insinto /usr/share/gnome/apps/Games
834 # doins ${desktop}
835 #fi
836
837 #if [ ! -z "`ls /usr/kde/* 2>/dev/null`" ]
838 #then
839 # for ver in /usr/kde/*
840 # do
841 # insinto ${ver}/share/applnk/Games
842 # doins ${desktop}
843 # done
844 #fi
845
846 if [ -d "/usr/share/applnk" ]
847 then
848 insinto /usr/share/applnk/${subdir}
849 doins ${desktop}
850 fi
851 883
852 return 0 884 return 0
853} 885}
886
887# Make a GDM/KDM Session file
888#
889# make_desktop_entry(<title>, <command>)
890# title: File to execute to start the Window Manager
891# command: Name of the Window Manager
892
893make_session_desktop() {
894 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1
895 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1
896
897 local title=$1
898 local command=$2
899 local desktop=${T}/${wm}.desktop
900
901echo "[Desktop Entry]
902Encoding=UTF-8
903Name=${title}
904Comment=This session logs you into ${title}
905Exec=${command}
906TryExec=${command}
907Type=Application" > "${desktop}"
908
909 insinto /usr/share/xsessions
910 doins "${desktop}"
911}
912
913domenu() {
914 local i j
915 insinto /usr/share/applications
916 for i in "$@" ; do
917 if [[ -f ${i} ]] ; then
918 doins "${i}"
919 elif [[ -d ${i} ]] ; then
920 for j in "${i}"/*.desktop ; do
921 doins "${j}"
922 done
923 fi
924 done
925}
926newmenu() {
927 insinto /usr/share/applications
928 newins "$1" "$2"
929}
930
931doicon() {
932 local i j
933 insinto /usr/share/pixmaps
934 for i in "$@" ; do
935 if [[ -f ${i} ]] ; then
936 doins "${i}"
937 elif [[ -d ${i} ]] ; then
938 for j in "${i}"/*.png ; do
939 doins "${j}"
940 done
941 fi
942 done
943}
944newicon() {
945 insinto /usr/share/pixmaps
946 newins "$1" "$2"
947}
948
949##############################################################
950# END: Handle .desktop files and menu entries #
951##############################################################
952
854 953
855# for internal use only (unpack_pdv and unpack_makeself) 954# for internal use only (unpack_pdv and unpack_makeself)
856find_unpackable_file() { 955find_unpackable_file() {
857 local src="$1" 956 local src="$1"
858 if [ -z "${src}" ] 957 if [ -z "${src}" ]
904 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1003 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
905 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"` 1004 local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"`
906 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"` 1005 local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"`
907 1006
908 # grab metadata for debug reasons 1007 # grab metadata for debug reasons
909 local metafile="`mymktemp ${T}`" 1008 local metafile="$(emktemp)"
910 tail -c +$((${metaskip}+1)) ${src} > ${metafile} 1009 tail -c +$((${metaskip}+1)) ${src} > ${metafile}
911 1010
912 # rip out the final file name from the metadata 1011 # rip out the final file name from the metadata
913 local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`" 1012 local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`"
914 datafile="`basename ${datafile}`" 1013 datafile="`basename ${datafile}`"
915 1014
916 # now lets uncompress/untar the file if need be 1015 # now lets uncompress/untar the file if need be
917 local tmpfile="`mymktemp ${T}`" 1016 local tmpfile="$(emktemp)"
918 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile} 1017 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
919 1018
920 local iscompressed="`file -b ${tmpfile}`" 1019 local iscompressed="`file -b ${tmpfile}`"
921 if [ "${iscompressed:0:8}" == "compress" ] ; then 1020 if [ "${iscompressed:0:8}" == "compress" ] ; then
922 iscompressed=1 1021 iscompressed=1
967# Unpack those pesky makeself generated files ... 1066# Unpack those pesky makeself generated files ...
968# They're shell scripts with the binary package tagged onto 1067# They're shell scripts with the binary package tagged onto
969# the end of the archive. Loki utilized the format as does 1068# the end of the archive. Loki utilized the format as does
970# many other game companies. 1069# many other game companies.
971# 1070#
972# Usage: unpack_makeself [file to unpack] [offset] 1071# Usage: unpack_makeself [file to unpack] [offset] [tail|dd]
973# - If the file is not specified then unpack will utilize ${A}. 1072# - If the file is not specified then unpack will utilize ${A}.
974# - If the offset is not specified then we will attempt to extract 1073# - If the offset is not specified then we will attempt to extract
975# the proper offset from the script itself. 1074# the proper offset from the script itself.
976unpack_makeself() { 1075unpack_makeself() {
977 local src="`find_unpackable_file $1`" 1076 local src="$(find_unpackable_file "$1")"
978 local skip="$2" 1077 local skip="$2"
1078 local exe="$3"
979 1079
980 local shrtsrc="`basename ${src}`" 1080 local shrtsrc="$(basename "${src}")"
981 echo ">>> Unpacking ${shrtsrc} to ${PWD}" 1081 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
982 if [ -z "${skip}" ] 1082 if [ -z "${skip}" ]
983 then 1083 then
984 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`" 1084 local ver="`grep -a '#.*Makeself' ${src} | awk '{print $NF}'`"
985 local skip=0 1085 local skip=0
1086 exe=tail
986 case ${ver} in 1087 case ${ver} in
987 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 1088 1.5.*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
988 skip=`grep -a ^skip= ${src} | cut -d= -f2` 1089 skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
989 ;; 1090 ;;
990 2.0|2.0.1) 1091 2.0|2.0.1)
991 skip=`grep -a ^$'\t'tail ${src} | awk '{print $2}' | cut -b2-` 1092 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
992 ;; 1093 ;;
993 2.1.1) 1094 2.1.1)
994 skip=`grep -a ^offset= ${src} | awk '{print $2}' | cut -b2-` 1095 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
995 let skip="skip + 1" 1096 let skip="skip + 1"
996 ;; 1097 ;;
997 2.1.2) 1098 2.1.2)
998 skip=`grep -a ^offset= ${src} | awk '{print $3}' | head -n 1` 1099 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
999 let skip="skip + 1" 1100 let skip="skip + 1"
1000 ;; 1101 ;;
1001 2.1.3) 1102 2.1.3)
1002 skip=`grep -a ^offset= ${src} | awk '{print $3}'` 1103 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1003 let skip="skip + 1" 1104 let skip="skip + 1"
1105 ;;
1106 2.1.4)
1107 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1108 skip=$(head -n ${skip} "${src}" | wc -c)
1109 exe="dd"
1004 ;; 1110 ;;
1005 *) 1111 *)
1006 eerror "I'm sorry, but I was unable to support the Makeself file." 1112 eerror "I'm sorry, but I was unable to support the Makeself file."
1007 eerror "The version I detected was '${ver}'." 1113 eerror "The version I detected was '${ver}'."
1008 eerror "Please file a bug about the file ${shrtsrc} at" 1114 eerror "Please file a bug about the file ${shrtsrc} at"
1010 die "makeself version '${ver}' not supported" 1116 die "makeself version '${ver}' not supported"
1011 ;; 1117 ;;
1012 esac 1118 esac
1013 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" 1119 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
1014 fi 1120 fi
1121 case ${exe} in
1122 tail) exe="tail -n +${skip} '${src}'";;
1123 dd) exe="dd ibs=${skip} skip=1 obs=1024 conv=sync if='${src}'";;
1124 *) die "makeself cant handle exe '${exe}'"
1125 esac
1015 1126
1016 # lets grab the first few bytes of the file to figure out what kind of archive it is 1127 # lets grab the first few bytes of the file to figure out what kind of archive it is
1017 local tmpfile="`mymktemp ${T}`" 1128 local tmpfile="$(emktemp)"
1018 tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile} 1129 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1019 local filetype="`file -b ${tmpfile}`" 1130 local filetype="$(file -b "${tmpfile}")"
1020 case ${filetype} in 1131 case ${filetype} in
1021 *tar\ archive) 1132 *tar\ archive)
1022 tail -n +${skip} ${src} | tar --no-same-owner -xf - 1133 eval ${exe} | tar --no-same-owner -xf -
1023 ;; 1134 ;;
1024 bzip2*) 1135 bzip2*)
1025 tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf - 1136 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1026 ;; 1137 ;;
1027 gzip*) 1138 gzip*)
1028 tail -n +${skip} ${src} | tar --no-same-owner -xzf - 1139 eval ${exe} | tar --no-same-owner -xzf -
1029 ;; 1140 ;;
1030 compress*) 1141 compress*)
1031 tail -n +${skip} ${src} | gunzip | tar --no-same-owner -xf - 1142 eval ${exe} | gunzip | tar --no-same-owner -xf -
1032 ;; 1143 ;;
1033 *) 1144 *)
1034 eerror "Unknown filetype \"${filetype}\" ?" 1145 eerror "Unknown filetype \"${filetype}\" ?"
1035 false 1146 false
1036 ;; 1147 ;;
1058 [ ! -f "${lic}" ] && die "Could not find requested license ${src}" 1169 [ ! -f "${lic}" ] && die "Could not find requested license ${src}"
1059 local l="`basename ${lic}`" 1170 local l="`basename ${lic}`"
1060 1171
1061 # here is where we check for the licenses the user already 1172 # here is where we check for the licenses the user already
1062 # accepted ... if we don't find a match, we make the user accept 1173 # accepted ... if we don't find a match, we make the user accept
1174 local shopts=$-
1063 local alic 1175 local alic
1176 set -o noglob #so that bash doesn't expand "*"
1064 for alic in "${ACCEPT_LICENSE}" ; do 1177 for alic in ${ACCEPT_LICENSE} ; do
1065 [ "${alic}" == "*" ] && return 0 1178 if [[ ${alic} == * || ${alic} == ${l} ]]; then
1066 [ "${alic}" == "${l}" ] && return 0 1179 set +o noglob; set -${shopts} #reset old shell opts
1180 return 0
1181 fi
1067 done 1182 done
1183 set +o noglob; set -$shopts #reset old shell opts
1068 1184
1069 local licmsg="`mymktemp ${T}`" 1185 local licmsg="$(emktemp)"
1070 cat << EOF > ${licmsg} 1186 cat << EOF > ${licmsg}
1071********************************************************** 1187**********************************************************
1072The following license outlines the terms of use of this 1188The following license outlines the terms of use of this
1073package. You MUST accept this license for installation to 1189package. You MUST accept this license for installation to
1074continue. When you are done viewing, hit 'q'. If you 1190continue. When you are done viewing, hit 'q'. If you
1122 export CDROM_TOTAL_CDS=${cdcnt} 1238 export CDROM_TOTAL_CDS=${cdcnt}
1123 export CDROM_CURRENT_CD=1 1239 export CDROM_CURRENT_CD=1
1124 1240
1125 # now we see if the user gave use CD_ROOT ... 1241 # now we see if the user gave use CD_ROOT ...
1126 # if they did, let's just believe them that it's correct 1242 # if they did, let's just believe them that it's correct
1127 if [ ! -z "${CD_ROOT}" ] ; then 1243 if [[ ! -z ${CD_ROOT} ]] ; then
1128 export CDROM_ROOT="${CD_ROOT}" 1244 export CDROM_ROOT=${CD_ROOT}
1129 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1245 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1130 return 1246 return
1131 fi 1247 fi
1132 # do the same for CD_ROOT_X 1248 # do the same for CD_ROOT_X
1133 if [ ! -z "${CD_ROOT_1}" ] ; then 1249 if [[ ! -z ${CD_ROOT_1} ]] ; then
1134 local var= 1250 local var=
1135 cdcnt=0 1251 cdcnt=0
1136 while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do 1252 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1137 cdcnt=$((cdcnt + 1)) 1253 cdcnt=$((cdcnt + 1))
1138 var="CD_ROOT_${cdcnt}" 1254 var="CD_ROOT_${cdcnt}"
1139 if [ -z "${!var}" ] ; then 1255 if [[ -z ${!var} ]] ; then
1140 eerror "You must either use just the CD_ROOT" 1256 eerror "You must either use just the CD_ROOT"
1141 eerror "or specify ALL the CD_ROOT_X variables." 1257 eerror "or specify ALL the CD_ROOT_X variables."
1142 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables." 1258 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables."
1143 die "could not locate CD_ROOT_${cdcnt}" 1259 die "could not locate CD_ROOT_${cdcnt}"
1144 fi 1260 fi
1147 export CDROM_ROOT=${CDROM_ROOTS_1} 1263 export CDROM_ROOT=${CDROM_ROOTS_1}
1148 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1264 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1149 return 1265 return
1150 fi 1266 fi
1151 1267
1152 if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then 1268 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1153 einfon "This ebuild will need the " 1269 einfon "This ebuild will need the "
1154 if [ -z "${CDROM_NAME}" ] ; then 1270 if [[ -z ${CDROM_NAME} ]] ; then
1155 echo "cdrom for ${PN}." 1271 echo "cdrom for ${PN}."
1156 else 1272 else
1157 echo "${CDROM_NAME}." 1273 echo "${CDROM_NAME}."
1158 fi 1274 fi
1159 echo 1275 echo
1160 einfo "If you do not have the CD, but have the data files" 1276 einfo "If you do not have the CD, but have the data files"
1161 einfo "mounted somewhere on your filesystem, just export" 1277 einfo "mounted somewhere on your filesystem, just export"
1162 einfo "the variable CD_ROOT so that it points to the" 1278 einfo "the variable CD_ROOT so that it points to the"
1163 einfo "directory containing the files." 1279 einfo "directory containing the files."
1164 echo 1280 echo
1281 einfo "For example:"
1282 einfo "export CD_ROOT=/mnt/cdrom"
1283 echo
1165 else 1284 else
1166 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds." 1285 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1167 cdcnt=0 1286 cdcnt=0
1168 while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do 1287 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1169 cdcnt=$((cdcnt + 1)) 1288 cdcnt=$((cdcnt + 1))
1170 var="CDROM_NAME_${cdcnt}" 1289 var="CDROM_NAME_${cdcnt}"
1171 [ ! -z "${!var}" ] && einfo " CD ${cdcnt}: ${!var}" 1290 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1172 done 1291 done
1173 echo 1292 echo
1174 einfo "If you do not have the CDs, but have the data files" 1293 einfo "If you do not have the CDs, but have the data files"
1175 einfo "mounted somewhere on your filesystem, just export" 1294 einfo "mounted somewhere on your filesystem, just export"
1176 einfo "the following variables so they point to the right place:" 1295 einfo "the following variables so they point to the right place:"
1177 einfon "" 1296 einfon ""
1178 cdcnt=0 1297 cdcnt=0
1179 while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do 1298 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1180 cdcnt=$((cdcnt + 1)) 1299 cdcnt=$((cdcnt + 1))
1181 echo -n " CD_ROOT_${cdcnt}" 1300 echo -n " CD_ROOT_${cdcnt}"
1182 done 1301 done
1183 echo 1302 echo
1184 einfo "Or, if you have all the files in the same place, or" 1303 einfo "Or, if you have all the files in the same place, or"
1185 einfo "you only have one cdrom, you can export CD_ROOT" 1304 einfo "you only have one cdrom, you can export CD_ROOT"
1186 einfo "and that place will be used as the same data source" 1305 einfo "and that place will be used as the same data source"
1187 einfo "for all the CDs." 1306 einfo "for all the CDs."
1188 echo 1307 echo
1308 einfo "For example:"
1309 einfo "export CD_ROOT_1=/mnt/cdrom"
1310 echo
1189 fi 1311 fi
1190 export CDROM_CURRENT_CD=0 1312 export CDROM_CURRENT_CD=0
1191 cdrom_load_next_cd 1313 cdrom_load_next_cd
1192} 1314}
1193 1315
1197# remember, you can only go forward in the cd chain, you can't go back. 1319# remember, you can only go forward in the cd chain, you can't go back.
1198cdrom_load_next_cd() { 1320cdrom_load_next_cd() {
1199 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1)) 1321 export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1))
1200 local var= 1322 local var=
1201 1323
1202 if [ ! -z "${CD_ROOT}" ] ; then 1324 if [[ ! -z ${CD_ROOT} ]] ; then
1203 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}" 1325 einfo "Using same root as before for CD #${CDROM_CURRENT_CD}"
1204 return 1326 return
1205 fi 1327 fi
1206 1328
1207 unset CDROM_ROOT 1329 unset CDROM_ROOT
1208 var=CDROM_ROOTS_${CDROM_CURRENT_CD} 1330 var=CDROM_ROOTS_${CDROM_CURRENT_CD}
1209 if [ -z "${!var}" ] ; then 1331 if [[ -z ${!var} ]] ; then
1210 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 1332 var="CDROM_CHECK_${CDROM_CURRENT_CD}"
1211 cdrom_locate_file_on_cd ${!var} 1333 cdrom_locate_file_on_cd ${!var}
1212 else 1334 else
1213 export CDROM_ROOT="${!var}" 1335 export CDROM_ROOT=${!var}
1214 fi 1336 fi
1215 1337
1216 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" 1338 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1217} 1339}
1218 1340
1222# found, then a message asking for the user to insert the cdrom will be 1344# found, then a message asking for the user to insert the cdrom will be
1223# displayed and we'll hang out here until: 1345# displayed and we'll hang out here until:
1224# (1) the file is found on a mounted cdrom 1346# (1) the file is found on a mounted cdrom
1225# (2) the user hits CTRL+C 1347# (2) the user hits CTRL+C
1226cdrom_locate_file_on_cd() { 1348cdrom_locate_file_on_cd() {
1227 while [ -z "${CDROM_ROOT}" ] ; do 1349 while [[ -z ${CDROM_ROOT} ]] ; do
1228 local dir="$(dirname ${@})" 1350 local dir="$(dirname ${@})"
1229 local file="$(basename ${@})" 1351 local file="$(basename ${@})"
1230 local mline="" 1352 local mline=""
1231 local showedmsg=0 1353 local showedmsg=0
1232 1354
1233 for mline in `mount | egrep -e '(iso|cdrom)' | awk '{print $3}'` ; do 1355 for mline in $(mount | egrep -e '(iso|cdrom)' | awk '{print $3}') ; do
1234 [ -d "${mline}/${dir}" ] || continue 1356 [[ -d ${mline}/${dir} ]] || continue
1235 [ ! -z "$(find ${mline}/${dir} -iname ${file} -maxdepth 1)" ] \ 1357 [[ ! -z $(find ${mline}/${dir} -maxdepth 1 -iname ${file}) ]] \
1236 && export CDROM_ROOT=${mline} 1358 && export CDROM_ROOT=${mline}
1237 done 1359 done
1238 1360
1239 if [ -z "${CDROM_ROOT}" ] ; then 1361 if [[ -z ${CDROM_ROOT} ]] ; then
1240 echo 1362 echo
1241 if [ ${showedmsg} -eq 0 ] ; then 1363 if [[ ${showedmsg} -eq 0 ]] ; then
1242 if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then 1364 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1243 if [ -z "${CDROM_NAME}" ] ; then 1365 if [[ -z ${CDROM_NAME} ]] ; then
1244 einfo "Please insert the cdrom for ${PN} now !" 1366 einfo "Please insert the cdrom for ${PN} now !"
1245 else 1367 else
1246 einfo "Please insert the ${CDROM_NAME} cdrom now !" 1368 einfo "Please insert the ${CDROM_NAME} cdrom now !"
1247 fi 1369 fi
1248 else 1370 else
1249 if [ -z "${CDROM_NAME_1}" ] ; then 1371 if [[ -z ${CDROM_NAME_1} ]] ; then
1250 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !" 1372 einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !"
1251 else 1373 else
1252 local var="CDROM_NAME_${CDROM_CURRENT_CD}" 1374 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1253 einfo "Please insert+mount the ${!var} cdrom now !" 1375 einfo "Please insert+mount the ${!var} cdrom now !"
1254 fi 1376 fi
1260 read 1382 read
1261 fi 1383 fi
1262 done 1384 done
1263} 1385}
1264 1386
1265# Make sure that LINGUAS only contains languages that 1387# Make sure that LINGUAS only contains languages that
1266# a package can support 1388# a package can support
1267# 1389#
1268# usage: strip-linguas <allow LINGUAS> 1390# usage: strip-linguas <allow LINGUAS>
1269# strip-linguas -i <directories of .po files> 1391# strip-linguas -i <directories of .po files>
1270# strip-linguas -u <directories of .po files> 1392# strip-linguas -u <directories of .po files>
1271# 1393#
1272# The first form allows you to specify a list of LINGUAS. 1394# The first form allows you to specify a list of LINGUAS.
1273# The -i builds a list of po files found in all the 1395# The -i builds a list of po files found in all the
1274# directories and uses the intersection of the lists. 1396# directories and uses the intersection of the lists.
1275# The -u builds a list of po files found in all the 1397# The -u builds a list of po files found in all the
1276# directories and uses the union of the lists. 1398# directories and uses the union of the lists.
1277strip-linguas() { 1399strip-linguas() {
1278 local ls newls 1400 local ls newls
1279 if [ "$1" == "-i" ] || [ "$1" == "-u" ] ; then 1401 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1280 local op="$1"; shift 1402 local op=$1; shift
1281 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift 1403 ls=" $(find "$1" -name '*.po' -printf '%f ') "; shift
1282 local d f 1404 local d f
1283 for d in "$@" ; do 1405 for d in "$@" ; do
1284 if [ "${op}" == "-u" ] ; then 1406 if [[ ${op} == "-u" ]] ; then
1285 newls="${ls}" 1407 newls=${ls}
1286 else 1408 else
1287 newls="" 1409 newls=""
1288 fi 1410 fi
1289 for f in $(find "$d" -name '*.po' -printf '%f ') ; do 1411 for f in $(find "$d" -name '*.po' -printf '%f ') ; do
1290 if [ "${op}" == "-i" ] ; then 1412 if [[ ${op} == "-i" ]] ; then
1291 [ "${ls/ ${f} /}" != "${ls}" ] && newls="${newls} ${f}" 1413 [[ ${ls/ ${f} /} != ${ls} ]] && newls="${newls} ${f}"
1292 else 1414 else
1293 [ "${ls/ ${f} /}" == "${ls}" ] && newls="${newls} ${f}" 1415 [[ ${ls/ ${f} /} == ${ls} ]] && newls="${newls} ${f}"
1294 fi 1416 fi
1295 done 1417 done
1296 ls="${newls}" 1418 ls=${newls}
1297 done 1419 done
1298 ls="${ls//.po}" 1420 ls=${ls//.po}
1299 else 1421 else
1300 ls="$@" 1422 ls=$@
1301 fi 1423 fi
1302 1424
1303 ls=" ${ls} " 1425 ls=" ${ls} "
1304 newls="" 1426 newls=""
1305 for f in ${LINGUAS} ; do 1427 for f in ${LINGUAS} ; do
1306 if [ "${ls/ ${f} /}" != "${ls}" ] ; then 1428 if [[ ${ls/ ${f} /} != ${ls} ]] ; then
1307 nl="${newls} ${f}" 1429 newls="${newls} ${f}"
1308 else 1430 else
1309 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA" 1431 ewarn "Sorry, but ${PN} does not support the ${f} LINGUA"
1310 fi 1432 fi
1311 done 1433 done
1312 if [ -z "${newls}" ] ; then 1434 if [[ -z ${newls} ]] ; then
1313 unset LINGUAS 1435 export LINGUAS=""
1314 else 1436 else
1315 export LINGUAS="${newls}" 1437 export LINGUAS=${newls:1}
1438 fi
1439}
1440
1441# moved from kernel.eclass since they are generally useful outside of
1442# kernel.eclass -iggy (20041002)
1443
1444# the following functions are useful in kernel module ebuilds, etc.
1445# for an example see ivtv or drbd ebuilds
1446
1447# set's ARCH to match what the kernel expects
1448set_arch_to_kernel() {
1449 i=10
1450 while ((i--)) ; do
1451 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1452 done
1453 export EUTILS_ECLASS_PORTAGE_ARCH="${ARCH}"
1454 case ${ARCH} in
1455 x86) export ARCH="i386";;
1456 amd64) export ARCH="x86_64";;
1457 hppa) export ARCH="parisc";;
1458 mips) export ARCH="mips";;
1459 sparc) export ARCH="$(tc-arch-kernel)";; # Yeah this is ugly, but it's even WORSE if you don't do this. linux-info.eclass's set_arch_to_kernel is fixed, but won't get used over this one!
1460 *) export ARCH="${ARCH}";;
1461 esac
1462}
1463
1464# set's ARCH back to what portage expects
1465set_arch_to_portage() {
1466 i=10
1467 while ((i--)) ; do
1468 ewarn "PLEASE UPDATE TO YOUR PACKAGE TO USE linux-info.eclass"
1469 done
1470 export ARCH="${EUTILS_ECLASS_PORTAGE_ARCH}"
1471}
1472
1473# Jeremy Huddleston <eradicator@gentoo.org>:
1474# preserve_old_lib /path/to/libblah.so.0
1475# preserve_old_lib_notify /path/to/libblah.so.0
1476#
1477# These functions are useful when a lib in your package changes --soname. Such
1478# an example might be from libogg.so.0 to libogg.so.1. Removing libogg.so.0
1479# would break packages that link against it. Most people get around this
1480# by using the portage SLOT mechanism, but that is not always a relevant
1481# solution, so instead you can add the following to your ebuilds:
1482#
1483# src_install() {
1484# ...
1485# preserve_old_lib /usr/$(get_libdir)/libogg.so.0
1486# ...
1487# }
1488#
1489# pkg_postinst() {
1490# ...
1491# preserve_old_lib_notify /usr/$(get_libdir)/libogg.so.0
1492# ...
1493# }
1494
1495preserve_old_lib() {
1496 LIB=$1
1497
1498 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1499 SONAME=`basename ${LIB}`
1500 DIRNAME=`dirname ${LIB}`
1501
1502 dodir ${DIRNAME}
1503 cp ${ROOT}${LIB} ${D}${DIRNAME}
1504 touch ${D}${LIB}
1505 fi
1506}
1507
1508preserve_old_lib_notify() {
1509 LIB=$1
1510
1511 if [ -n "${LIB}" -a -f "${ROOT}${LIB}" ]; then
1512 SONAME=`basename ${LIB}`
1513
1514 einfo "An old version of an installed library was detected on your system."
1515 einfo "In order to avoid breaking packages that link against is, this older version"
1516 einfo "is not being removed. In order to make full use of this newer version,"
1517 einfo "you will need to execute the following command:"
1518 einfo " revdep-rebuild --soname ${SONAME}"
1519 einfo
1520 einfo "After doing that, you can safely remove ${LIB}"
1521 einfo "Note: 'emerge gentoolkit' to get revdep-rebuild"
1522 fi
1523}
1524
1525# Hack for people to figure out if a package was built with
1526# certain USE flags
1527#
1528# Usage: built_with_use [-a|-o] <DEPEND ATOM> <List of USE flags>
1529# ex: built_with_use xchat gtk2
1530#
1531# Flags: -a all USE flags should be utilized
1532# -o at least one USE flag should be utilized
1533# Note: the default flag is '-a'
1534built_with_use() {
1535 local opt=$1
1536 [[ ${opt:0:1} = "-" ]] && shift || opt="-a"
1537
1538 local PKG=$(best_version $1)
1539 shift
1540
1541 local USEFILE="${ROOT}/var/db/pkg/${PKG}/USE"
1542 [[ ! -e ${USEFILE} ]] && return 1
1543
1544 local USE_BUILT=$(<${USEFILE})
1545 while [[ $# -gt 0 ]] ; do
1546 if [[ ${opt} = "-o" ]] ; then
1547 has $1 ${USE_BUILT} && return 0
1548 else
1549 has $1 ${USE_BUILT} || return 1
1316 fi 1550 fi
1551 shift
1552 done
1553 [[ ${opt} = "-a" ]]
1317} 1554}
1555
1556# Many configure scripts wrongly bail when a C++ compiler
1557# could not be detected. #73450
1558epunt_cxx() {
1559 local dir=$1
1560 [[ -z ${dir} ]] && dir=${S}
1561 ebegin "Removing useless C++ checks"
1562 local f
1563 for f in $(find ${dir} -name configure) ; do
1564 patch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null
1565 done
1566 eend 0
1567}
1568
1569# dopamd <file> [more files]
1570#
1571# Install pam auth config file in /etc/pam.d
1572dopamd() {
1573 [[ -z $1 ]] && die "dopamd requires at least one argument"
1574
1575 use pam || return 0
1576
1577 INSDESTTREE=/etc/pam.d \
1578 doins "$@" || die "failed to install $@"
1579}
1580# newpamd <old name> <new name>
1581#
1582# Install pam file <old name> as <new name> in /etc/pam.d
1583newpamd() {
1584 [[ $# -ne 2 ]] && die "newpamd requires two arguements"
1585
1586 use pam || return 0
1587
1588 INSDESTTREE=/etc/pam.d \
1589 newins "$1" "$2" || die "failed to install $1 as $2"
1590}
1591
1592# make a wrapper script ...
1593# NOTE: this was originally games_make_wrapper, but I noticed other places where
1594# this could be used, so I have moved it here and made it not games-specific
1595# -- wolf31o2
1596# $1 == wrapper name
1597# $2 == binary to run
1598# $3 == directory to chdir before running binary
1599# $4 == extra LD_LIBRARY_PATH's (make it : delimited)
1600# $5 == path for wrapper
1601make_wrapper() {
1602 local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5
1603 local tmpwrapper=$(emktemp)
1604 cat << EOF > "${tmpwrapper}"
1605#!/bin/sh
1606cd "${chdir}"
1607export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
1608exec ${bin} "\$@"
1609EOF
1610 chmod go+rx "${tmpwrapper}"
1611 if [ -n "${5}" ]
1612 then
1613 exeinto ${5}
1614 newexe "${tmpwrapper}" "${wrapper}"
1615 else
1616 newbin "${tmpwrapper}" "${wrapper}"
1617 fi
1618}

Legend:
Removed from v.1.95  
changed lines
  Added in v.1.177

  ViewVC Help
Powered by ViewVC 1.1.20