Created
August 13, 2013 17:59
-
-
Save Wolfer/6223864 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Copyright 1999-2013 Gentoo Foundation | |
# Distributed under the terms of the GNU General Public License v2 | |
PORTAGE_BIN_PATH="${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}" | |
PORTAGE_PYM_PATH="${PORTAGE_PYM_PATH:-/usr/lib/portage/pym}" | |
# Prevent aliases from causing portage to act inappropriately. | |
# Make sure it's before everything so we don't mess aliases that follow. | |
unalias -a | |
source "${PORTAGE_BIN_PATH}/isolated-functions.sh" || exit 1 | |
if [[ $EBUILD_PHASE != depend ]] ; then | |
source "${PORTAGE_BIN_PATH}/phase-functions.sh" || die | |
source "${PORTAGE_BIN_PATH}/save-ebuild-env.sh" || die | |
source "${PORTAGE_BIN_PATH}/phase-helpers.sh" || die | |
source "${PORTAGE_BIN_PATH}/bashrc-functions.sh" || die | |
else | |
# These dummy functions are for things that are likely to be called | |
# in global scope, even though they are completely useless during | |
# the "depend" phase. | |
for x in diropts docompress exeopts get_KV insopts \ | |
keepdir KV_major KV_micro KV_minor KV_to_int \ | |
libopts register_die_hook register_success_hook \ | |
__strip_duplicate_slashes \ | |
use_with use_enable ; do | |
eval "${x}() { | |
if ___eapi_disallows_helpers_in_global_scope; then | |
die \"\${FUNCNAME}() calls are not allowed in global scope\" | |
fi | |
}" | |
done | |
# These dummy functions return false in non-strict EAPIs, in order to ensure that | |
# `use multislot` is false for the "depend" phase. | |
funcs="use useq usev" | |
___eapi_has_usex && funcs+=" usex" | |
for x in ${funcs} ; do | |
eval "${x}() { | |
if ___eapi_disallows_helpers_in_global_scope; then | |
die \"\${FUNCNAME}() calls are not allowed in global scope\" | |
else | |
return 1 | |
fi | |
}" | |
done | |
# These functions die because calls to them during the "depend" phase | |
# are considered to be severe QA violations. | |
funcs="best_version has_version portageq" | |
___eapi_has_master_repositories && funcs+=" master_repositories" | |
___eapi_has_repository_path && funcs+=" repository_path" | |
___eapi_has_available_eclasses && funcs+=" available_eclasses" | |
___eapi_has_eclass_path && funcs+=" eclass_path" | |
___eapi_has_license_path && funcs+=" license_path" | |
for x in ${funcs} ; do | |
eval "${x}() { die \"\${FUNCNAME}() calls are not allowed in global scope\"; }" | |
done | |
unset funcs x | |
fi | |
# Don't use sandbox's BASH_ENV for new shells because it does | |
# 'source /etc/profile' which can interfere with the build | |
# environment by modifying our PATH. | |
unset BASH_ENV | |
# This is just a temporary workaround for portage-9999 users since | |
# earlier portage versions do not detect a version change in this case | |
# (9999 to 9999) and therefore they try execute an incompatible version of | |
# ebuild.sh during the upgrade. | |
export PORTAGE_BZIP2_COMMAND=${PORTAGE_BZIP2_COMMAND:-bzip2} | |
# These two functions wrap sourcing and calling respectively. At present they | |
# perform a qa check to make sure eclasses and ebuilds and profiles don't mess | |
# with shell opts (shopts). Ebuilds/eclasses changing shopts should reset them | |
# when they are done. | |
__qa_source() { | |
local shopts=$(shopt) OLDIFS="$IFS" | |
local retval | |
source "$@" | |
retval=$? | |
set +e | |
[[ $shopts != $(shopt) ]] && | |
eqawarn "QA Notice: Global shell options changed and were not restored while sourcing '$*'" | |
[[ "$IFS" != "$OLDIFS" ]] && | |
eqawarn "QA Notice: Global IFS changed and was not restored while sourcing '$*'" | |
return $retval | |
} | |
__qa_call() { | |
local shopts=$(shopt) OLDIFS="$IFS" | |
local retval | |
"$@" | |
retval=$? | |
set +e | |
[[ $shopts != $(shopt) ]] && | |
eqawarn "QA Notice: Global shell options changed and were not restored while calling '$*'" | |
[[ "$IFS" != "$OLDIFS" ]] && | |
eqawarn "QA Notice: Global IFS changed and was not restored while calling '$*'" | |
return $retval | |
} | |
EBUILD_SH_ARGS="$*" | |
shift $# | |
# Unset some variables that break things. | |
unset GZIP BZIP BZIP2 CDPATH GREP_OPTIONS GREP_COLOR GLOBIGNORE | |
[[ $PORTAGE_QUIET != "" ]] && export PORTAGE_QUIET | |
# sandbox support functions; defined prior to profile.bashrc srcing, since the profile might need to add a default exception (/usr/lib64/conftest fex) | |
__sb_append_var() { | |
local _v=$1 ; shift | |
local var="SANDBOX_${_v}" | |
[[ -z $1 || -n $2 ]] && die "Usage: add$(LC_ALL=C tr "[:upper:]" "[:lower:]" <<< "${_v}") <colon-delimited list of paths>" | |
export ${var}="${!var:+${!var}:}$1" | |
} | |
# bash-4 version: | |
# local var="SANDBOX_${1^^}" | |
# addread() { __sb_append_var ${0#add} "$@" ; } | |
addread() { __sb_append_var READ "$@" ; } | |
addwrite() { __sb_append_var WRITE "$@" ; } | |
adddeny() { __sb_append_var DENY "$@" ; } | |
addpredict() { __sb_append_var PREDICT "$@" ; } | |
addwrite "${PORTAGE_TMPDIR}" | |
addread "/:${PORTAGE_TMPDIR}" | |
[[ -n ${PORTAGE_GPG_DIR} ]] && addpredict "${PORTAGE_GPG_DIR}" | |
# Avoid sandbox violations in temporary directories. | |
if [[ -w $T ]] ; then | |
export TEMP=$T | |
export TMP=$T | |
export TMPDIR=$T | |
elif [[ $SANDBOX_ON = 1 ]] ; then | |
for x in TEMP TMP TMPDIR ; do | |
[[ -n ${!x} ]] && addwrite "${!x}" | |
done | |
unset x | |
fi | |
# the sandbox is disabled by default except when overridden in the relevant stages | |
export SANDBOX_ON=0 | |
# Ensure that $PWD is sane whenever possible, to protect against | |
# exploitation of insecure search path for python -c in ebuilds. | |
# See bug #239560 and bug #469338. | |
cd "${PORTAGE_PYM_PATH}" || \ | |
die "PORTAGE_PYM_PATH does not exist: '${PORTAGE_PYM_PATH}'" | |
#if no perms are specified, dirs/files will have decent defaults | |
#(not secretive, but not stupid) | |
umask 022 | |
# debug-print() gets called from many places with verbose status information useful | |
# for tracking down problems. The output is in $T/eclass-debug.log. | |
# You can set ECLASS_DEBUG_OUTPUT to redirect the output somewhere else as well. | |
# The special "on" setting echoes the information, mixing it with the rest of the | |
# emerge output. | |
# You can override the setting by exporting a new one from the console, or you can | |
# set a new default in make.*. Here the default is "" or unset. | |
# in the future might use e* from /etc/init.d/functions.sh if i feel like it | |
debug-print() { | |
# if $T isn't defined, we're in dep calculation mode and | |
# shouldn't do anything | |
[[ $EBUILD_PHASE = depend || ! -d ${T} || ${#} -eq 0 ]] && return 0 | |
if [[ ${ECLASS_DEBUG_OUTPUT} == on ]]; then | |
printf 'debug: %s\n' "${@}" >&2 | |
elif [[ -n ${ECLASS_DEBUG_OUTPUT} ]]; then | |
printf 'debug: %s\n' "${@}" >> "${ECLASS_DEBUG_OUTPUT}" | |
fi | |
if [[ -w $T ]] ; then | |
# default target | |
printf '%s\n' "${@}" >> "${T}/eclass-debug.log" | |
# let the portage user own/write to this file | |
chgrp "${PORTAGE_GRPNAME:-portage}" "${T}/eclass-debug.log" | |
chmod g+w "${T}/eclass-debug.log" | |
fi | |
} | |
# The following 2 functions are debug-print() wrappers | |
debug-print-function() { | |
debug-print "${1}: entering function, parameters: ${*:2}" | |
} | |
debug-print-section() { | |
debug-print "now in section ${*}" | |
} | |
# Sources all eclasses in parameters | |
declare -ix ECLASS_DEPTH=0 | |
inherit() { | |
ECLASS_DEPTH=$(($ECLASS_DEPTH + 1)) | |
if [[ ${ECLASS_DEPTH} > 1 ]]; then | |
debug-print "*** Multiple Inheritence (Level: ${ECLASS_DEPTH})" | |
fi | |
if [[ -n $ECLASS && -n ${!__export_funcs_var} ]] ; then | |
echo "QA Notice: EXPORT_FUNCTIONS is called before inherit in" \ | |
"$ECLASS.eclass. For compatibility with <=portage-2.1.6.7," \ | |
"only call EXPORT_FUNCTIONS after inherit(s)." \ | |
| fmt -w 75 | while read -r ; do eqawarn "$REPLY" ; done | |
fi | |
local repo_location | |
local location | |
local potential_location | |
local x | |
# These variables must be restored before returning. | |
local PECLASS=$ECLASS | |
local prev_export_funcs_var=$__export_funcs_var | |
local B_IUSE | |
local B_REQUIRED_USE | |
local B_DEPEND | |
local B_RDEPEND | |
local B_PDEPEND | |
local B_HDEPEND | |
while [ "$1" ]; do | |
location="" | |
potential_location="" | |
export ECLASS="$1" | |
__export_funcs_var=__export_functions_$ECLASS_DEPTH | |
unset $__export_funcs_var | |
if [ "${EBUILD_PHASE}" != "depend" ] && \ | |
[ "${EBUILD_PHASE}" != "nofetch" ] && \ | |
[[ ${EBUILD_PHASE} != *rm ]] && \ | |
[[ ${EMERGE_FROM} != "binary" ]] ; then | |
# This is disabled in the *rm phases because they frequently give | |
# false alarms due to INHERITED in /var/db/pkg being outdated | |
# in comparison the the eclasses from the portage tree. It's | |
# disabled for nofetch, since that can be called by repoman and | |
# that triggers bug #407449 due to repoman not exporting | |
# non-essential variables such as INHERITED. | |
if ! has $ECLASS $INHERITED $__INHERITED_QA_CACHE ; then | |
eqawarn "QA Notice: ECLASS '$ECLASS' inherited illegally in $CATEGORY/$PF $EBUILD_PHASE" | |
fi | |
fi | |
for repo_location in "${PORTAGE_ECLASS_LOCATIONS[@]}"; do | |
potential_location="${repo_location}/eclass/${1}.eclass" | |
if [[ -f ${potential_location} ]]; then | |
location="${potential_location}" | |
debug-print " eclass exists: ${location}" | |
break | |
fi | |
done | |
debug-print "inherit: $1 -> $location" | |
[[ -z ${location} ]] && die "${1}.eclass could not be found by inherit()" | |
#We need to back up the values of *DEPEND to B_*DEPEND | |
#(if set).. and then restore them after the inherit call. | |
#turn off glob expansion | |
set -f | |
# Retain the old data and restore it later. | |
unset B_IUSE B_REQUIRED_USE B_DEPEND B_RDEPEND B_PDEPEND B_HDEPEND | |
[ "${IUSE+set}" = set ] && B_IUSE="${IUSE}" | |
[ "${REQUIRED_USE+set}" = set ] && B_REQUIRED_USE="${REQUIRED_USE}" | |
[ "${DEPEND+set}" = set ] && B_DEPEND="${DEPEND}" | |
[ "${RDEPEND+set}" = set ] && B_RDEPEND="${RDEPEND}" | |
[ "${PDEPEND+set}" = set ] && B_PDEPEND="${PDEPEND}" | |
[ "${HDEPEND+set}" = set ] && B_HDEPEND="${HDEPEND}" | |
unset IUSE REQUIRED_USE DEPEND RDEPEND PDEPEND HDEPEND | |
#turn on glob expansion | |
set +f | |
__qa_source "$location" || die "died sourcing $location in inherit()" | |
#turn off glob expansion | |
set -f | |
# If each var has a value, append it to the global variable E_* to | |
# be applied after everything is finished. New incremental behavior. | |
[ "${IUSE+set}" = set ] && E_IUSE+="${E_IUSE:+ }${IUSE}" | |
[ "${REQUIRED_USE+set}" = set ] && E_REQUIRED_USE+="${E_REQUIRED_USE:+ }${REQUIRED_USE}" | |
[ "${DEPEND+set}" = set ] && E_DEPEND+="${E_DEPEND:+ }${DEPEND}" | |
[ "${RDEPEND+set}" = set ] && E_RDEPEND+="${E_RDEPEND:+ }${RDEPEND}" | |
[ "${PDEPEND+set}" = set ] && E_PDEPEND+="${E_PDEPEND:+ }${PDEPEND}" | |
[ "${HDEPEND+set}" = set ] && E_HDEPEND+="${E_HDEPEND:+ }${HDEPEND}" | |
[ "${B_IUSE+set}" = set ] && IUSE="${B_IUSE}" | |
[ "${B_IUSE+set}" = set ] || unset IUSE | |
[ "${B_REQUIRED_USE+set}" = set ] && REQUIRED_USE="${B_REQUIRED_USE}" | |
[ "${B_REQUIRED_USE+set}" = set ] || unset REQUIRED_USE | |
[ "${B_DEPEND+set}" = set ] && DEPEND="${B_DEPEND}" | |
[ "${B_DEPEND+set}" = set ] || unset DEPEND | |
[ "${B_RDEPEND+set}" = set ] && RDEPEND="${B_RDEPEND}" | |
[ "${B_RDEPEND+set}" = set ] || unset RDEPEND | |
[ "${B_PDEPEND+set}" = set ] && PDEPEND="${B_PDEPEND}" | |
[ "${B_PDEPEND+set}" = set ] || unset PDEPEND | |
[ "${B_HDEPEND+set}" = set ] && HDEPEND="${B_HDEPEND}" | |
[ "${B_HDEPEND+set}" = set ] || unset HDEPEND | |
#turn on glob expansion | |
set +f | |
if [[ -n ${!__export_funcs_var} ]] ; then | |
for x in ${!__export_funcs_var} ; do | |
debug-print "EXPORT_FUNCTIONS: $x -> ${ECLASS}_$x" | |
declare -F "${ECLASS}_$x" >/dev/null || \ | |
die "EXPORT_FUNCTIONS: ${ECLASS}_$x is not defined" | |
eval "$x() { ${ECLASS}_$x \"\$@\" ; }" > /dev/null | |
done | |
fi | |
unset $__export_funcs_var | |
has $1 $INHERITED || export INHERITED="$INHERITED $1" | |
shift | |
done | |
((--ECLASS_DEPTH)) # Returns 1 when ECLASS_DEPTH reaches 0. | |
if (( ECLASS_DEPTH > 0 )) ; then | |
export ECLASS=$PECLASS | |
__export_funcs_var=$prev_export_funcs_var | |
else | |
unset ECLASS __export_funcs_var | |
fi | |
return 0 | |
} | |
# Exports stub functions that call the eclass's functions, thereby making them default. | |
# For example, if ECLASS="base" and you call "EXPORT_FUNCTIONS src_unpack", the following | |
# code will be eval'd: | |
# src_unpack() { base_src_unpack; } | |
EXPORT_FUNCTIONS() { | |
if [ -z "$ECLASS" ]; then | |
die "EXPORT_FUNCTIONS without a defined ECLASS" | |
fi | |
eval $__export_funcs_var+=\" $*\" | |
} | |
PORTAGE_BASHRCS_SOURCED=0 | |
# @FUNCTION: __source_all_bashrcs | |
# @DESCRIPTION: | |
# Source a relevant bashrc files and perform other miscellaneous | |
# environment initialization when appropriate. | |
# | |
# If EAPI is set then define functions provided by the current EAPI: | |
# | |
# * default_* aliases for the current EAPI phase functions | |
# * A "default" function which is an alias for the default phase | |
# function for the current phase. | |
# | |
__source_all_bashrcs() { | |
[[ $PORTAGE_BASHRCS_SOURCED = 1 ]] && return 0 | |
PORTAGE_BASHRCS_SOURCED=1 | |
local x | |
local OCC="${CC}" OCXX="${CXX}" | |
if [[ $EBUILD_PHASE != depend ]] ; then | |
# source the existing profile.bashrcs. | |
save_IFS | |
IFS=$'\n' | |
local path_array=($PROFILE_PATHS) | |
restore_IFS | |
for x in "${path_array[@]}" ; do | |
[ -f "$x/profile.bashrc" ] && __qa_source "$x/profile.bashrc" | |
done | |
fi | |
if [ -r "${PORTAGE_BASHRC}" ] ; then | |
if [ "$PORTAGE_DEBUG" != "1" ] || [ "${-/x/}" != "$-" ]; then | |
source "${PORTAGE_BASHRC}" | |
else | |
set -x | |
source "${PORTAGE_BASHRC}" | |
set +x | |
fi | |
fi | |
if [[ $EBUILD_PHASE != depend ]] ; then | |
# The user's bashrc is the ONLY non-portage bit of code that can | |
# change shopts without a QA violation. | |
for x in "${PM_EBUILD_HOOK_DIR}"/${CATEGORY}/{${PN},${PN}:${SLOT%/*},${P},${PF}}; do | |
if [ -r "${x}" ]; then | |
# If $- contains x, then tracing has already been enabled | |
# elsewhere for some reason. We preserve it's state so as | |
# not to interfere. | |
if [ "$PORTAGE_DEBUG" != "1" ] || [ "${-/x/}" != "$-" ]; then | |
source "${x}" | |
else | |
set -x | |
source "${x}" | |
set +x | |
fi | |
fi | |
done | |
fi | |
[ ! -z "${OCC}" ] && export CC="${OCC}" | |
[ ! -z "${OCXX}" ] && export CXX="${OCXX}" | |
} | |
# === === === === === === === === === === === === === === === === === === | |
# === === === === === functions end, main part begins === === === === === | |
# === === === === === === === === === === === === === === === === === === | |
export SANDBOX_ON="1" | |
export S=${WORKDIR}/${P} | |
# Turn of extended glob matching so that g++ doesn't get incorrectly matched. | |
shopt -u extglob | |
if [[ ${EBUILD_PHASE} == depend ]] ; then | |
QA_INTERCEPTORS="awk bash cc egrep equery fgrep g++ | |
gawk gcc grep javac java-config nawk perl | |
pkg-config python python-config sed" | |
elif [[ ${EBUILD_PHASE} == clean* ]] ; then | |
unset QA_INTERCEPTORS | |
else | |
QA_INTERCEPTORS="autoconf automake aclocal libtoolize" | |
fi | |
# level the QA interceptors if we're in depend | |
if [[ -n ${QA_INTERCEPTORS} ]] ; then | |
for BIN in ${QA_INTERCEPTORS}; do | |
BIN_PATH=$(type -Pf ${BIN}) | |
if [ "$?" != "0" ]; then | |
BODY="echo \"*** missing command: ${BIN}\" >&2; return 127" | |
else | |
BODY="${BIN_PATH} \"\$@\"; return \$?" | |
fi | |
if [[ ${EBUILD_PHASE} == depend ]] ; then | |
FUNC_SRC="${BIN}() { | |
if [ \$ECLASS_DEPTH -gt 0 ]; then | |
eqawarn \"QA Notice: '${BIN}' called in global scope: eclass \${ECLASS}\" | |
else | |
eqawarn \"QA Notice: '${BIN}' called in global scope: \${CATEGORY}/\${PF}\" | |
fi | |
${BODY} | |
}" | |
elif has ${BIN} autoconf automake aclocal libtoolize ; then | |
FUNC_SRC="${BIN}() { | |
if ! has \${FUNCNAME[1]} eautoreconf eaclocal _elibtoolize \\ | |
eautoheader eautoconf eautomake autotools_run_tool \\ | |
autotools_check_macro autotools_get_subdirs \\ | |
autotools_get_auxdir ; then | |
eqawarn \"QA Notice: '${BIN}' called by \${FUNCNAME[1]}: \${CATEGORY}/\${PF}\" | |
eqawarn \"Use autotools.eclass instead of calling '${BIN}' directly.\" | |
fi | |
${BODY} | |
}" | |
else | |
FUNC_SRC="${BIN}() { | |
eqawarn \"QA Notice: '${BIN}' called by \${FUNCNAME[1]}: \${CATEGORY}/\${PF}\" | |
${BODY} | |
}" | |
fi | |
eval "$FUNC_SRC" || echo "error creating QA interceptor ${BIN}" >&2 | |
done | |
unset BIN_PATH BIN BODY FUNC_SRC | |
fi | |
# Subshell/helper die support (must export for the die helper). | |
export EBUILD_MASTER_PID=$BASHPID | |
trap 'exit 1' SIGTERM | |
if ! has "$EBUILD_PHASE" clean cleanrm depend && \ | |
[ -f "${T}"/environment ] ; then | |
# The environment may have been extracted from environment.bz2 or | |
# may have come from another version of ebuild.sh or something. | |
# In any case, preprocess it to prevent any potential interference. | |
# NOTE: export ${FOO}=... requires quoting, unlike normal exports | |
__preprocess_ebuild_env || \ | |
die "error processing environment" | |
# Colon separated SANDBOX_* variables need to be cumulative. | |
for x in SANDBOX_DENY SANDBOX_READ SANDBOX_PREDICT SANDBOX_WRITE ; do | |
export PORTAGE_${x}="${!x}" | |
done | |
PORTAGE_SANDBOX_ON=${SANDBOX_ON} | |
export SANDBOX_ON=1 | |
source "${T}"/environment || \ | |
die "error sourcing environment" | |
# We have to temporarily disable sandbox since the | |
# SANDBOX_{DENY,READ,PREDICT,WRITE} values we've just loaded | |
# may be unusable (triggering in spurious sandbox violations) | |
# until we've merged them with our current values. | |
export SANDBOX_ON=0 | |
for x in SANDBOX_DENY SANDBOX_PREDICT SANDBOX_READ SANDBOX_WRITE ; do | |
y="PORTAGE_${x}" | |
if [ -z "${!x}" ] ; then | |
export ${x}="${!y}" | |
elif [ -n "${!y}" ] && [ "${!y}" != "${!x}" ] ; then | |
# filter out dupes | |
export ${x}="$(printf "${!y}:${!x}" | tr ":" "\0" | \ | |
sort -z -u | tr "\0" ":")" | |
fi | |
export ${x}="${!x%:}" | |
unset PORTAGE_${x} | |
done | |
unset x y | |
export SANDBOX_ON=${PORTAGE_SANDBOX_ON} | |
unset PORTAGE_SANDBOX_ON | |
[[ -n $EAPI ]] || EAPI=0 | |
fi | |
if ___eapi_enables_globstar; then | |
shopt -s globstar | |
fi | |
# Convert quoted paths to array. | |
eval "PORTAGE_ECLASS_LOCATIONS=(${PORTAGE_ECLASS_LOCATIONS})" | |
# Source the ebuild every time for FEATURES=noauto, so that ebuild | |
# modifications take effect immediately. | |
if ! has "$EBUILD_PHASE" clean cleanrm ; then | |
if [[ $EBUILD_PHASE = depend || ! -f $T/environment || \ | |
-f $PORTAGE_BUILDDIR/.ebuild_changed || \ | |
" ${FEATURES} " == *" noauto "* ]] ; then | |
# The bashrcs get an opportunity here to set aliases that will be expanded | |
# during sourcing of ebuilds and eclasses. | |
__source_all_bashrcs | |
# When EBUILD_PHASE != depend, INHERITED comes pre-initialized | |
# from cache. In order to make INHERITED content independent of | |
# EBUILD_PHASE during inherit() calls, we unset INHERITED after | |
# we make a backup copy for QA checks. | |
__INHERITED_QA_CACHE=$INHERITED | |
# *DEPEND and IUSE will be set during the sourcing of the ebuild. | |
# In order to ensure correct interaction between ebuilds and | |
# eclasses, they need to be unset before this process of | |
# interaction begins. | |
unset EAPI DEPEND RDEPEND PDEPEND HDEPEND INHERITED IUSE REQUIRED_USE \ | |
ECLASS E_IUSE E_REQUIRED_USE E_DEPEND E_RDEPEND E_PDEPEND \ | |
E_HDEPEND | |
if [[ $PORTAGE_DEBUG != 1 || ${-/x/} != $- ]] ; then | |
source "$EBUILD" || die "error sourcing ebuild" | |
else | |
set -x | |
source "$EBUILD" || die "error sourcing ebuild" | |
set +x | |
fi | |
if [[ "${EBUILD_PHASE}" != "depend" ]] ; then | |
RESTRICT=${PORTAGE_RESTRICT} | |
[[ -e $PORTAGE_BUILDDIR/.ebuild_changed ]] && \ | |
rm "$PORTAGE_BUILDDIR/.ebuild_changed" | |
fi | |
[ "${EAPI+set}" = set ] || EAPI=0 | |
# export EAPI for helpers (especially since we unset it above) | |
export EAPI | |
if ___eapi_has_RDEPEND_DEPEND_fallback; then | |
export RDEPEND=${RDEPEND-${DEPEND}} | |
debug-print "RDEPEND: not set... Setting to: ${DEPEND}" | |
fi | |
# add in dependency info from eclasses | |
IUSE+="${IUSE:+ }${E_IUSE}" | |
DEPEND+="${DEPEND:+ }${E_DEPEND}" | |
RDEPEND+="${RDEPEND:+ }${E_RDEPEND}" | |
PDEPEND+="${PDEPEND:+ }${E_PDEPEND}" | |
HDEPEND+="${HDEPEND:+ }${E_HDEPEND}" | |
REQUIRED_USE+="${REQUIRED_USE:+ }${E_REQUIRED_USE}" | |
unset ECLASS E_IUSE E_REQUIRED_USE E_DEPEND E_RDEPEND E_PDEPEND E_HDEPEND \ | |
__INHERITED_QA_CACHE | |
# alphabetically ordered by $EBUILD_PHASE value | |
case ${EAPI} in | |
0|1) | |
_valid_phases="src_compile pkg_config pkg_info src_install | |
pkg_nofetch pkg_postinst pkg_postrm pkg_preinst pkg_prerm | |
pkg_setup src_test src_unpack" | |
;; | |
2|3) | |
_valid_phases="src_compile pkg_config src_configure pkg_info | |
src_install pkg_nofetch pkg_postinst pkg_postrm pkg_preinst | |
src_prepare pkg_prerm pkg_setup src_test src_unpack" | |
;; | |
*) | |
_valid_phases="src_compile pkg_config src_configure pkg_info | |
src_install pkg_nofetch pkg_postinst pkg_postrm pkg_preinst | |
src_prepare pkg_prerm pkg_pretend pkg_setup src_test src_unpack" | |
;; | |
esac | |
DEFINED_PHASES= | |
for _f in $_valid_phases ; do | |
if declare -F $_f >/dev/null ; then | |
_f=${_f#pkg_} | |
DEFINED_PHASES+=" ${_f#src_}" | |
fi | |
done | |
[[ -n $DEFINED_PHASES ]] || DEFINED_PHASES=- | |
unset _f _valid_phases | |
if [[ $EBUILD_PHASE != depend ]] ; then | |
if has distcc $FEATURES ; then | |
[[ -n $DISTCC_LOG ]] && addwrite "${DISTCC_LOG%/*}" | |
fi | |
if has ccache $FEATURES ; then | |
if [[ -n $CCACHE_DIR ]] ; then | |
addread "$CCACHE_DIR" | |
addwrite "$CCACHE_DIR" | |
fi | |
[[ -n $CCACHE_SIZE ]] && ccache -M $CCACHE_SIZE &> /dev/null | |
fi | |
if [[ -n $QA_PREBUILT ]] ; then | |
# these ones support fnmatch patterns | |
QA_EXECSTACK+=" $QA_PREBUILT" | |
QA_TEXTRELS+=" $QA_PREBUILT" | |
QA_WX_LOAD+=" $QA_PREBUILT" | |
# these ones support regular expressions, so translate | |
# fnmatch patterns to regular expressions | |
for x in QA_DT_NEEDED QA_FLAGS_IGNORED QA_PRESTRIPPED QA_SONAME ; do | |
if [[ $(declare -p $x 2>/dev/null) = declare\ -a* ]] ; then | |
eval "$x=(\"\${$x[@]}\" ${QA_PREBUILT//\*/.*})" | |
else | |
eval "$x+=\" ${QA_PREBUILT//\*/.*}\"" | |
fi | |
done | |
unset x | |
fi | |
# This needs to be exported since prepstrip is a separate shell script. | |
[[ -n $QA_PRESTRIPPED ]] && export QA_PRESTRIPPED | |
eval "[[ -n \$QA_PRESTRIPPED_${ARCH/-/_} ]] && \ | |
export QA_PRESTRIPPED_${ARCH/-/_}" | |
fi | |
fi | |
fi | |
# unset USE_EXPAND variables that contain only the special "*" token | |
for x in ${USE_EXPAND} ; do | |
[ "${!x}" == "*" ] && unset ${x} | |
done | |
unset x | |
if has nostrip ${FEATURES} ${RESTRICT} || has strip ${RESTRICT} | |
then | |
export DEBUGBUILD=1 | |
fi | |
if [[ $EBUILD_PHASE = depend ]] ; then | |
export SANDBOX_ON="0" | |
set -f | |
if [ -n "${dbkey}" ] ; then | |
if [ ! -d "${dbkey%/*}" ]; then | |
install -d -g ${PORTAGE_GID} -m2775 "${dbkey%/*}" | |
fi | |
# Make it group writable. 666&~002==664 | |
umask 002 | |
fi | |
auxdbkeys="DEPEND RDEPEND SLOT SRC_URI RESTRICT HOMEPAGE LICENSE | |
DESCRIPTION KEYWORDS INHERITED IUSE REQUIRED_USE PDEPEND PROVIDE EAPI | |
PROPERTIES DEFINED_PHASES HDEPEND UNUSED_04 | |
UNUSED_03 UNUSED_02 UNUSED_01" | |
if ! ___eapi_has_HDEPEND; then | |
unset HDEPEND | |
fi | |
# The extra $(echo) commands remove newlines. | |
if [ -n "${dbkey}" ] ; then | |
> "${dbkey}" | |
for f in ${auxdbkeys} ; do | |
echo $(echo ${!f}) >> "${dbkey}" || exit $? | |
done | |
else | |
for f in ${auxdbkeys} ; do | |
eval "echo \$(echo \${!f}) 1>&${PORTAGE_PIPE_FD}" || exit $? | |
done | |
eval "exec ${PORTAGE_PIPE_FD}>&-" | |
fi | |
set +f | |
else | |
# Note: readonly variables interfere with __preprocess_ebuild_env(), so | |
# declare them only after it has already run. | |
declare -r $PORTAGE_READONLY_METADATA $PORTAGE_READONLY_VARS | |
if ___eapi_has_prefix_variables; then | |
declare -r ED EPREFIX EROOT | |
fi | |
if [[ -n $EBUILD_SH_ARGS ]] ; then | |
( | |
# Don't allow subprocesses to inherit the pipe which | |
# emerge uses to monitor ebuild.sh. | |
if [[ -n ${PORTAGE_PIPE_FD} ]] ; then | |
eval "exec ${PORTAGE_PIPE_FD}>&-" | |
unset PORTAGE_PIPE_FD | |
fi | |
__ebuild_main ${EBUILD_SH_ARGS} | |
exit 0 | |
) | |
exit $? | |
fi | |
fi | |
# Do not exit when ebuild.sh is sourced by other scripts. | |
true |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment