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

Diff of /eclass/eutils.eclass

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

Revision 1.363 Revision 1.410
1# Copyright 1999-2011 Gentoo Foundation 1# Copyright 1999-2013 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.363 2011/09/12 20:44:01 mgorny Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.410 2013/02/10 11:42:48 mgorny Exp $
4 4
5# @ECLASS: eutils.eclass 5# @ECLASS: eutils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# base-system@gentoo.org 7# base-system@gentoo.org
8# @BLURB: many extra (but common) functions that are used in ebuilds 8# @BLURB: many extra (but common) functions that are used in ebuilds
13# home rather than having multiple ebuilds implementing the same thing. 13# home rather than having multiple ebuilds implementing the same thing.
14# 14#
15# Due to the nature of this eclass, some functions may have maintainers 15# Due to the nature of this eclass, some functions may have maintainers
16# different from the overall eclass! 16# different from the overall eclass!
17 17
18inherit multilib portability 18if [[ ${___ECLASS_ONCE_EUTILS} != "recur -_+^+_- spank" ]] ; then
19___ECLASS_ONCE_EUTILS="recur -_+^+_- spank"
19 20
20DESCRIPTION="Based on the ${ECLASS} eclass" 21inherit multilib toolchain-funcs user
21 22
22if has "${EAPI:-0}" 0 1 2; then 23if has "${EAPI:-0}" 0 1 2; then
23 24
24# @FUNCTION: epause 25# @FUNCTION: epause
25# @USAGE: [seconds] 26# @USAGE: [seconds]
70# implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev 71# implementation if available. Reuses PORTAGE_ELOG_CLASSES as set by the dev
71# profile. 72# profile.
72if ! declare -F eqawarn >/dev/null ; then 73if ! declare -F eqawarn >/dev/null ; then
73 eqawarn() { 74 eqawarn() {
74 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@" 75 has qa ${PORTAGE_ELOG_CLASSES} && ewarn "$@"
76 :
75 } 77 }
76fi 78fi
77 79
78# @FUNCTION: ecvs_clean 80# @FUNCTION: ecvs_clean
79# @USAGE: [list of dirs] 81# @USAGE: [list of dirs]
94esvn_clean() { 96esvn_clean() {
95 [[ -z $* ]] && set -- . 97 [[ -z $* ]] && set -- .
96 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 98 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
97} 99}
98 100
101# @FUNCTION: estack_push
102# @USAGE: <stack> [items to push]
103# @DESCRIPTION:
104# Push any number of items onto the specified stack. Pick a name that
105# is a valid variable (i.e. stick to alphanumerics), and push as many
106# items as you like onto the stack at once.
107#
108# The following code snippet will echo 5, then 4, then 3, then ...
109# @CODE
110# estack_push mystack 1 2 3 4 5
111# while estack_pop mystack i ; do
112# echo "${i}"
113# done
114# @CODE
115estack_push() {
116 [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments"
117 local stack_name="__ESTACK_$1__" ; shift
118 eval ${stack_name}+=\( \"\$@\" \)
119}
120
121# @FUNCTION: estack_pop
122# @USAGE: <stack> [variable]
123# @DESCRIPTION:
124# Pop a single item off the specified stack. If a variable is specified,
125# the popped item is stored there. If no more items are available, return
126# 1, else return 0. See estack_push for more info.
127estack_pop() {
128 [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments"
129
130 # We use the fugly __estack_xxx var names to avoid collision with
131 # passing back the return value. If we used "local i" and the
132 # caller ran `estack_pop ... i`, we'd end up setting the local
133 # copy of "i" rather than the caller's copy. The __estack_xxx
134 # garbage is preferable to using $1/$2 everywhere as that is a
135 # bit harder to read.
136 local __estack_name="__ESTACK_$1__" ; shift
137 local __estack_retvar=$1 ; shift
138 eval local __estack_i=\${#${__estack_name}\[@\]}
139 # Don't warn -- let the caller interpret this as a failure
140 # or as normal behavior (akin to `shift`)
141 [[ $(( --__estack_i )) -eq -1 ]] && return 1
142
143 if [[ -n ${__estack_retvar} ]] ; then
144 eval ${__estack_retvar}=\"\${${__estack_name}\[${__estack_i}\]}\"
145 fi
146 eval unset ${__estack_name}\[${__estack_i}\]
147}
148
99# @FUNCTION: eshopts_push 149# @FUNCTION: eshopts_push
100# @USAGE: [options to `set` or `shopt`] 150# @USAGE: [options to `set` or `shopt`]
101# @DESCRIPTION: 151# @DESCRIPTION:
102# Often times code will want to enable a shell option to change code behavior. 152# Often times code will want to enable a shell option to change code behavior.
103# Since changing shell options can easily break other pieces of code (which 153# Since changing shell options can easily break other pieces of code (which
108# rather than `set` as there are some options only available via that. 158# rather than `set` as there are some options only available via that.
109# 159#
110# A common example is to disable shell globbing so that special meaning/care 160# A common example is to disable shell globbing so that special meaning/care
111# may be used with variables/arguments to custom functions. That would be: 161# may be used with variables/arguments to custom functions. That would be:
112# @CODE 162# @CODE
113# eshopts_push -o noglob 163# eshopts_push -s noglob
114# for x in ${foo} ; do 164# for x in ${foo} ; do
115# if ...some check... ; then 165# if ...some check... ; then
116# eshopts_pop 166# eshopts_pop
117# return 0 167# return 0
118# fi 168# fi
119# done 169# done
120# eshopts_pop 170# eshopts_pop
121# @CODE 171# @CODE
122eshopts_push() { 172eshopts_push() {
123 # have to assume __ESHOPTS_SAVE__ isn't screwed with
124 # as a `declare -a` here will reset its value
125 local i=${#__ESHOPTS_SAVE__[@]}
126 if [[ $1 == -[su] ]] ; then 173 if [[ $1 == -[su] ]] ; then
127 __ESHOPTS_SAVE__[$i]=$(shopt -p) 174 estack_push eshopts "$(shopt -p)"
128 [[ $# -eq 0 ]] && return 0 175 [[ $# -eq 0 ]] && return 0
129 shopt "$@" || die "eshopts_push: bad options to shopt: $*" 176 shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"
130 else 177 else
131 __ESHOPTS_SAVE__[$i]=$- 178 estack_push eshopts $-
132 [[ $# -eq 0 ]] && return 0 179 [[ $# -eq 0 ]] && return 0
133 set "$@" || die "eshopts_push: bad options to set: $*" 180 set "$@" || die "${FUNCNAME}: bad options to set: $*"
134 fi 181 fi
135} 182}
136 183
137# @FUNCTION: eshopts_pop 184# @FUNCTION: eshopts_pop
138# @USAGE: 185# @USAGE:
139# @DESCRIPTION: 186# @DESCRIPTION:
140# Restore the shell options to the state saved with the corresponding 187# Restore the shell options to the state saved with the corresponding
141# eshopts_push call. See that function for more details. 188# eshopts_push call. See that function for more details.
142eshopts_pop() { 189eshopts_pop() {
143 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments" 190 local s
144 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 )) 191 estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"
145 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
146 local s=${__ESHOPTS_SAVE__[$i]}
147 unset __ESHOPTS_SAVE__[$i]
148 if [[ ${s} == "shopt -"* ]] ; then 192 if [[ ${s} == "shopt -"* ]] ; then
149 eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}" 193 eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}"
150 else 194 else
151 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-" 195 set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-"
152 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}" 196 set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell settings: ${s}"
153 fi 197 fi
198}
199
200# @FUNCTION: eumask_push
201# @USAGE: <new umask>
202# @DESCRIPTION:
203# Set the umask to the new value specified while saving the previous
204# value onto a stack. Useful for temporarily changing the umask.
205eumask_push() {
206 estack_push eumask "$(umask)"
207 umask "$@" || die "${FUNCNAME}: bad options to umask: $*"
208}
209
210# @FUNCTION: eumask_pop
211# @USAGE:
212# @DESCRIPTION:
213# Restore the previous umask state.
214eumask_pop() {
215 [[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options"
216 local s
217 estack_pop eumask s || die "${FUNCNAME}: unbalanced push"
218 umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
154} 219}
155 220
156# @VARIABLE: EPATCH_SOURCE 221# @VARIABLE: EPATCH_SOURCE
157# @DESCRIPTION: 222# @DESCRIPTION:
158# Default directory to search for patches. 223# Default directory to search for patches.
161# @DESCRIPTION: 226# @DESCRIPTION:
162# Default extension for patches (do not prefix the period yourself). 227# Default extension for patches (do not prefix the period yourself).
163EPATCH_SUFFIX="patch.bz2" 228EPATCH_SUFFIX="patch.bz2"
164# @VARIABLE: EPATCH_OPTS 229# @VARIABLE: EPATCH_OPTS
165# @DESCRIPTION: 230# @DESCRIPTION:
166# Default options for patch: 231# Options to pass to patch. Meant for ebuild/package-specific tweaking
232# such as forcing the patch level (-p#) or fuzz (-F#) factor. Note that
233# for single patch tweaking, you can also pass flags directly to epatch.
234EPATCH_OPTS=""
235# @VARIABLE: EPATCH_COMMON_OPTS
236# @DESCRIPTION:
237# Common options to pass to `patch`. You probably should never need to
238# change these. If you do, please discuss it with base-system first to
239# be sure.
167# @CODE 240# @CODE
168# -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571 241# -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
169# --no-backup-if-mismatch - do not leave .orig files behind 242# --no-backup-if-mismatch - do not leave .orig files behind
170# -E - automatically remove empty files 243# -E - automatically remove empty files
171# @CODE 244# @CODE
172EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" 245EPATCH_COMMON_OPTS="-g0 -E --no-backup-if-mismatch"
173# @VARIABLE: EPATCH_EXCLUDE 246# @VARIABLE: EPATCH_EXCLUDE
174# @DESCRIPTION: 247# @DESCRIPTION:
175# List of patches not to apply. Note this is only file names, 248# List of patches not to apply. Note this is only file names,
176# and not the full path. Globs accepted. 249# and not the full path. Globs accepted.
177EPATCH_EXCLUDE="" 250EPATCH_EXCLUDE=""
188# Only require patches to match EPATCH_SUFFIX rather than the extended 261# Only require patches to match EPATCH_SUFFIX rather than the extended
189# arch naming style. 262# arch naming style.
190EPATCH_FORCE="no" 263EPATCH_FORCE="no"
191 264
192# @FUNCTION: epatch 265# @FUNCTION: epatch
193# @USAGE: [patches] [dirs of patches] 266# @USAGE: [options] [patches] [dirs of patches]
194# @DESCRIPTION: 267# @DESCRIPTION:
195# epatch is designed to greatly simplify the application of patches. It can 268# epatch is designed to greatly simplify the application of patches. It can
196# process patch files directly, or directories of patches. The patches may be 269# process patch files directly, or directories of patches. The patches may be
197# compressed (bzip/gzip/etc...) or plain text. You generally need not specify 270# compressed (bzip/gzip/etc...) or plain text. You generally need not specify
198# the -p option as epatch will automatically attempt -p0 to -p5 until things 271# the -p option as epatch will automatically attempt -p0 to -p5 until things
199# apply successfully. 272# apply successfully.
200# 273#
201# If you do not specify any options, then epatch will default to the directory 274# If you do not specify any patches/dirs, then epatch will default to the
202# specified by EPATCH_SOURCE. 275# directory specified by EPATCH_SOURCE.
276#
277# Any options specified that start with a dash will be passed down to patch
278# for this specific invocation. As soon as an arg w/out a dash is found, then
279# arg processing stops.
203# 280#
204# When processing directories, epatch will apply all patches that match: 281# When processing directories, epatch will apply all patches that match:
205# @CODE 282# @CODE
206# if ${EPATCH_FORCE} != "yes" 283# if ${EPATCH_FORCE} != "yes"
207# ??_${ARCH}_foo.${EPATCH_SUFFIX} 284# ??_${ARCH}_foo.${EPATCH_SUFFIX}
225 echo "${1//?/=}" 302 echo "${1//?/=}"
226 } 303 }
227 304
228 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402 305 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
229 306
307 # First process options. We localize the EPATCH_OPTS setting
308 # from above so that we can pass it on in the loop below with
309 # any additional values the user has specified.
310 local EPATCH_OPTS=( ${EPATCH_OPTS[*]} )
311 while [[ $# -gt 0 ]] ; do
312 case $1 in
313 -*) EPATCH_OPTS+=( "$1" ) ;;
314 *) break ;;
315 esac
316 shift
317 done
318
230 # Let the rest of the code process one user arg at a time -- 319 # Let the rest of the code process one user arg at a time --
231 # each arg may expand into multiple patches, and each arg may 320 # each arg may expand into multiple patches, and each arg may
232 # need to start off with the default global EPATCH_xxx values 321 # need to start off with the default global EPATCH_xxx values
233 if [[ $# -gt 1 ]] ; then 322 if [[ $# -gt 1 ]] ; then
234 local m 323 local m
267 eerror " ${EPATCH_SOURCE}" 356 eerror " ${EPATCH_SOURCE}"
268 eerror " ( ${EPATCH_SOURCE##*/} )" 357 eerror " ( ${EPATCH_SOURCE##*/} )"
269 echo 358 echo
270 die "Cannot find \$EPATCH_SOURCE!" 359 die "Cannot find \$EPATCH_SOURCE!"
271 fi 360 fi
361
362 # Now that we know we're actually going to apply something, merge
363 # all of the patch options back in to a single variable for below.
364 EPATCH_OPTS="${EPATCH_COMMON_OPTS} ${EPATCH_OPTS[*]}"
272 365
273 local PIPE_CMD 366 local PIPE_CMD
274 case ${EPATCH_SUFFIX##*\.} in 367 case ${EPATCH_SUFFIX##*\.} in
275 xz) PIPE_CMD="xz -dc" ;; 368 xz) PIPE_CMD="xz -dc" ;;
276 lzma) PIPE_CMD="lzma -dc" ;; 369 lzma) PIPE_CMD="lzma -dc" ;;
335 local STDERR_TARGET="${T}/${patchname}.out" 428 local STDERR_TARGET="${T}/${patchname}.out"
336 if [[ -e ${STDERR_TARGET} ]] ; then 429 if [[ -e ${STDERR_TARGET} ]] ; then
337 STDERR_TARGET="${T}/${patchname}-$$.out" 430 STDERR_TARGET="${T}/${patchname}-$$.out"
338 fi 431 fi
339 432
340 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}" 433 printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}"
341 434
342 # Decompress the patch if need be 435 # Decompress the patch if need be
343 local count=0 436 local count=0
344 local PATCH_TARGET 437 local PATCH_TARGET
345 if [[ -n ${PIPE_CMD} ]] ; then 438 if [[ -n ${PIPE_CMD} ]] ; then
373 eqawarn " In the future this will cause a failure." 466 eqawarn " In the future this will cause a failure."
374 eqawarn "${rel_paths}" 467 eqawarn "${rel_paths}"
375 fi 468 fi
376 469
377 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/ 470 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
471 local patch_cmd
378 while [[ ${count} -lt 5 ]] ; do 472 while [[ ${count} -lt 5 ]] ; do
473 patch_cmd="${BASH_ALIASES[patch]:-patch} -p${count} ${EPATCH_OPTS}"
474
379 # Generate some useful debug info ... 475 # Generate some useful debug info ...
380 ( 476 (
381 _epatch_draw_line "***** ${patchname} *****" 477 _epatch_draw_line "***** ${patchname} *****"
382 echo 478 echo
383 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'" 479 echo "PATCH COMMAND: ${patch_cmd} < '${PATCH_TARGET}'"
384 echo 480 echo
385 _epatch_draw_line "***** ${patchname} *****" 481 _epatch_draw_line "***** ${patchname} *****"
386 patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}" 2>&1 482 ${patch_cmd} --dry-run -f < "${PATCH_TARGET}" 2>&1
387 ret=$? 483 ret=$?
388 echo 484 echo
389 echo "patch program exited with status ${ret}" 485 echo "patch program exited with status ${ret}"
390 exit ${ret} 486 exit ${ret}
391 ) >> "${STDERR_TARGET}" 487 ) >> "${STDERR_TARGET}"
395 _epatch_draw_line "***** ${patchname} *****" 491 _epatch_draw_line "***** ${patchname} *****"
396 echo 492 echo
397 echo "ACTUALLY APPLYING ${patchname} ..." 493 echo "ACTUALLY APPLYING ${patchname} ..."
398 echo 494 echo
399 _epatch_draw_line "***** ${patchname} *****" 495 _epatch_draw_line "***** ${patchname} *****"
400 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1 496 ${patch_cmd} < "${PATCH_TARGET}" 2>&1
401 ret=$? 497 ret=$?
402 echo 498 echo
403 echo "patch program exited with status ${ret}" 499 echo "patch program exited with status ${ret}"
404 exit ${ret} 500 exit ${ret}
405 ) >> "${STDERR_TARGET}" 501 ) >> "${STDERR_TARGET}"
432 eerror " ${STDERR_TARGET}" 528 eerror " ${STDERR_TARGET}"
433 echo 529 echo
434 die "Failed Patch: ${patchname}!" 530 die "Failed Patch: ${patchname}!"
435 fi 531 fi
436 532
437 # if everything worked, delete the patch log 533 # if everything worked, delete the full debug patch log
438 rm -f "${STDERR_TARGET}" 534 rm -f "${STDERR_TARGET}"
535
536 # then log away the exact stuff for people to review later
537 cat <<-EOF >> "${T}/epatch.log"
538 PATCH: ${x}
539 CMD: ${patch_cmd}
540 PWD: ${PWD}
541
542 EOF
439 eend 0 543 eend 0
440 done 544 done
441 545
442 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching" 546 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
443 : # everything worked 547 : # everything worked
445 549
446# @FUNCTION: epatch_user 550# @FUNCTION: epatch_user
447# @USAGE: 551# @USAGE:
448# @DESCRIPTION: 552# @DESCRIPTION:
449# Applies user-provided patches to the source tree. The patches are 553# Applies user-provided patches to the source tree. The patches are
450# taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>/, where the first 554# taken from /etc/portage/patches/<CATEGORY>/<PF|P|PN>[:SLOT]/, where the first
451# of these three directories to exist will be the one to use, ignoring 555# of these three directories to exist will be the one to use, ignoring
452# any more general directories which might exist as well. 556# any more general directories which might exist as well. They must end
557# in ".patch" to be applied.
453# 558#
454# User patches are intended for quick testing of patches without ebuild 559# User patches are intended for quick testing of patches without ebuild
455# modifications, as well as for permanent customizations a user might 560# modifications, as well as for permanent customizations a user might
456# desire. Obviously, there can be no official support for arbitrarily 561# desire. Obviously, there can be no official support for arbitrarily
457# patched ebuilds. So whenever a build log in a bug report mentions that 562# patched ebuilds. So whenever a build log in a bug report mentions that
471# autotool input files as well. 576# autotool input files as well.
472epatch_user() { 577epatch_user() {
473 [[ $# -ne 0 ]] && die "epatch_user takes no options" 578 [[ $# -ne 0 ]] && die "epatch_user takes no options"
474 579
475 # Allow multiple calls to this function; ignore all but the first 580 # Allow multiple calls to this function; ignore all but the first
476 local applied="${T}/epatch_user.applied" 581 local applied="${T}/epatch_user.log"
477 [[ -e ${applied} ]] && return 2 582 [[ -e ${applied} ]] && return 2
478 583
479 # don't clobber any EPATCH vars that the parent might want 584 # don't clobber any EPATCH vars that the parent might want
480 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches 585 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
481 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 586 for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}{,:${SLOT}}; do
482 EPATCH_SOURCE=${base}/${CTARGET}/${check} 587 EPATCH_SOURCE=${base}/${CTARGET}/${check}
483 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check} 588 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
484 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check} 589 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
485 if [[ -d ${EPATCH_SOURCE} ]] ; then 590 if [[ -d ${EPATCH_SOURCE} ]] ; then
486 EPATCH_SOURCE=${EPATCH_SOURCE} \ 591 EPATCH_SOURCE=${EPATCH_SOURCE} \
529 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX 634 TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX
530 fi 635 fi
531 fi 636 fi
532} 637}
533 638
534# @FUNCTION: egetent
535# @USAGE: <database> <key>
536# @MAINTAINER:
537# base-system@gentoo.org (Linux)
538# Joe Jezak <josejx@gmail.com> (OS X)
539# usata@gentoo.org (OS X)
540# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
541# @DESCRIPTION:
542# Small wrapper for getent (Linux),
543# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
544# and pw (FreeBSD) used in enewuser()/enewgroup()
545egetent() {
546 case ${CHOST} in
547 *-darwin[678])
548 case "$2" in
549 *[!0-9]*) # Non numeric
550 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2\$/) {print \$0;exit;} }"
551 ;;
552 *) # Numeric
553 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
554 ;;
555 esac
556 ;;
557 *-darwin*)
558 local mytype=$1
559 [[ "passwd" == $mytype ]] && mytype="Users"
560 [[ "group" == $mytype ]] && mytype="Groups"
561 case "$2" in
562 *[!0-9]*) # Non numeric
563 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
564 ;;
565 *) # Numeric
566 local mykey="UniqueID"
567 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
568 dscl . -search /$mytype $mykey $2 2>/dev/null
569 ;;
570 esac
571 ;;
572 *-freebsd*|*-dragonfly*)
573 local opts action="user"
574 [[ $1 == "passwd" ]] || action="group"
575
576 # lookup by uid/gid
577 if [[ $2 == [[:digit:]]* ]] ; then
578 [[ ${action} == "user" ]] && opts="-u" || opts="-g"
579 fi
580
581 pw show ${action} ${opts} "$2" -q
582 ;;
583 *-netbsd*|*-openbsd*)
584 grep "$2:\*:" /etc/$1
585 ;;
586 *)
587 type -p nscd >& /dev/null && nscd -i "$1"
588 getent "$1" "$2"
589 ;;
590 esac
591}
592
593# @FUNCTION: enewuser
594# @USAGE: <user> [uid] [shell] [homedir] [groups] [params]
595# @DESCRIPTION:
596# Same as enewgroup, you are not required to understand how to properly add
597# a user to the system. The only required parameter is the username.
598# Default uid is (pass -1 for this) next available, default shell is
599# /bin/false, default homedir is /dev/null, there are no default groups,
600# and default params sets the comment as 'added by portage for ${PN}'.
601enewuser() {
602 case ${EBUILD_PHASE} in
603 unpack|compile|test|install)
604 eerror "'enewuser()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
605 eerror "Package fails at QA and at life. Please file a bug."
606 die "Bad package! enewuser is only for use in pkg_* functions!"
607 esac
608
609 # get the username
610 local euser=$1; shift
611 if [[ -z ${euser} ]] ; then
612 eerror "No username specified !"
613 die "Cannot call enewuser without a username"
614 fi
615
616 # lets see if the username already exists
617 if [[ -n $(egetent passwd "${euser}") ]] ; then
618 return 0
619 fi
620 einfo "Adding user '${euser}' to your system ..."
621
622 # options to pass to useradd
623 local opts=
624
625 # handle uid
626 local euid=$1; shift
627 if [[ -n ${euid} && ${euid} != -1 ]] ; then
628 if [[ ${euid} -gt 0 ]] ; then
629 if [[ -n $(egetent passwd ${euid}) ]] ; then
630 euid="next"
631 fi
632 else
633 eerror "Userid given but is not greater than 0 !"
634 die "${euid} is not a valid UID"
635 fi
636 else
637 euid="next"
638 fi
639 if [[ ${euid} == "next" ]] ; then
640 for ((euid = 101; euid <= 999; euid++)); do
641 [[ -z $(egetent passwd ${euid}) ]] && break
642 done
643 fi
644 opts="${opts} -u ${euid}"
645 einfo " - Userid: ${euid}"
646
647 # handle shell
648 local eshell=$1; shift
649 if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then
650 if [[ ! -e ${ROOT}${eshell} ]] ; then
651 eerror "A shell was specified but it does not exist !"
652 die "${eshell} does not exist in ${ROOT}"
653 fi
654 if [[ ${eshell} == */false || ${eshell} == */nologin ]] ; then
655 eerror "Do not specify ${eshell} yourself, use -1"
656 die "Pass '-1' as the shell parameter"
657 fi
658 else
659 for shell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null ; do
660 [[ -x ${ROOT}${shell} ]] && break
661 done
662
663 if [[ ${shell} == "/dev/null" ]] ; then
664 eerror "Unable to identify the shell to use, proceeding with userland default."
665 case ${USERLAND} in
666 GNU) shell="/bin/false" ;;
667 BSD) shell="/sbin/nologin" ;;
668 Darwin) shell="/usr/sbin/nologin" ;;
669 *) die "Unable to identify the default shell for userland ${USERLAND}"
670 esac
671 fi
672
673 eshell=${shell}
674 fi
675 einfo " - Shell: ${eshell}"
676 opts="${opts} -s ${eshell}"
677
678 # handle homedir
679 local ehome=$1; shift
680 if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then
681 ehome="/dev/null"
682 fi
683 einfo " - Home: ${ehome}"
684 opts="${opts} -d ${ehome}"
685
686 # handle groups
687 local egroups=$1; shift
688 if [[ ! -z ${egroups} ]] ; then
689 local oldifs=${IFS}
690 local defgroup="" exgroups=""
691
692 export IFS=","
693 for g in ${egroups} ; do
694 export IFS=${oldifs}
695 if [[ -z $(egetent group "${g}") ]] ; then
696 eerror "You must add group ${g} to the system first"
697 die "${g} is not a valid GID"
698 fi
699 if [[ -z ${defgroup} ]] ; then
700 defgroup=${g}
701 else
702 exgroups="${exgroups},${g}"
703 fi
704 export IFS=","
705 done
706 export IFS=${oldifs}
707
708 opts="${opts} -g ${defgroup}"
709 if [[ ! -z ${exgroups} ]] ; then
710 opts="${opts} -G ${exgroups:1}"
711 fi
712 else
713 egroups="(none)"
714 fi
715 einfo " - Groups: ${egroups}"
716
717 # handle extra and add the user
718 local oldsandbox=${SANDBOX_ON}
719 export SANDBOX_ON="0"
720 case ${CHOST} in
721 *-darwin*)
722 ### Make the user
723 if [[ -z $@ ]] ; then
724 dscl . create /users/${euser} uid ${euid}
725 dscl . create /users/${euser} shell ${eshell}
726 dscl . create /users/${euser} home ${ehome}
727 dscl . create /users/${euser} realname "added by portage for ${PN}"
728 ### Add the user to the groups specified
729 local oldifs=${IFS}
730 export IFS=","
731 for g in ${egroups} ; do
732 dscl . merge /groups/${g} users ${euser}
733 done
734 export IFS=${oldifs}
735 else
736 einfo "Extra options are not supported on Darwin yet"
737 einfo "Please report the ebuild along with the info below"
738 einfo "eextra: $@"
739 die "Required function missing"
740 fi
741 ;;
742 *-freebsd*|*-dragonfly*)
743 if [[ -z $@ ]] ; then
744 pw useradd ${euser} ${opts} \
745 -c "added by portage for ${PN}" \
746 die "enewuser failed"
747 else
748 einfo " - Extra: $@"
749 pw useradd ${euser} ${opts} \
750 "$@" || die "enewuser failed"
751 fi
752 ;;
753
754 *-netbsd*)
755 if [[ -z $@ ]] ; then
756 useradd ${opts} ${euser} || die "enewuser failed"
757 else
758 einfo " - Extra: $@"
759 useradd ${opts} ${euser} "$@" || die "enewuser failed"
760 fi
761 ;;
762
763 *-openbsd*)
764 if [[ -z $@ ]] ; then
765 useradd -u ${euid} -s ${eshell} \
766 -d ${ehome} -c "Added by portage for ${PN}" \
767 -g ${egroups} ${euser} || die "enewuser failed"
768 else
769 einfo " - Extra: $@"
770 useradd -u ${euid} -s ${eshell} \
771 -d ${ehome} -c "Added by portage for ${PN}" \
772 -g ${egroups} ${euser} "$@" || die "enewuser failed"
773 fi
774 ;;
775
776 *)
777 if [[ -z $@ ]] ; then
778 useradd -r ${opts} \
779 -c "added by portage for ${PN}" \
780 ${euser} \
781 || die "enewuser failed"
782 else
783 einfo " - Extra: $@"
784 useradd -r ${opts} "$@" \
785 ${euser} \
786 || die "enewuser failed"
787 fi
788 ;;
789 esac
790
791 if [[ ! -e ${ROOT}/${ehome} ]] ; then
792 einfo " - Creating ${ehome} in ${ROOT}"
793 mkdir -p "${ROOT}/${ehome}"
794 chown ${euser} "${ROOT}/${ehome}"
795 chmod 755 "${ROOT}/${ehome}"
796 fi
797
798 export SANDBOX_ON=${oldsandbox}
799}
800
801# @FUNCTION: enewgroup
802# @USAGE: <group> [gid]
803# @DESCRIPTION:
804# This function does not require you to understand how to properly add a
805# group to the system. Just give it a group name to add and enewgroup will
806# do the rest. You may specify the gid for the group or allow the group to
807# allocate the next available one.
808enewgroup() {
809 case ${EBUILD_PHASE} in
810 unpack|compile|test|install)
811 eerror "'enewgroup()' called from '${EBUILD_PHASE}()' which is not a pkg_* function."
812 eerror "Package fails at QA and at life. Please file a bug."
813 die "Bad package! enewgroup is only for use in pkg_* functions!"
814 esac
815
816 # get the group
817 local egroup="$1"; shift
818 if [ -z "${egroup}" ]
819 then
820 eerror "No group specified !"
821 die "Cannot call enewgroup without a group"
822 fi
823
824 # see if group already exists
825 if [[ -n $(egetent group "${egroup}") ]]; then
826 return 0
827 fi
828 einfo "Adding group '${egroup}' to your system ..."
829
830 # options to pass to useradd
831 local opts=
832
833 # handle gid
834 local egid="$1"; shift
835 if [ ! -z "${egid}" ]
836 then
837 if [ "${egid}" -gt 0 ]
838 then
839 if [ -z "`egetent group ${egid}`" ]
840 then
841 if [[ "${CHOST}" == *-darwin* ]]; then
842 opts="${opts} ${egid}"
843 else
844 opts="${opts} -g ${egid}"
845 fi
846 else
847 egid="next available; requested gid taken"
848 fi
849 else
850 eerror "Groupid given but is not greater than 0 !"
851 die "${egid} is not a valid GID"
852 fi
853 else
854 egid="next available"
855 fi
856 einfo " - Groupid: ${egid}"
857
858 # handle extra
859 local eextra="$@"
860 opts="${opts} ${eextra}"
861
862 # add the group
863 local oldsandbox="${SANDBOX_ON}"
864 export SANDBOX_ON="0"
865 case ${CHOST} in
866 *-darwin*)
867 if [ ! -z "${eextra}" ];
868 then
869 einfo "Extra options are not supported on Darwin/OS X yet"
870 einfo "Please report the ebuild along with the info below"
871 einfo "eextra: ${eextra}"
872 die "Required function missing"
873 fi
874
875 # If we need the next available
876 case ${egid} in
877 *[!0-9]*) # Non numeric
878 for ((egid = 101; egid <= 999; egid++)); do
879 [[ -z $(egetent group ${egid}) ]] && break
880 done
881 esac
882 dscl . create /groups/${egroup} gid ${egid}
883 dscl . create /groups/${egroup} passwd '*'
884 ;;
885
886 *-freebsd*|*-dragonfly*)
887 case ${egid} in
888 *[!0-9]*) # Non numeric
889 for ((egid = 101; egid <= 999; egid++)); do
890 [[ -z $(egetent group ${egid}) ]] && break
891 done
892 esac
893 pw groupadd ${egroup} -g ${egid} || die "enewgroup failed"
894 ;;
895
896 *-netbsd*)
897 case ${egid} in
898 *[!0-9]*) # Non numeric
899 for ((egid = 101; egid <= 999; egid++)); do
900 [[ -z $(egetent group ${egid}) ]] && break
901 done
902 esac
903 groupadd -g ${egid} ${egroup} || die "enewgroup failed"
904 ;;
905
906 *)
907 # We specify -r so that we get a GID in the system range from login.defs
908 groupadd -r ${opts} ${egroup} || die "enewgroup failed"
909 ;;
910 esac
911 export SANDBOX_ON="${oldsandbox}"
912}
913
914# @FUNCTION: edos2unix 639# @FUNCTION: edos2unix
915# @USAGE: <file> [more files ...] 640# @USAGE: <file> [more files ...]
916# @DESCRIPTION: 641# @DESCRIPTION:
917# A handy replacement for dos2unix, recode, fixdos, etc... This allows you 642# A handy replacement for dos2unix, recode, fixdos, etc... This allows you
918# to remove all of these text utilities from DEPEND variables because this 643# to remove all of these text utilities from DEPEND variables because this
919# is a script based solution. Just give it a list of files to convert and 644# is a script based solution. Just give it a list of files to convert and
920# they will all be changed from the DOS CRLF format to the UNIX LF format. 645# they will all be changed from the DOS CRLF format to the UNIX LF format.
921edos2unix() { 646edos2unix() {
922 echo "$@" | xargs sed -i 's/\r$//' 647 [[ $# -eq 0 ]] && return 0
648 sed -i 's/\r$//' -- "$@" || die
923} 649}
924 650
925# Make a desktop file ! 651# @FUNCTION: make_desktop_entry
926# Great for making those icons in kde/gnome startmenu !
927# Amaze your friends ! Get the women ! Join today !
928#
929# make_desktop_entry(<command>, [name], [icon], [type], [fields]) 652# @USAGE: make_desktop_entry(<command>, [name], [icon], [type], [fields])
653# @DESCRIPTION:
654# Make a .desktop file.
930# 655#
656# @CODE
931# binary: what command does the app run with ? 657# binary: what command does the app run with ?
932# name: the name that will show up in the menu 658# name: the name that will show up in the menu
933# icon: give your little like a pretty little icon ... 659# icon: the icon to use in the menu entry
934# this can be relative (to /usr/share/pixmaps) or 660# this can be relative (to /usr/share/pixmaps) or
935# a full path to an icon 661# a full path to an icon
936# type: what kind of application is this ? for categories: 662# type: what kind of application is this?
663# for categories:
937# http://standards.freedesktop.org/menu-spec/latest/apa.html 664# http://standards.freedesktop.org/menu-spec/latest/apa.html
665# if unset, function tries to guess from package's category
938# fields: extra fields to append to the desktop file; a printf string 666# fields: extra fields to append to the desktop file; a printf string
667# @CODE
939make_desktop_entry() { 668make_desktop_entry() {
940 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable" 669 [[ -z $1 ]] && die "make_desktop_entry: You must specify the executable"
941 670
942 local exec=${1} 671 local exec=${1}
943 local name=${2:-${PN}} 672 local name=${2:-${PN}}
949 local catmaj=${CATEGORY%%-*} 678 local catmaj=${CATEGORY%%-*}
950 local catmin=${CATEGORY##*-} 679 local catmin=${CATEGORY##*-}
951 case ${catmaj} in 680 case ${catmaj} in
952 app) 681 app)
953 case ${catmin} in 682 case ${catmin} in
954 accessibility) type=Accessibility;; 683 accessibility) type="Utility;Accessibility";;
955 admin) type=System;; 684 admin) type=System;;
956 antivirus) type=System;; 685 antivirus) type=System;;
957 arch) type=Archiving;; 686 arch) type="Utility;Archiving";;
958 backup) type=Archiving;; 687 backup) type="Utility;Archiving";;
959 cdr) type=DiscBurning;; 688 cdr) type="AudioVideo;DiscBurning";;
960 dicts) type=Dictionary;; 689 dicts) type="Office;Dictionary";;
961 doc) type=Documentation;; 690 doc) type=Documentation;;
962 editors) type=TextEditor;; 691 editors) type="Utility;TextEditor";;
963 emacs) type=TextEditor;; 692 emacs) type="Development;TextEditor";;
964 emulation) type=Emulator;; 693 emulation) type="System;Emulator";;
965 laptop) type=HardwareSettings;; 694 laptop) type="Settings;HardwareSettings";;
966 office) type=Office;; 695 office) type=Office;;
967 pda) type=PDA;; 696 pda) type="Office;PDA";;
968 vim) type=TextEditor;; 697 vim) type="Development;TextEditor";;
969 xemacs) type=TextEditor;; 698 xemacs) type="Development;TextEditor";;
970 esac 699 esac
971 ;; 700 ;;
972 701
973 dev) 702 dev)
974 type="Development" 703 type="Development"
1211 insinto /usr/share/applications 940 insinto /usr/share/applications
1212 newins "$@" 941 newins "$@"
1213 ) 942 )
1214} 943}
1215 944
1216# @FUNCTION: doicon 945# @FUNCTION: _iconins
1217# @USAGE: <list of icons> 946# @INTERNAL
1218# @DESCRIPTION: 947# @DESCRIPTION:
1219# Install the list of icons into the icon directory (/usr/share/pixmaps). 948# function for use in doicon and newicon
1220# This is useful in conjunction with creating desktop/menu files. 949_iconins() {
1221doicon() {
1222 ( 950 (
1223 # wrap the env here so that the 'insinto' call 951 # wrap the env here so that the 'insinto' call
1224 # doesn't corrupt the env of the caller 952 # doesn't corrupt the env of the caller
1225 local i j ret 953 local funcname=$1; shift
1226 insinto /usr/share/pixmaps 954 local size dir
1227 for i in "$@" ; do 955 local context=apps
1228 if [[ -f ${i} ]] ; then 956 local theme=hicolor
1229 doins "${i}" 957
1230 ((ret+=$?)) 958 while [[ $# -gt 0 ]] ; do
1231 elif [[ -d ${i} ]] ; then 959 case $1 in
1232 for j in "${i}"/*.png ; do 960 -s|--size)
1233 doins "${j}" 961 if [[ ${2%%x*}x${2%%x*} == "$2" ]] ; then
1234 ((ret+=$?)) 962 size=${2%%x*}
1235 done
1236 else 963 else
1237 ((++ret)) 964 size=${2}
1238 fi 965 fi
1239 done
1240 exit ${ret}
1241 )
1242}
1243
1244# @FUNCTION: newicon
1245# @USAGE: <icon> <newname>
1246# @DESCRIPTION:
1247# Like all other new* functions, install the specified icon as newname.
1248newicon() {
1249 (
1250 # wrap the env here so that the 'insinto' call
1251 # doesn't corrupt the env of the caller
1252 insinto /usr/share/pixmaps
1253 newins "$@"
1254 )
1255}
1256
1257# for internal use only (unpack_pdv and unpack_makeself)
1258find_unpackable_file() {
1259 local src=$1
1260 if [[ -z ${src} ]] ; then
1261 src=${DISTDIR}/${A}
1262 else
1263 if [[ -e ${DISTDIR}/${src} ]] ; then
1264 src=${DISTDIR}/${src}
1265 elif [[ -e ${PWD}/${src} ]] ; then
1266 src=${PWD}/${src}
1267 elif [[ -e ${src} ]] ; then
1268 src=${src}
1269 fi
1270 fi
1271 [[ ! -e ${src} ]] && return 1
1272 echo "${src}"
1273}
1274
1275# @FUNCTION: unpack_pdv
1276# @USAGE: <file to unpack> <size of off_t>
1277# @DESCRIPTION:
1278# Unpack those pesky pdv generated files ...
1279# They're self-unpacking programs with the binary package stuffed in
1280# the middle of the archive. Valve seems to use it a lot ... too bad
1281# it seems to like to segfault a lot :(. So lets take it apart ourselves.
1282#
1283# You have to specify the off_t size ... I have no idea how to extract that
1284# information out of the binary executable myself. Basically you pass in
1285# the size of the off_t type (in bytes) on the machine that built the pdv
1286# archive.
1287#
1288# One way to determine this is by running the following commands:
1289#
1290# @CODE
1291# strings <pdv archive> | grep lseek
1292# strace -elseek <pdv archive>
1293# @CODE
1294#
1295# Basically look for the first lseek command (we do the strings/grep because
1296# sometimes the function call is _llseek or something) and steal the 2nd
1297# parameter. Here is an example:
1298#
1299# @CODE
1300# vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
1301# lseek
1302# vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
1303# lseek(3, -4, SEEK_END) = 2981250
1304# @CODE
1305#
1306# Thus we would pass in the value of '4' as the second parameter.
1307unpack_pdv() {
1308 local src=$(find_unpackable_file "$1")
1309 local sizeoff_t=$2
1310
1311 [[ -z ${src} ]] && die "Could not locate source for '$1'"
1312 [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :("
1313
1314 local shrtsrc=$(basename "${src}")
1315 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1316 local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\")
1317 local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\")
1318
1319 # grab metadata for debug reasons
1320 local metafile=$(emktemp)
1321 tail -c +$((${metaskip}+1)) "${src}" > "${metafile}"
1322
1323 # rip out the final file name from the metadata
1324 local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1)
1325 datafile=$(basename "${datafile}")
1326
1327 # now lets uncompress/untar the file if need be
1328 local tmpfile=$(emktemp)
1329 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile}
1330
1331 local iscompressed=$(file -b "${tmpfile}")
1332 if [[ ${iscompressed:0:8} == "compress" ]] ; then
1333 iscompressed=1
1334 mv ${tmpfile}{,.Z}
1335 gunzip ${tmpfile}
1336 else
1337 iscompressed=0
1338 fi
1339 local istar=$(file -b "${tmpfile}")
1340 if [[ ${istar:0:9} == "POSIX tar" ]] ; then
1341 istar=1
1342 else
1343 istar=0
1344 fi
1345
1346 #for some reason gzip dies with this ... dd cant provide buffer fast enough ?
1347 #dd if=${src} ibs=${metaskip} count=1 \
1348 # | dd ibs=${tailskip} skip=1 \
1349 # | gzip -dc \
1350 # > ${datafile}
1351 if [ ${iscompressed} -eq 1 ] ; then
1352 if [ ${istar} -eq 1 ] ; then
1353 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1354 | head -c $((${metaskip}-${tailskip})) \
1355 | tar -xzf -
1356 else
1357 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1358 | head -c $((${metaskip}-${tailskip})) \
1359 | gzip -dc \
1360 > ${datafile}
1361 fi
1362 else
1363 if [ ${istar} -eq 1 ] ; then
1364 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1365 | head -c $((${metaskip}-${tailskip})) \
1366 | tar --no-same-owner -xf -
1367 else
1368 tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \
1369 | head -c $((${metaskip}-${tailskip})) \
1370 > ${datafile}
1371 fi
1372 fi
1373 true
1374 #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1375 #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')"
1376}
1377
1378# @FUNCTION: unpack_makeself
1379# @USAGE: [file to unpack] [offset] [tail|dd]
1380# @DESCRIPTION:
1381# Unpack those pesky makeself generated files ...
1382# They're shell scripts with the binary package tagged onto
1383# the end of the archive. Loki utilized the format as does
1384# many other game companies.
1385#
1386# If the file is not specified, then ${A} is used. If the
1387# offset is not specified then we will attempt to extract
1388# the proper offset from the script itself.
1389unpack_makeself() {
1390 local src_input=${1:-${A}}
1391 local src=$(find_unpackable_file "${src_input}")
1392 local skip=$2
1393 local exe=$3
1394
1395 [[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
1396
1397 local shrtsrc=$(basename "${src}")
1398 echo ">>> Unpacking ${shrtsrc} to ${PWD}"
1399 if [[ -z ${skip} ]] ; then
1400 local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}')
1401 local skip=0
1402 exe=tail
1403 case ${ver} in 966 case ${size} in
1404 1.5.*|1.6.0-nv) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same 967 16|22|24|32|36|48|64|72|96|128|192|256)
1405 skip=$(grep -a ^skip= "${src}" | cut -d= -f2) 968 size=${size}x${size};;
1406 ;; 969 scalable)
1407 2.0|2.0.1)
1408 skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
1409 ;;
1410 2.1.1)
1411 skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
1412 (( skip++ ))
1413 ;;
1414 2.1.2)
1415 skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
1416 (( skip++ ))
1417 ;;
1418 2.1.3)
1419 skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
1420 (( skip++ ))
1421 ;;
1422 2.1.4|2.1.5)
1423 skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
1424 skip=$(head -n ${skip} "${src}" | wc -c)
1425 exe="dd"
1426 ;; 970 ;;
1427 *) 971 *)
1428 eerror "I'm sorry, but I was unable to support the Makeself file." 972 eerror "${size} is an unsupported icon size!"
1429 eerror "The version I detected was '${ver}'." 973 exit 1;;
1430 eerror "Please file a bug about the file ${shrtsrc} at"
1431 eerror "http://bugs.gentoo.org/ so that support can be added."
1432 die "makeself version '${ver}' not supported"
1433 ;;
1434 esac 974 esac
1435 debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" 975 shift 2;;
1436 fi 976 -t|--theme)
1437 case ${exe} in 977 theme=${2}
1438 tail) exe="tail -n +${skip} '${src}'";; 978 shift 2;;
1439 dd) exe="dd ibs=${skip} skip=1 if='${src}'";; 979 -c|--context)
1440 *) die "makeself cant handle exe '${exe}'" 980 context=${2}
1441 esac 981 shift 2;;
1442
1443 # lets grab the first few bytes of the file to figure out what kind of archive it is
1444 local filetype tmpfile=$(emktemp)
1445 eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
1446 filetype=$(file -b "${tmpfile}") || die
1447 case ${filetype} in
1448 *tar\ archive*)
1449 eval ${exe} | tar --no-same-owner -xf -
1450 ;;
1451 bzip2*)
1452 eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
1453 ;;
1454 gzip*)
1455 eval ${exe} | tar --no-same-owner -xzf -
1456 ;;
1457 compress*)
1458 eval ${exe} | gunzip | tar --no-same-owner -xf -
1459 ;;
1460 *) 982 *)
1461 eerror "Unknown filetype \"${filetype}\" ?"
1462 false
1463 ;;
1464 esac
1465 assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})"
1466}
1467
1468# @FUNCTION: check_license
1469# @USAGE: [license]
1470# @DESCRIPTION:
1471# Display a license for user to accept. If no license is
1472# specified, then ${LICENSE} is used.
1473check_license() {
1474 local lic=$1
1475 if [ -z "${lic}" ] ; then
1476 lic="${PORTDIR}/licenses/${LICENSE}"
1477 else
1478 if [ -e "${PORTDIR}/licenses/${lic}" ] ; then
1479 lic="${PORTDIR}/licenses/${lic}"
1480 elif [ -e "${PWD}/${lic}" ] ; then
1481 lic="${PWD}/${lic}"
1482 elif [ -e "${lic}" ] ; then
1483 lic="${lic}"
1484 fi
1485 fi
1486 local l="`basename ${lic}`"
1487
1488 # here is where we check for the licenses the user already
1489 # accepted ... if we don't find a match, we make the user accept
1490 local alic
1491 eshopts_push -o noglob # so that bash doesn't expand "*"
1492 for alic in ${ACCEPT_LICENSE} ; do
1493 if [[ ${alic} == ${l} ]]; then
1494 eshopts_pop
1495 return 0
1496 fi
1497 done
1498 eshopts_pop
1499 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1500
1501 local licmsg=$(emktemp)
1502 cat <<-EOF > ${licmsg}
1503 **********************************************************
1504 The following license outlines the terms of use of this
1505 package. You MUST accept this license for installation to
1506 continue. When you are done viewing, hit 'q'. If you
1507 CTRL+C out of this, the install will not run!
1508 **********************************************************
1509
1510 EOF
1511 cat ${lic} >> ${licmsg}
1512 ${PAGER:-less} ${licmsg} || die "Could not execute pager (${PAGER}) to accept ${lic}"
1513 einfon "Do you accept the terms of this license (${l})? [yes/no] "
1514 read alic
1515 case ${alic} in
1516 yes|Yes|y|Y)
1517 return 0
1518 ;;
1519 *)
1520 echo;echo;echo
1521 eerror "You MUST accept the license to continue! Exiting!"
1522 die "Failed to accept license"
1523 ;;
1524 esac
1525}
1526
1527# @FUNCTION: cdrom_get_cds
1528# @USAGE: <file on cd1> [file on cd2] [file on cd3] [...]
1529# @DESCRIPTION:
1530# Aquire cd(s) for those lovely cd-based emerges. Yes, this violates
1531# the whole 'non-interactive' policy, but damnit I want CD support !
1532#
1533# With these cdrom functions we handle all the user interaction and
1534# standardize everything. All you have to do is call cdrom_get_cds()
1535# and when the function returns, you can assume that the cd has been
1536# found at CDROM_ROOT.
1537#
1538# The function will attempt to locate a cd based upon a file that is on
1539# the cd. The more files you give this function, the more cds
1540# the cdrom functions will handle.
1541#
1542# Normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2',
1543# etc... If you want to give the cds better names, then just export
1544# the appropriate CDROM_NAME variable before calling cdrom_get_cds().
1545# Use CDROM_NAME for one cd, or CDROM_NAME_# for multiple cds. You can
1546# also use the CDROM_NAME_SET bash array.
1547#
1548# For those multi cd ebuilds, see the cdrom_load_next_cd() function.
1549cdrom_get_cds() {
1550 # first we figure out how many cds we're dealing with by
1551 # the # of files they gave us
1552 local cdcnt=0
1553 local f=
1554 for f in "$@" ; do
1555 ((++cdcnt))
1556 export CDROM_CHECK_${cdcnt}="$f"
1557 done
1558 export CDROM_TOTAL_CDS=${cdcnt}
1559 export CDROM_CURRENT_CD=1
1560
1561 # now we see if the user gave use CD_ROOT ...
1562 # if they did, let's just believe them that it's correct
1563 if [[ -n ${CD_ROOT}${CD_ROOT_1} ]] ; then
1564 local var=
1565 cdcnt=0
1566 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1567 ((++cdcnt))
1568 var="CD_ROOT_${cdcnt}"
1569 [[ -z ${!var} ]] && var="CD_ROOT"
1570 if [[ -z ${!var} ]] ; then 983 if [[ -z ${size} ]] ; then
1571 eerror "You must either use just the CD_ROOT" 984 insinto /usr/share/pixmaps
1572 eerror "or specify ALL the CD_ROOT_X variables." 985 else
1573 eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables." 986 insinto /usr/share/icons/${theme}/${size}/${context}
1574 die "could not locate CD_ROOT_${cdcnt}"
1575 fi 987 fi
1576 done
1577 export CDROM_ROOT=${CD_ROOT_1:-${CD_ROOT}}
1578 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1579 export CDROM_SET=-1
1580 for f in ${CDROM_CHECK_1//:/ } ; do
1581 ((++CDROM_SET))
1582 [[ -e ${CDROM_ROOT}/${f} ]] && break
1583 done
1584 export CDROM_MATCH=${f}
1585 return
1586 fi
1587 988
1588 # User didn't help us out so lets make sure they know they can 989 if [[ ${funcname} == doicon ]] ; then
1589 # simplify the whole process ...
1590 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1591 einfo "This ebuild will need the ${CDROM_NAME:-cdrom for ${PN}}"
1592 echo
1593 einfo "If you do not have the CD, but have the data files"
1594 einfo "mounted somewhere on your filesystem, just export"
1595 einfo "the variable CD_ROOT so that it points to the"
1596 einfo "directory containing the files."
1597 echo
1598 einfo "For example:"
1599 einfo "export CD_ROOT=/mnt/cdrom"
1600 echo
1601 else
1602 if [[ -n ${CDROM_NAME_SET} ]] ; then
1603 # Translate the CDROM_NAME_SET array into CDROM_NAME_#
1604 cdcnt=0
1605 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1606 ((++cdcnt))
1607 export CDROM_NAME_${cdcnt}="${CDROM_NAME_SET[$((${cdcnt}-1))]}"
1608 done
1609 fi
1610
1611 einfo "This package will need access to ${CDROM_TOTAL_CDS} cds."
1612 cdcnt=0
1613 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1614 ((++cdcnt))
1615 var="CDROM_NAME_${cdcnt}"
1616 [[ ! -z ${!var} ]] && einfo " CD ${cdcnt}: ${!var}"
1617 done
1618 echo
1619 einfo "If you do not have the CDs, but have the data files"
1620 einfo "mounted somewhere on your filesystem, just export"
1621 einfo "the following variables so they point to the right place:"
1622 einfon ""
1623 cdcnt=0
1624 while [[ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ]] ; do
1625 ((++cdcnt))
1626 echo -n " CD_ROOT_${cdcnt}"
1627 done
1628 echo
1629 einfo "Or, if you have all the files in the same place, or"
1630 einfo "you only have one cdrom, you can export CD_ROOT"
1631 einfo "and that place will be used as the same data source"
1632 einfo "for all the CDs."
1633 echo
1634 einfo "For example:"
1635 einfo "export CD_ROOT_1=/mnt/cdrom"
1636 echo
1637 fi
1638
1639 export CDROM_SET=""
1640 export CDROM_CURRENT_CD=0
1641 cdrom_load_next_cd
1642}
1643
1644# @FUNCTION: cdrom_load_next_cd
1645# @DESCRIPTION:
1646# Some packages are so big they come on multiple CDs. When you're done reading
1647# files off a CD and want access to the next one, just call this function.
1648# Again, all the messy details of user interaction are taken care of for you.
1649# Once this returns, just read the variable CDROM_ROOT for the location of the
1650# mounted CD. Note that you can only go forward in the CD list, so make sure
1651# you only call this function when you're done using the current CD.
1652cdrom_load_next_cd() {
1653 local var
1654 ((++CDROM_CURRENT_CD))
1655
1656 unset CDROM_ROOT
1657 var=CD_ROOT_${CDROM_CURRENT_CD}
1658 [[ -z ${!var} ]] && var="CD_ROOT"
1659 if [[ -z ${!var} ]] ; then 990 if [[ -f $1 ]] ; then
1660 var="CDROM_CHECK_${CDROM_CURRENT_CD}" 991 doins "${1}"
1661 _cdrom_locate_file_on_cd ${!var} 992 elif [[ -d $1 ]] ; then
1662 else 993 shopt -s nullglob
1663 export CDROM_ROOT=${!var} 994 doins "${1}"/*.{png,svg}
1664 fi 995 shopt -u nullglob
1665
1666 einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}"
1667}
1668
1669# this is used internally by the cdrom_get_cds() and cdrom_load_next_cd()
1670# functions. this should *never* be called from an ebuild.
1671# all it does is try to locate a give file on a cd ... if the cd isn't
1672# found, then a message asking for the user to insert the cdrom will be
1673# displayed and we'll hang out here until:
1674# (1) the file is found on a mounted cdrom
1675# (2) the user hits CTRL+C
1676_cdrom_locate_file_on_cd() {
1677 local mline=""
1678 local showedmsg=0 showjolietmsg=0
1679
1680 while [[ -z ${CDROM_ROOT} ]] ; do
1681 local i=0
1682 local -a cdset=(${*//:/ })
1683 if [[ -n ${CDROM_SET} ]] ; then
1684 cdset=(${cdset[${CDROM_SET}]})
1685 fi
1686
1687 while [[ -n ${cdset[${i}]} ]] ; do
1688 local dir=$(dirname ${cdset[${i}]})
1689 local file=$(basename ${cdset[${i}]})
1690
1691 local point= node= fs= foo=
1692 while read point node fs foo ; do
1693 [[ " cd9660 iso9660 udf " != *" ${fs} "* ]] && \
1694 ! [[ ${fs} == "subfs" && ",${opts}," == *",fs=cdfss,"* ]] \
1695 && continue
1696 point=${point//\040/ }
1697 [[ ! -d ${point}/${dir} ]] && continue
1698 [[ -z $(find "${point}/${dir}" -maxdepth 1 -iname "${file}") ]] && continue
1699 export CDROM_ROOT=${point}
1700 export CDROM_SET=${i}
1701 export CDROM_MATCH=${cdset[${i}]}
1702 return
1703 done <<< "$(get_mounts)"
1704
1705 ((++i))
1706 done
1707
1708 echo
1709 if [[ ${showedmsg} -eq 0 ]] ; then
1710 if [[ ${CDROM_TOTAL_CDS} -eq 1 ]] ; then
1711 if [[ -z ${CDROM_NAME} ]] ; then
1712 einfo "Please insert+mount the cdrom for ${PN} now !"
1713 else 996 else
1714 einfo "Please insert+mount the ${CDROM_NAME} cdrom now !" 997 eerror "${1} is not a valid file/directory!"
998 exit 1
1715 fi 999 fi
1716 else 1000 else
1717 if [[ -z ${CDROM_NAME_1} ]] ; then 1001 break
1718 einfo "Please insert+mount cd #${CDROM_CURRENT_CD} for ${PN} now !"
1719 else
1720 local var="CDROM_NAME_${CDROM_CURRENT_CD}"
1721 einfo "Please insert+mount the ${!var} cdrom now !"
1722 fi
1723 fi 1002 fi
1724 showedmsg=1 1003 shift 1;;
1725 fi 1004 esac
1726 einfo "Press return to scan for the cd again"
1727 einfo "or hit CTRL+C to abort the emerge."
1728 echo
1729 if [[ ${showjolietmsg} -eq 0 ]] ; then
1730 showjolietmsg=1
1731 else
1732 ewarn "If you are having trouble with the detection"
1733 ewarn "of your CD, it is possible that you do not have"
1734 ewarn "Joliet support enabled in your kernel. Please"
1735 ewarn "check that CONFIG_JOLIET is enabled in your kernel."
1736 ebeep 5
1737 fi
1738 read || die "something is screwed with your system"
1739 done 1005 done
1006 if [[ ${funcname} == newicon ]] ; then
1007 newins "$@"
1008 fi
1009 ) || die
1010}
1011
1012# @FUNCTION: doicon
1013# @USAGE: [options] <icons>
1014# @DESCRIPTION:
1015# Install icon into the icon directory /usr/share/icons or into
1016# /usr/share/pixmaps if "--size" is not set.
1017# This is useful in conjunction with creating desktop/menu files.
1018#
1019# @CODE
1020# options:
1021# -s, --size
1022# !!! must specify to install into /usr/share/icons/... !!!
1023# size of the icon, like 48 or 48x48
1024# supported icon sizes are:
1025# 16 22 24 32 36 48 64 72 96 128 192 256 scalable
1026# -c, --context
1027# defaults to "apps"
1028# -t, --theme
1029# defaults to "hicolor"
1030#
1031# icons: list of icons
1032#
1033# example 1: doicon foobar.png fuqbar.svg suckbar.png
1034# results in: insinto /usr/share/pixmaps
1035# doins foobar.png fuqbar.svg suckbar.png
1036#
1037# example 2: doicon -s 48 foobar.png fuqbar.png blobbar.png
1038# results in: insinto /usr/share/icons/hicolor/48x48/apps
1039# doins foobar.png fuqbar.png blobbar.png
1040# @CODE
1041doicon() {
1042 _iconins ${FUNCNAME} "$@"
1043}
1044
1045# @FUNCTION: newicon
1046# @USAGE: [options] <icon> <newname>
1047# @DESCRIPTION:
1048# Like doicon, install the specified icon as newname.
1049#
1050# @CODE
1051# example 1: newicon foobar.png NEWNAME.png
1052# results in: insinto /usr/share/pixmaps
1053# newins foobar.png NEWNAME.png
1054#
1055# example 2: newicon -s 48 foobar.png NEWNAME.png
1056# results in: insinto /usr/share/icons/hicolor/48x48/apps
1057# newins foobar.png NEWNAME.png
1058# @CODE
1059newicon() {
1060 _iconins ${FUNCNAME} "$@"
1740} 1061}
1741 1062
1742# @FUNCTION: strip-linguas 1063# @FUNCTION: strip-linguas
1743# @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>] 1064# @USAGE: [<allow LINGUAS>|<-i|-u> <directories of .po files>]
1744# @DESCRIPTION: 1065# @DESCRIPTION:
1782 else 1103 else
1783 nols="${nols} ${f}" 1104 nols="${nols} ${f}"
1784 fi 1105 fi
1785 done 1106 done
1786 [[ -n ${nols} ]] \ 1107 [[ -n ${nols} ]] \
1787 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols} 1108 && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1788 export LINGUAS=${newls:1} 1109 export LINGUAS=${newls:1}
1789} 1110}
1790 1111
1791# @FUNCTION: preserve_old_lib 1112# @FUNCTION: preserve_old_lib
1792# @USAGE: <libs to preserve> [more libs] 1113# @USAGE: <libs to preserve> [more libs]
1840 ewarn "the libraries are not being removed. You need to run revdep-rebuild" 1161 ewarn "the libraries are not being removed. You need to run revdep-rebuild"
1841 ewarn "in order to remove these old dependencies. If you do not have this" 1162 ewarn "in order to remove these old dependencies. If you do not have this"
1842 ewarn "helper program, simply emerge the 'gentoolkit' package." 1163 ewarn "helper program, simply emerge the 'gentoolkit' package."
1843 ewarn 1164 ewarn
1844 fi 1165 fi
1845 # temp hack for #348634 #357225
1846 [[ ${PN} == "mpfr" ]] && lib=${lib##*/}
1847 ewarn " # revdep-rebuild --library '${lib}'" 1166 ewarn " # revdep-rebuild --library '${lib}' && rm '${lib}'"
1848 done 1167 done
1849 if [[ ${notice} -eq 1 ]] ; then
1850 ewarn
1851 ewarn "Once you've finished running revdep-rebuild, it should be safe to"
1852 ewarn "delete the old libraries. Here is a copy & paste for the lazy:"
1853 for lib in "$@" ; do
1854 ewarn " # rm '${lib}'"
1855 done
1856 fi
1857} 1168}
1858 1169
1859# @FUNCTION: built_with_use 1170# @FUNCTION: built_with_use
1860# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags> 1171# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1861# @DESCRIPTION: 1172# @DESCRIPTION:
1956# http://bugs.gentoo.org/73450 1267# http://bugs.gentoo.org/73450
1957epunt_cxx() { 1268epunt_cxx() {
1958 local dir=$1 1269 local dir=$1
1959 [[ -z ${dir} ]] && dir=${S} 1270 [[ -z ${dir} ]] && dir=${S}
1960 ebegin "Removing useless C++ checks" 1271 ebegin "Removing useless C++ checks"
1961 local f 1272 local f any_found
1962 find "${dir}" -name configure | while read f ; do 1273 find "${dir}" -name configure | while read f ; do
1963 patch --no-backup-if-mismatch -p0 "${f}" "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null 1274 patch --no-backup-if-mismatch -p0 "${f}" \
1275 "${PORTDIR}/eclass/ELT-patches/nocxx/nocxx.patch" > /dev/null \
1276 && any_found=1
1964 done 1277 done
1278
1279 if [[ -z ${any_found} ]]; then
1280 eqawarn "epunt_cxx called unnecessarily (no C++ checks to punt)."
1281 fi
1965 eend 0 1282 eend 0
1966} 1283}
1967 1284
1968# @FUNCTION: make_wrapper 1285# @FUNCTION: make_wrapper
1969# @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath] 1286# @USAGE: <wrapper> <target> [chdir] [libpaths] [installpath]
2026 case ${opt} in 1343 case ${opt} in
2027 -a) return $(( r != 0 )) ;; 1344 -a) return $(( r != 0 )) ;;
2028 -o) return $(( r == $# )) ;; 1345 -o) return $(( r == $# )) ;;
2029 esac 1346 esac
2030} 1347}
1348
1349# @FUNCTION: in_iuse
1350# @USAGE: <flag>
1351# @DESCRIPTION:
1352# Determines whether the given flag is in IUSE. Strips IUSE default prefixes
1353# as necessary.
1354#
1355# Note that this function should not be used in the global scope.
1356in_iuse() {
1357 debug-print-function ${FUNCNAME} "${@}"
1358 [[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()"
1359
1360 local flag=${1}
1361 local liuse=( ${IUSE} )
1362
1363 has "${flag}" "${liuse[@]#[+-]}"
1364}
1365
1366# @FUNCTION: use_if_iuse
1367# @USAGE: <flag>
1368# @DESCRIPTION:
1369# Return true if the given flag is in USE and IUSE.
1370#
1371# Note that this function should not be used in the global scope.
1372use_if_iuse() {
1373 in_iuse $1 || return 1
1374 use $1
1375}
1376
1377# @FUNCTION: usex
1378# @USAGE: <USE flag> [true output] [false output] [true suffix] [false suffix]
1379# @DESCRIPTION:
1380# Proxy to declare usex for package managers or EAPIs that do not provide it
1381# and use the package manager implementation when available (i.e. EAPI >= 5).
1382# If USE flag is set, echo [true output][true suffix] (defaults to "yes"),
1383# otherwise echo [false output][false suffix] (defaults to "no").
1384if has "${EAPI:-0}" 0 1 2 3 4; then
1385 usex() { use "$1" && echo "${2-yes}$4" || echo "${3-no}$5" ; } #382963
1386fi
1387
1388# @FUNCTION: prune_libtool_files
1389# @USAGE: [--all|--modules]
1390# @DESCRIPTION:
1391# Locate unnecessary libtool files (.la) and libtool static archives
1392# (.a) and remove them from installation image.
1393#
1394# By default, .la files are removed whenever the static linkage can
1395# either be performed using pkg-config or doesn't introduce additional
1396# flags.
1397#
1398# If '--modules' argument is passed, .la files for modules (plugins) are
1399# removed as well. This is usually useful when the package installs
1400# plugins and the plugin loader does not use .la files.
1401#
1402# If '--all' argument is passed, all .la files are removed without
1403# performing any heuristic on them. You shouldn't ever use that,
1404# and instead report a bug in the algorithm instead.
1405#
1406# The .a files are only removed whenever corresponding .la files state
1407# that they should not be linked to, i.e. whenever these files
1408# correspond to plugins.
1409#
1410# Note: if your package installs both static libraries and .pc files,
1411# you need to add pkg-config to your DEPEND.
1412prune_libtool_files() {
1413 debug-print-function ${FUNCNAME} "$@"
1414
1415 local removing_all removing_modules opt
1416 for opt; do
1417 case "${opt}" in
1418 --all)
1419 removing_all=1
1420 removing_modules=1
1421 ;;
1422 --modules)
1423 removing_modules=1
1424 ;;
1425 *)
1426 die "Invalid argument to ${FUNCNAME}(): ${opt}"
1427 esac
1428 done
1429
1430 local f
1431 local queue=()
1432 while IFS= read -r -d '' f; do # for all .la files
1433 local archivefile=${f/%.la/.a}
1434
1435 [[ ${f} != ${archivefile} ]] || die 'regex sanity check failed'
1436
1437 local reason pkgconfig_scanned
1438
1439 # Remove static libs we're not supposed to link against.
1440 if grep -q '^shouldnotlink=yes$' "${f}"; then
1441 if [[ -f ${archivefile} ]]; then
1442 einfo "Removing unnecessary ${archivefile#${D%/}} (static plugin)"
1443 queue+=( "${archivefile}" )
1444 fi
1445
1446 # The .la file may be used by a module loader, so avoid removing it
1447 # unless explicitly requested.
1448 if [[ ${removing_modules} ]]; then
1449 reason='module'
1450 fi
1451
1452 # Remove .la files when:
1453 # - user explicitly wants us to remove all .la files,
1454 # - respective static archive doesn't exist,
1455 # - they are covered by a .pc file already,
1456 # - they don't provide any new information (no libs & no flags).
1457
1458 elif [[ ${removing_all} ]]; then
1459 reason='requested'
1460 elif [[ ! -f ${archivefile} ]]; then
1461 reason='no static archive'
1462 elif [[ ! $(sed -nre \
1463 "s/^(dependency_libs|inherited_linker_flags)='(.*)'$/\2/p" \
1464 "${f}") ]]; then
1465 reason='no libs & flags'
1466 else
1467 if [[ ! ${pkgconfig_scanned} ]]; then
1468 # Create a list of all .pc-covered libs.
1469 local pc_libs=()
1470 if [[ ! ${removing_all} ]]; then
1471 local pc
1472 local tf=${T}/prune-lt-files.pc
1473 local pkgconf=$(tc-getPKG_CONFIG)
1474
1475 while IFS= read -r -d '' pc; do # for all .pc files
1476 local arg
1477
1478 sed -e '/^Requires:/d' "${pc}" > "${tf}"
1479 for arg in $("${pkgconf}" --libs "${tf}"); do
1480 [[ ${arg} == -l* ]] && pc_libs+=( lib${arg#-l}.la )
1481 done
1482 done < <(find "${D}" -type f -name '*.pc' -print0)
1483
1484 rm -f "${tf}"
1485 fi
1486
1487 pkgconfig_scanned=1
1488 fi
1489
1490 has "${f##*/}" "${pc_libs[@]}" && reason='covered by .pc'
1491 fi
1492
1493 if [[ ${reason} ]]; then
1494 einfo "Removing unnecessary ${f#${D%/}} (${reason})"
1495 queue+=( "${f}" )
1496 fi
1497 done < <(find "${D}" -xtype f -name '*.la' -print0)
1498
1499 if [[ ${queue[@]} ]]; then
1500 rm -f "${queue[@]}"
1501 fi
1502}
1503
1504check_license() { die "you no longer need this as portage supports ACCEPT_LICENSE itself"; }
1505
1506fi

Legend:
Removed from v.1.363  
changed lines
  Added in v.1.410

  ViewVC Help
Powered by ViewVC 1.1.20