aadfac17dca0f7f14b1acf928a3011ba0da7b5a8
[portage.git] / bin / phase-helpers.sh
1 #!/bin/bash
2 # Copyright 1999-2011 Gentoo Foundation
3 # Distributed under the terms of the GNU General Public License v2
4
5 export DESTTREE=/usr
6 export INSDESTTREE=""
7 export _E_EXEDESTTREE_=""
8 export _E_DOCDESTTREE_=""
9 export INSOPTIONS="-m0644"
10 export EXEOPTIONS="-m0755"
11 export LIBOPTIONS="-m0644"
12 export DIROPTIONS="-m0755"
13 export MOPREFIX=${PN}
14 declare -a PORTAGE_DOCOMPRESS=( /usr/share/{doc,info,man} )
15 declare -a PORTAGE_DOCOMPRESS_SKIP=( /usr/share/doc/${PF}/html )
16
17 into() {
18         if [ "$1" == "/" ]; then
19                 export DESTTREE=""
20         else
21                 export DESTTREE=$1
22                 [[ " ${USE} " == *" prefix "* ]] || \
23                         case "$EAPI" in 0|1|2) local ED=${D} ;; esac
24                 if [ ! -d "${ED}${DESTTREE}" ]; then
25                         install -d "${ED}${DESTTREE}"
26                         local ret=$?
27                         if [[ $ret -ne 0 ]] ; then
28                                 helpers_die "${FUNCNAME[0]} failed"
29                                 return $ret
30                         fi
31                 fi
32         fi
33 }
34
35 insinto() {
36         if [ "$1" == "/" ]; then
37                 export INSDESTTREE=""
38         else
39                 export INSDESTTREE=$1
40                 [[ " ${USE} " == *" prefix "* ]] || \
41                         case "$EAPI" in 0|1|2) local ED=${D} ;; esac
42                 if [ ! -d "${ED}${INSDESTTREE}" ]; then
43                         install -d "${ED}${INSDESTTREE}"
44                         local ret=$?
45                         if [[ $ret -ne 0 ]] ; then
46                                 helpers_die "${FUNCNAME[0]} failed"
47                                 return $ret
48                         fi
49                 fi
50         fi
51 }
52
53 exeinto() {
54         if [ "$1" == "/" ]; then
55                 export _E_EXEDESTTREE_=""
56         else
57                 export _E_EXEDESTTREE_="$1"
58                 [[ " ${USE} " == *" prefix "* ]] || \
59                         case "$EAPI" in 0|1|2) local ED=${D} ;; esac
60                 if [ ! -d "${ED}${_E_EXEDESTTREE_}" ]; then
61                         install -d "${ED}${_E_EXEDESTTREE_}"
62                         local ret=$?
63                         if [[ $ret -ne 0 ]] ; then
64                                 helpers_die "${FUNCNAME[0]} failed"
65                                 return $ret
66                         fi
67                 fi
68         fi
69 }
70
71 docinto() {
72         if [ "$1" == "/" ]; then
73                 export _E_DOCDESTTREE_=""
74         else
75                 export _E_DOCDESTTREE_="$1"
76                 [[ " ${USE} " == *" prefix "* ]] || \
77                         case "$EAPI" in 0|1|2) local ED=${D} ;; esac
78                 if [ ! -d "${ED}usr/share/doc/${PF}/${_E_DOCDESTTREE_}" ]; then
79                         install -d "${ED}usr/share/doc/${PF}/${_E_DOCDESTTREE_}"
80                         local ret=$?
81                         if [[ $ret -ne 0 ]] ; then
82                                 helpers_die "${FUNCNAME[0]} failed"
83                                 return $ret
84                         fi
85                 fi
86         fi
87 }
88
89 insopts() {
90         export INSOPTIONS="$@"
91
92         # `install` should never be called with '-s' ...
93         has -s ${INSOPTIONS} && die "Never call insopts() with -s"
94 }
95
96 diropts() {
97         export DIROPTIONS="$@"
98 }
99
100 exeopts() {
101         export EXEOPTIONS="$@"
102
103         # `install` should never be called with '-s' ...
104         has -s ${EXEOPTIONS} && die "Never call exeopts() with -s"
105 }
106
107 libopts() {
108         export LIBOPTIONS="$@"
109
110         # `install` should never be called with '-s' ...
111         has -s ${LIBOPTIONS} && die "Never call libopts() with -s"
112 }
113
114 docompress() {
115         has "${EAPI}" 0 1 2 3 && die "'docompress' not supported in this EAPI"
116
117         local f g
118         if [[ $1 = "-x" ]]; then
119                 shift
120                 for f; do
121                         f=$(strip_duplicate_slashes "${f}"); f=${f%/}
122                         [[ ${f:0:1} = / ]] || f="/${f}"
123                         for g in "${PORTAGE_DOCOMPRESS_SKIP[@]}"; do
124                                 [[ ${f} = "${g}" ]] && continue 2
125                         done
126                         PORTAGE_DOCOMPRESS_SKIP[${#PORTAGE_DOCOMPRESS_SKIP[@]}]=${f}
127                 done
128         else
129                 for f; do
130                         f=$(strip_duplicate_slashes "${f}"); f=${f%/}
131                         [[ ${f:0:1} = / ]] || f="/${f}"
132                         for g in "${PORTAGE_DOCOMPRESS[@]}"; do
133                                 [[ ${f} = "${g}" ]] && continue 2
134                         done
135                         PORTAGE_DOCOMPRESS[${#PORTAGE_DOCOMPRESS[@]}]=${f}
136                 done
137         fi
138 }
139
140 # adds ".keep" files so that dirs aren't auto-cleaned
141 keepdir() {
142         dodir "$@"
143         local x
144         [[ " ${USE} " == *" prefix "* ]] || \
145                 case "$EAPI" in 0|1|2) local ED=${D} ;; esac
146         if [ "$1" == "-R" ] || [ "$1" == "-r" ]; then
147                 shift
148                 find "$@" -type d -printf "${ED}%p/.keep_${CATEGORY}_${PN}-${SLOT}\n" \
149                         | tr "\n" "\0" | \
150                         while read -r -d $'\0' ; do
151                                 >> "$REPLY" || \
152                                         die "Failed to recursively create .keep files"
153                         done
154         else
155                 for x in "$@"; do
156                         >> "${ED}${x}/.keep_${CATEGORY}_${PN}-${SLOT}" || \
157                                 die "Failed to create .keep in ${ED}${x}"
158                 done
159         fi
160 }
161
162
163 useq() {
164         has $EBUILD_PHASE prerm postrm || eqawarn \
165                 "QA Notice: The 'useq' function is deprecated (replaced by 'use')"
166         use ${1}
167 }
168
169 usev() {
170         if use ${1}; then
171                 echo "${1#!}"
172                 return 0
173         fi
174         return 1
175 }
176
177 use() {
178         local u=$1
179         local found=0
180
181         # if we got something like '!flag', then invert the return value
182         if [[ ${u:0:1} == "!" ]] ; then
183                 u=${u:1}
184                 found=1
185         fi
186
187         if [[ $EBUILD_PHASE = depend ]] ; then
188                 # TODO: Add a registration interface for eclasses to register
189                 # any number of phase hooks, so that global scope eclass
190                 # initialization can by migrated to phase hooks in new EAPIs.
191                 # Example: add_phase_hook before pkg_setup $ECLASS_pre_pkg_setup
192                 #if [[ -n $EAPI ]] && ! has "$EAPI" 0 1 2 3 ; then
193                 #       die "use() called during invalid phase: $EBUILD_PHASE"
194                 #fi
195                 true
196
197         # Make sure we have this USE flag in IUSE
198         elif [[ -n $PORTAGE_IUSE && -n $EBUILD_PHASE ]] ; then
199                 [[ $u =~ $PORTAGE_IUSE ]] || \
200                         eqawarn "QA Notice: USE Flag '${u}' not" \
201                                 "in IUSE for ${CATEGORY}/${PF}"
202         fi
203
204         if has ${u} ${USE} ; then
205                 return ${found}
206         else
207                 return $((!found))
208         fi
209 }
210
211 use_with() {
212         if [ -z "$1" ]; then
213                 echo "!!! use_with() called without a parameter." >&2
214                 echo "!!! use_with <USEFLAG> [<flagname> [value]]" >&2
215                 return 1
216         fi
217
218         if ! has "${EAPI:-0}" 0 1 2 3 ; then
219                 local UW_SUFFIX=${3+=$3}
220         else
221                 local UW_SUFFIX=${3:+=$3}
222         fi
223         local UWORD=${2:-$1}
224
225         if use $1; then
226                 echo "--with-${UWORD}${UW_SUFFIX}"
227         else
228                 echo "--without-${UWORD}"
229         fi
230         return 0
231 }
232
233 use_enable() {
234         if [ -z "$1" ]; then
235                 echo "!!! use_enable() called without a parameter." >&2
236                 echo "!!! use_enable <USEFLAG> [<flagname> [value]]" >&2
237                 return 1
238         fi
239
240         if ! has "${EAPI:-0}" 0 1 2 3 ; then
241                 local UE_SUFFIX=${3+=$3}
242         else
243                 local UE_SUFFIX=${3:+=$3}
244         fi
245         local UWORD=${2:-$1}
246
247         if use $1; then
248                 echo "--enable-${UWORD}${UE_SUFFIX}"
249         else
250                 echo "--disable-${UWORD}"
251         fi
252         return 0
253 }
254
255 unpack() {
256         local srcdir
257         local x
258         local y
259         local myfail
260         local eapi=${EAPI:-0}
261         [ -z "$*" ] && die "Nothing passed to the 'unpack' command"
262
263         for x in "$@"; do
264                 vecho ">>> Unpacking ${x} to ${PWD}"
265                 y=${x%.*}
266                 y=${y##*.}
267
268                 if [[ ${x} == "./"* ]] ; then
269                         srcdir=""
270                 elif [[ ${x} == ${DISTDIR%/}/* ]] ; then
271                         die "Arguments to unpack() cannot begin with \${DISTDIR}."
272                 elif [[ ${x} == "/"* ]] ; then
273                         die "Arguments to unpack() cannot be absolute"
274                 else
275                         srcdir="${DISTDIR}/"
276                 fi
277                 [[ ! -s ${srcdir}${x} ]] && die "${x} does not exist"
278
279                 _unpack_tar() {
280                         if [ "${y}" == "tar" ]; then
281                                 $1 -c -- "$srcdir$x" | tar xof -
282                                 assert_sigpipe_ok "$myfail"
283                         else
284                                 local cwd_dest=${x##*/}
285                                 cwd_dest=${cwd_dest%.*}
286                                 $1 -c -- "${srcdir}${x}" > "${cwd_dest}" || die "$myfail"
287                         fi
288                 }
289
290                 myfail="failure unpacking ${x}"
291                 case "${x##*.}" in
292                         tar)
293                                 tar xof "$srcdir$x" || die "$myfail"
294                                 ;;
295                         tgz)
296                                 tar xozf "$srcdir$x" || die "$myfail"
297                                 ;;
298                         tbz|tbz2)
299                                 ${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d} -c -- "$srcdir$x" | tar xof -
300                                 assert_sigpipe_ok "$myfail"
301                                 ;;
302                         ZIP|zip|jar)
303                                 # unzip will interactively prompt under some error conditions,
304                                 # as reported in bug #336285
305                                 ( while true ; do echo n || break ; done ) | \
306                                 unzip -qo "${srcdir}${x}" || die "$myfail"
307                                 ;;
308                         gz|Z|z)
309                                 _unpack_tar "gzip -d"
310                                 ;;
311                         bz2|bz)
312                                 _unpack_tar "${PORTAGE_BUNZIP2_COMMAND:-${PORTAGE_BZIP2_COMMAND} -d}"
313                                 ;;
314                         7Z|7z)
315                                 local my_output
316                                 my_output="$(7z x -y "${srcdir}${x}")"
317                                 if [ $? -ne 0 ]; then
318                                         echo "${my_output}" >&2
319                                         die "$myfail"
320                                 fi
321                                 ;;
322                         RAR|rar)
323                                 unrar x -idq -o+ "${srcdir}${x}" || die "$myfail"
324                                 ;;
325                         LHa|LHA|lha|lzh)
326                                 lha xfq "${srcdir}${x}" || die "$myfail"
327                                 ;;
328                         a)
329                                 ar x "${srcdir}${x}" || die "$myfail"
330                                 ;;
331                         deb)
332                                 # Unpacking .deb archives can not always be done with
333                                 # `ar`.  For instance on AIX this doesn't work out.  If
334                                 # we have `deb2targz` installed, prefer it over `ar` for
335                                 # that reason.  We just make sure on AIX `deb2targz` is
336                                 # installed.
337                                 if type -P deb2targz > /dev/null; then
338                                         y=${x##*/}
339                                         local created_symlink=0
340                                         if [ ! "$srcdir$x" -ef "$y" ] ; then
341                                                 # deb2targz always extracts into the same directory as
342                                                 # the source file, so create a symlink in the current
343                                                 # working directory if necessary.
344                                                 ln -sf "$srcdir$x" "$y" || die "$myfail"
345                                                 created_symlink=1
346                                         fi
347                                         deb2targz "$y" || die "$myfail"
348                                         if [ $created_symlink = 1 ] ; then
349                                                 # Clean up the symlink so the ebuild
350                                                 # doesn't inadvertently install it.
351                                                 rm -f "$y"
352                                         fi
353                                         mv -f "${y%.deb}".tar.gz data.tar.gz || die "$myfail"
354                                 else
355                                         ar x "$srcdir$x" || die "$myfail"
356                                 fi
357                                 ;;
358                         lzma)
359                                 _unpack_tar "lzma -d"
360                                 ;;
361                         xz)
362                                 if has $eapi 0 1 2 ; then
363                                         vecho "unpack ${x}: file format not recognized. Ignoring."
364                                 else
365                                         _unpack_tar "xz -d"
366                                 fi
367                                 ;;
368                         *)
369                                 vecho "unpack ${x}: file format not recognized. Ignoring."
370                                 ;;
371                 esac
372         done
373         # Do not chmod '.' since it's probably ${WORKDIR} and PORTAGE_WORKDIR_MODE
374         # should be preserved.
375         find . -mindepth 1 -maxdepth 1 ! -type l -print0 | \
376                 ${XARGS} -0 chmod -fR a+rX,u+w,g-w,o-w
377 }
378
379 econf() {
380         local x
381
382         [[ " ${USE} " == *" prefix "* ]] || \
383                 case "$EAPI" in 0|1|2) local EPREFIX= ;; esac
384
385         _hasg() {
386                 local x s=$1
387                 shift
388                 for x ; do [[ ${x} == ${s} ]] && echo "${x}" && return 0 ; done
389                 return 1
390         }
391
392         _hasgq() { _hasg "$@" >/dev/null ; }
393
394         local phase_func=$(_ebuild_arg_to_phase "$EAPI" "$EBUILD_PHASE")
395         if [[ -n $phase_func ]] ; then
396                 if has "$EAPI" 0 1 ; then
397                         [[ $phase_func != src_compile ]] && \
398                                 eqawarn "QA Notice: econf called in" \
399                                         "$phase_func instead of src_compile"
400                 else
401                         [[ $phase_func != src_configure ]] && \
402                                 eqawarn "QA Notice: econf called in" \
403                                         "$phase_func instead of src_configure"
404                 fi
405         fi
406
407         : ${ECONF_SOURCE:=.}
408         if [ -x "${ECONF_SOURCE}/configure" ]; then
409                 if [[ -n $CONFIG_SHELL && \
410                         "$(head -n1 "$ECONF_SOURCE/configure")" =~ ^'#!'[[:space:]]*/bin/sh([[:space:]]|$) ]] ; then
411                         sed -e "1s:^#![[:space:]]*/bin/sh:#!$CONFIG_SHELL:" -i "$ECONF_SOURCE/configure" || \
412                                 die "Substition of shebang in '$ECONF_SOURCE/configure' failed"
413                 fi
414                 if [ -e "${EPREFIX}"/usr/share/gnuconfig/ ]; then
415                         find "${WORKDIR}" -type f '(' \
416                         -name config.guess -o -name config.sub ')' -print0 | \
417                         while read -r -d $'\0' x ; do
418                                 vecho " * econf: updating ${x/${WORKDIR}\/} with ${EPREFIX}/usr/share/gnuconfig/${x##*/}"
419                                 cp -f "${EPREFIX}"/usr/share/gnuconfig/"${x##*/}" "${x}"
420                         done
421                 fi
422
423                 # EAPI=4 adds --disable-dependency-tracking to econf
424                 if ! has "$EAPI" 0 1 2 3 3_pre2 && \
425                         "${ECONF_SOURCE}/configure" --help 2>/dev/null | \
426                         grep -q disable-dependency-tracking ; then
427                         set -- --disable-dependency-tracking "$@"
428                 fi
429
430                 # if the profile defines a location to install libs to aside from default, pass it on.
431                 # if the ebuild passes in --libdir, they're responsible for the conf_libdir fun.
432                 local CONF_LIBDIR LIBDIR_VAR="LIBDIR_${ABI}"
433                 if [[ -n ${ABI} && -n ${!LIBDIR_VAR} ]] ; then
434                         CONF_LIBDIR=${!LIBDIR_VAR}
435                 fi
436                 if [[ -n ${CONF_LIBDIR} ]] && ! _hasgq --libdir=\* "$@" ; then
437                         export CONF_PREFIX=$(_hasg --exec-prefix=\* "$@")
438                         [[ -z ${CONF_PREFIX} ]] && CONF_PREFIX=$(_hasg --prefix=\* "$@")
439                         : ${CONF_PREFIX:=${EPREFIX}/usr}
440                         CONF_PREFIX=${CONF_PREFIX#*=}
441                         [[ ${CONF_PREFIX} != /* ]] && CONF_PREFIX="/${CONF_PREFIX}"
442                         [[ ${CONF_LIBDIR} != /* ]] && CONF_LIBDIR="/${CONF_LIBDIR}"
443                         set -- --libdir="$(strip_duplicate_slashes ${CONF_PREFIX}${CONF_LIBDIR})" "$@"
444                 fi
445
446                 set -- \
447                         --prefix="${EPREFIX}"/usr \
448                         ${CBUILD:+--build=${CBUILD}} \
449                         --host=${CHOST} \
450                         ${CTARGET:+--target=${CTARGET}} \
451                         --mandir="${EPREFIX}"/usr/share/man \
452                         --infodir="${EPREFIX}"/usr/share/info \
453                         --datadir="${EPREFIX}"/usr/share \
454                         --sysconfdir="${EPREFIX}"/etc \
455                         --localstatedir="${EPREFIX}"/var/lib \
456                         "$@" \
457                         ${EXTRA_ECONF}
458                 vecho "${ECONF_SOURCE}/configure" "$@"
459
460                 if ! "${ECONF_SOURCE}/configure" "$@" ; then
461
462                         if [ -s config.log ]; then
463                                 echo
464                                 echo "!!! Please attach the following file when seeking support:"
465                                 echo "!!! ${PWD}/config.log"
466                         fi
467                         die "econf failed"
468                 fi
469         elif [ -f "${ECONF_SOURCE}/configure" ]; then
470                 die "configure is not executable"
471         else
472                 die "no configure script found"
473         fi
474 }
475
476 einstall() {
477         # CONF_PREFIX is only set if they didn't pass in libdir above.
478         local LOCAL_EXTRA_EINSTALL="${EXTRA_EINSTALL}"
479         [[ " ${USE} " == *" prefix "* ]] || \
480                 case "$EAPI" in 0|1|2) local ED=${D} ;; esac
481         LIBDIR_VAR="LIBDIR_${ABI}"
482         if [ -n "${ABI}" -a -n "${!LIBDIR_VAR}" ]; then
483                 CONF_LIBDIR="${!LIBDIR_VAR}"
484         fi
485         unset LIBDIR_VAR
486         if [ -n "${CONF_LIBDIR}" ] && [ "${CONF_PREFIX:+set}" = set ]; then
487                 EI_DESTLIBDIR="${D}/${CONF_PREFIX}/${CONF_LIBDIR}"
488                 EI_DESTLIBDIR="$(strip_duplicate_slashes ${EI_DESTLIBDIR})"
489                 LOCAL_EXTRA_EINSTALL="libdir=${EI_DESTLIBDIR} ${LOCAL_EXTRA_EINSTALL}"
490                 unset EI_DESTLIBDIR
491         fi
492
493         if [ -f ./[mM]akefile -o -f ./GNUmakefile ] ; then
494                 if [ "${PORTAGE_DEBUG}" == "1" ]; then
495                         ${MAKE:-make} -n prefix="${ED}usr" \
496                                 datadir="${ED}usr/share" \
497                                 infodir="${ED}usr/share/info" \
498                                 localstatedir="${ED}var/lib" \
499                                 mandir="${ED}usr/share/man" \
500                                 sysconfdir="${ED}etc" \
501                                 ${LOCAL_EXTRA_EINSTALL} \
502                                 ${MAKEOPTS} ${EXTRA_EMAKE} -j1 \
503                                 "$@" install
504                 fi
505                 ${MAKE:-make} prefix="${ED}usr" \
506                         datadir="${ED}usr/share" \
507                         infodir="${ED}usr/share/info" \
508                         localstatedir="${ED}var/lib" \
509                         mandir="${ED}usr/share/man" \
510                         sysconfdir="${ED}etc" \
511                         ${LOCAL_EXTRA_EINSTALL} \
512                         ${MAKEOPTS} ${EXTRA_EMAKE} -j1 \
513                         "$@" install || die "einstall failed"
514         else
515                 die "no Makefile found"
516         fi
517 }
518
519 _eapi0_pkg_nofetch() {
520         [ -z "${SRC_URI}" ] && return
521
522         elog "The following are listed in SRC_URI for ${PN}:"
523         local x
524         for x in $(echo ${SRC_URI}); do
525                 elog "   ${x}"
526         done
527 }
528
529 _eapi0_src_unpack() {
530         [[ -n ${A} ]] && unpack ${A}
531 }
532
533 _eapi0_src_compile() {
534         if [ -x ./configure ] ; then
535                 econf
536         fi
537         _eapi2_src_compile
538 }
539
540 _eapi0_src_test() {
541         # Since we don't want emake's automatic die
542         # support (EAPI 4 and later), and we also don't
543         # want the warning messages that it produces if
544         # we call it in 'nonfatal' mode, we use emake_cmd
545         # to emulate the desired parts of emake behavior.
546         local emake_cmd="${MAKE:-make} ${MAKEOPTS} ${EXTRA_EMAKE}"
547         if $emake_cmd -j1 check -n &> /dev/null; then
548                 vecho ">>> Test phase [check]: ${CATEGORY}/${PF}"
549                 if ! $emake_cmd -j1 check; then
550                         has test $FEATURES && die "Make check failed. See above for details."
551                         has test $FEATURES || eerror "Make check failed. See above for details."
552                 fi
553         elif $emake_cmd -j1 test -n &> /dev/null; then
554                 vecho ">>> Test phase [test]: ${CATEGORY}/${PF}"
555                 if ! $emake_cmd -j1 test; then
556                         has test $FEATURES && die "Make test failed. See above for details."
557                         has test $FEATURES || eerror "Make test failed. See above for details."
558                 fi
559         else
560                 vecho ">>> Test phase [none]: ${CATEGORY}/${PF}"
561         fi
562 }
563
564 _eapi1_src_compile() {
565         _eapi2_src_configure
566         _eapi2_src_compile
567 }
568
569 _eapi2_src_configure() {
570         if [[ -x ${ECONF_SOURCE:-.}/configure ]] ; then
571                 econf
572         fi
573 }
574
575 _eapi2_src_compile() {
576         if [ -f Makefile ] || [ -f GNUmakefile ] || [ -f makefile ]; then
577                 emake || die "emake failed"
578         fi
579 }
580
581 _eapi4_src_install() {
582         if [[ -f Makefile || -f GNUmakefile || -f makefile ]] ; then
583                 emake DESTDIR="${D}" install
584         fi
585
586         if ! declare -p DOCS &>/dev/null ; then
587                 local d
588                 for d in README* ChangeLog AUTHORS NEWS TODO CHANGES \
589                                 THANKS BUGS FAQ CREDITS CHANGELOG ; do
590                         [[ -s "${d}" ]] && dodoc "${d}"
591                 done
592         elif [[ $(declare -p DOCS) == "declare -a "* ]] ; then
593                 dodoc "${DOCS[@]}"
594         else
595                 dodoc ${DOCS}
596         fi
597 }
598
599 # @FUNCTION: has_version
600 # @USAGE: <DEPEND ATOM>
601 # @DESCRIPTION:
602 # Return true if given package is installed. Otherwise return false.
603 # Callers may override the ROOT variable in order to match packages from an
604 # alternative ROOT.
605 has_version() {
606
607         local eroot
608         case "$EAPI" in
609                 0|1|2)
610                         [[ " ${USE} " == *" prefix "* ]] && \
611                                 eroot=${ROOT%/}${EPREFIX}/ || eroot=${ROOT}
612                         ;;
613                 *)
614                         eroot=${ROOT%/}${EPREFIX}/
615                         ;;
616         esac
617         if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
618                 "$PORTAGE_BIN_PATH"/ebuild-ipc has_version "${eroot}" "$1"
619         else
620                 PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
621                 "${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" has_version "${eroot}" "$1"
622         fi
623         local retval=$?
624         case "${retval}" in
625                 0|1)
626                         return ${retval}
627                         ;;
628                 *)
629                         die "unexpected portageq exit code: ${retval}"
630                         ;;
631         esac
632 }
633
634 # @FUNCTION: best_version
635 # @USAGE: <DEPEND ATOM>
636 # @DESCRIPTION:
637 # Returns the best/most-current match.
638 # Callers may override the ROOT variable in order to match packages from an
639 # alternative ROOT.
640 best_version() {
641
642         local eroot
643         case "$EAPI" in
644                 0|1|2)
645                         [[ " ${USE} " == *" prefix "* ]] && \
646                                 eroot=${ROOT%/}${EPREFIX}/ || eroot=${ROOT}
647                         ;;
648                 *)
649                         eroot=${ROOT%/}${EPREFIX}/
650                         ;;
651         esac
652         if [[ -n $PORTAGE_IPC_DAEMON ]] ; then
653                 "$PORTAGE_BIN_PATH"/ebuild-ipc best_version "${eroot}" "$1"
654         else
655                 PYTHONPATH=${PORTAGE_PYM_PATH}${PYTHONPATH:+:}${PYTHONPATH} \
656                 "${PORTAGE_PYTHON:-/usr/bin/python}" "${PORTAGE_BIN_PATH}/portageq" best_version "${eroot}" "$1"
657         fi
658         local retval=$?
659         case "${retval}" in
660                 0|1)
661                         return ${retval}
662                         ;;
663                 *)
664                         die "unexpected portageq exit code: ${retval}"
665                         ;;
666         esac
667 }