Exheredludis/paludis/repositories/e/ebuild/ebuild.bash
David Leverton ac5169c87e Change bash compatibility level handling
Apparently bash is going to deprecate the compat* shopts in favour of
the BASH_COMPAT variable, so use that instead.  BASH_COMPAT is only
supported in 4.3 and later, but it doesn't hurt to set it anyway - in
fact, this is better than the shopt version because 4.2 doesn't
support shopt compat42.  I don't think it's worth messing around with
falling back to shopt for older versions - only EAPIs before 6 would
be affected, and those have survived this long without setting
anything anyway.
2015-11-11 21:12:50 +00:00

700 lines
25 KiB
Bash
Executable File

#!/usr/bin/env bash
# vim: set sw=4 sts=4 et :
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2013 Ciaran McCreesh
#
# Based in part upon ebuild.sh from Portage, which is Copyright 1995-2005
# Gentoo Foundation and distributed under the terms of the GNU General
# Public License v2.
#
# This file is part of the Paludis package manager. Paludis is free software;
# you can redistribute it and/or modify it under the terms of the GNU General
# Public License, version 2, as published by the Free Software Foundation.
#
# Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
unalias -a
set +C
[[ -n "${PALUDIS_TRACE}" ]] && set -x
ebuild_need_extglob()
{
eval "_ebuild_need_extglob_$(declare -f ${1})"
eval "
${1}()
{
eval \"
shopt -s extglob
_ebuild_need_extglob_${1} \\\"\\\${@}\\\"
eval \\\"\$(shopt -p extglob); return \\\${?}\\\"
\"
}"
}
ebuild_cleanup_slashes()
{
export "${1}=${!1//+(\/)//}"
export "${1}=${!1/%*(\/)}/"
}
ebuild_need_extglob ebuild_cleanup_slashes
ebuild_sanitise_envvars()
{
local p
# Force a few more things into PATH, since some users have crazy setups.
# See ticket:374.
export PATH="/usr/bin:/usr/sbin:/bin:/sbin${PATH:+:${PATH}}"
export PATH="${PALUDIS_EBUILD_DIR}/utils:${PATH}"
# Automake likes to scatter our utilities over two directories.
[[ -n "${PALUDIS_EBUILD_DIR_FALLBACK}" ]] && export PATH="${PALUDIS_EBUILD_DIR_FALLBACK}/utils:${PATH}"
for p in ${PALUDIS_UTILITY_PATH_SUFFIXES} ; do
export PATH="${PALUDIS_EBUILD_DIR}/utils/${p}:${PATH}"
[[ -n "${PALUDIS_EBUILD_DIR_FALLBACK}" ]] && export PATH="${PALUDIS_EBUILD_DIR_FALLBACK}/utils/${p}:${PATH}"
done
unset GZIP BZIP BZIP2 CDPATH GREP_OPTIONS GREP_COLOR GLOBIGNORE
unset LANG ${!LC_*}
export LC_ALL=C
# pagers won't run with redirected output, but some naughty packages like
# to use them.
export PAGER=cat
}
ebuild_sanitise_envvars
# The list below should include all variables from all EAPIs, along with any
# fancy fake variables
EBUILD_METADATA_VARIABLES="DEPEND RDEPEND PDEPEND IUSE IUSE_EFFECTIVE SRC_URI DOWNLOADS RESTRICT \
LICENSE LICENCES KEYWORDS INHERITED PROVIDE HOMEPAGE DESCRIPTION DEPENDENCIES \
E_IUSE E_DEPEND E_RDEPEND E_PDEPEND PLATFORMS DEFINED_PHASES EBUILD_PHASE_FUNC \
MYOPTIONS E_MYOPTIONS E_DEPENDENCIES BINARY_KEYWORDS BINARY_URI \
GENERATED_USING GENERATED_TIME GENERATED_FROM_REPOSITORY BINARY_PLATFORMS REMOTE_IDS \
SUMMARY BUGS_TO UPSTREAM_DOCUMENTATION UPSTREAM_CHANGELOG \
UPSTREAM_RELEASE_NOTES PROPERTIES PALUDIS_DECLARED_FUNCTIONS SLOT EAPI OPTIONS USE \
PALUDIS_EBUILD_RDEPEND_WAS_SET PALUDIS_EBUILD_DEPEND REQUIRED_USE SCM_REVISION"
EBUILD_METADATA_VARIABLES_FROM_CPLUSPLUS="SLOT EAPI OPTIONS USE IUSE_EFFECTIVE"
export -n BASH_COMPAT=${PALUDIS_BASH_COMPAT}
shopt -s expand_aliases
[[ -z ${PALUDIS_SHELL_OPTIONS} && unset == ${PALUDIS_SHELL_OPTIONS-unset} ]] &&
shopt -s extglob
for p in ${PALUDIS_SHELL_OPTIONS} ; do
shopt -s ${p}
done
ebuild_cleanup_slashes ROOT
export EBUILD_PROGRAM_NAME="$0"
EBUILD_MODULES_DIR=$(canonicalise $(dirname $0 ) )
if ! [[ -d ${EBUILD_MODULES_DIR} ]] ; then
echo "${EBUILD_MODULES_DIR} is not a directory" 1>&2
exit 123
fi
# Upgrade from back when 0/ wasn't its own dir.
[[ -z "${PALUDIS_EBUILD_MODULE_SUFFIXES}" ]] && PALUDIS_EBUILD_MODULE_SUFFIXES=0
for p in ${PALUDIS_EBUILD_MODULE_SUFFIXES}; do
EBUILD_MODULES_DIRS="${EBUILD_MODULES_DIRS} ${EBUILD_MODULES_DIR}/${p}"
done
for p in ${PALUDIS_EXTRA_EBUILD_MODULES_DIRS} ; do
EBUILD_MODULES_DIRS="${EBUILD_MODULES_DIRS} ${p}"
done
EBUILD_MODULES_DIRS="${EBUILD_MODULES_DIRS} ${EBUILD_MODULES_DIR}"
export PALUDIS_EBUILD_MODULES_DIR="${EBUILD_MODULES_DIR}"
export EBUILD_KILL_PID=$$
declare -r EBUILD_KILL_PID
ebuild_load_module()
{
local older= t= d= save_excl= excl_v=
if [[ "${1}" == "--older" ]] ; then
shift
older=true
excl_v="EBUILD_MODULES_DIRS_EXCLUDE_${1}"
save_excl="${!excl_v}"
fi
for d in ${EBUILD_MODULES_DIRS}; do
local dx= x=
if [[ -n "${older}" ]] ; then
for dx in ${!excl_v} ; do
[[ "${dx}" == "${d}" ]] && x=true
done
fi
[[ -n "${x}" ]] && continue
[[ -n "${older}" ]] && export "${excl_v}"="${!excl_v} ${d}"
if [[ -f "${d}/${1}.bash" ]]; then
if ! source "${d}/${1}.bash"; then
type die &>/dev/null && eval die "\"Error loading module \${1}\""
echo "Error loading module ${1}" 1>&2
exit 124
fi
return
else
t="${t:+${t}, }${d}"
fi
done
[[ -n "${older}" ]] && export "${excl_v}"="${save_excl}"
type die &>/dev/null && eval die "\"Couldn't find module \${1} (looked in \${t})\""
echo "Couldn't find module ${1} (looked in ${t})" 1>&2
exit 125
}
ebuild_need_extglob ebuild_load_module
ebuild_load_module pipe_functions
ebuild_load_module die_functions
ebuild_load_module output_functions
ebuild_load_module echo_functions
ebuild_load_module list_functions
ebuild_load_module source_functions
if [[ -z ${PALUDIS_LOAD_MODULES} ]]; then
PALUDIS_LOAD_MODULES="
conditional_functions kernel_functions sandbox sydbox portage_stubs
multilib_functions install_functions build_functions"
for m in eclass_functions exlib_functions ever_functions; do
for d in ${EBUILD_MODULES_DIRS}; do
if [[ -f "${d}/${1}.bash" ]]; then
PALUDIS_LOAD_MODULES="${PALUDIS_LOAD_MODULES} ${m}"
break
fi
done
done
fi
for m in ${PALUDIS_LOAD_MODULES}; do
ebuild_load_module ${m}
done
[[ -z ${PALUDIS_EBUILD_FUNCTIONS} ]] && PALUDIS_EBUILD_FUNCTIONS="
builtin_infovars builtin_init builtin_initrm builtin_initmisc
builtin_loadenv builtin_metadata builtin_killold builtin_killoldrm
builtin_saveenv builtin_tidyup builtin_tidyuprm builtin_variable
builtin_bad_required_use
pkg_config pkg_info pkg_nofetch pkg_postinst pkg_postrm
pkg_preinst pkg_prerm pkg_pretend pkg_setup pkg_bad_options
src_compile src_configure src_install src_prepare src_test src_unpack
src_fetch_extra"
# keep the upgrade from 0.36 to 0.38 working
[[ -z ${PALUDIS_EBUILD_PHASE_VAR} ]] && export PALUDIS_EBUILD_PHASE_VAR="EBUILD_PHASE"
if [[ -z "${PALUDIS_DO_NOTHING_SANDBOXY}" ]] ; then
export SANDBOX_PREDICT="${SANDBOX_PREDICT+${SANDBOX_PREDICT}:}"
export SANDBOX_PREDICT="${SANDBOX_PREDICT}/proc/self/maps:/dev/console:/dev/random"
export SANDBOX_WRITE="${SANDBOX_WRITE+${SANDBOX_WRITE}:}"
export SANDBOX_WRITE="${SANDBOX_WRITE}/dev/shm:/dev/stdout:/dev/stderr:/dev/null:/dev/tty:/dev/pts"
export SANDBOX_WRITE="${SANDBOX_WRITE}:${PALUDIS_TMPDIR}:/var/cache"
export SANDBOX_WRITE="${SANDBOX_WRITE}:/proc/self/attr:/proc/self/task:/selinux/context"
export SANDBOX_ON="1"
export SANDBOX_BASHRC="/dev/null"
unset BASH_ENV
if esandbox check 2>/dev/null; then
esandbox allow \
/dev/{stdout,stderr,zero,null,full,console,random,ptmx} \
/dev/{fd,tts,pts,shm,tty,pty} \
/proc/self/{fd,attr,task} \
/selinux/context \
/tmp /var/tmp /var/cache \
"${PALUDIS_TMPDIR%/}"
if [[ -n "${CCACHE_DIR}" ]]; then
esandbox allow "${CCACHE_DIR%/}"
fi
esandbox allow_net \
LOOPBACK@0 \
LOOPBACK@1024-65535 \
LOOPBACK6@0 \
LOOPBACK6@1024-65535
esandbox allow_net --connect \
unix:/var/run/nscd/socket \
unix:/run/nscd/socket
fi
fi
check_paludis_pipe_command()
{
[[ -n "${PALUDIS_SKIP_PIPE_COMMAND_CHECK}" ]] && return
[[ -z "${PALUDIS_PIPE_COMMANDS_SUPPORTED}" ]] && return
pcr=$(paludis_pipe_command PING DUNNOYET $$ )
[[ "$pcr" == "PONG $$" ]] || die "paludis_pipe_command isn't working (got '$pcr')"
}
check_paludis_pipe_command
export PALUDIS_HOME="$(canonicalise ${PALUDIS_HOME:-${HOME}} )"
ebuild_source_profile()
{
if [[ -z ${PALUDIS_PROFILES_DIRS} ]]; then
if [[ -f ${1}/parent ]] ; then
while read line ; do
grep --silent '^[[:space:]]*#' <<<"${line}" && continue
grep --silent '[^[:space:]]' <<<"${line}" || continue
ebuild_source_profile $(canonicalise ${1}/${line} )
done <${1}/parent
fi
fi
local paludis_old_set=$-
set -a
if [[ -f ${1}/make.defaults ]] ; then
source ${1}/make.defaults || die "Couldn't source ${1}/make.defaults"
fi
if [[ -f ${1}/bashrc ]] ; then
source ${1}/bashrc || die "Couldn't source ${1}/bashrc"
fi
[[ ${paludis_old_set} == *a* ]] || set +a
}
ebuild_scrub_environment()
{
local paludis_declared_functions
paludis_declared_functions=$(declare -F | while read paludis_v ; do
f=${paludis_v#declare -f }
has ${f} ${PALUDIS_EBUILD_FUNCTIONS} || echo -n ${f} " "
done )
(
ebuild_safe_source --rewrite-for-declare "${1}" PATH PALUDIS_SOURCE_MERGED_VARIABLES \
PALUDIS_BRACKET_MERGED_VARIABLES LD_LIBRARY_PATH paludis_declared_functions || exit 1
unset -v $(
for v in ${!LD_*}; do
[[ ${v} != LD_LIBRARY_PATH ]] && echo ${v}
done )
unset -f ${paludis_declared_functions}
unset -v paludis_declared_functions
if [[ "${2}" == "--pivot" ]] ; then
unset -f ${PALUDIS_IGNORE_PIVOT_ENV_FUNCTIONS}
unset -v ${PALUDIS_IGNORE_PIVOT_ENV_VARIABLES}
fi
unset -v ROOTPATH T TEMP HOME TMPDIR PORTDIR FILESDIR ECLASSDIR DISTDIR
unset -v SKIP_FUNCTIONS FETCHEDDIR REPODIR EAPI FILES PKGMANAGER ROOT
unset -v ${!GTKPALUDIS_CMDLINE_*} GTKPALUDIS_OPTIONS
unset -v ${!ADJUTRIX_CMDLINE_*} ADJUTRIX_OPTIONS
unset -v ${!QUALUDIS_CMDLINE_*} QUALUDIS_OPTIONS
unset -v ${!RECONCILIO_CMDLINE_*} RECONCILIO_OPTIONS
eval unset -v $(
PALUDIS_CLIENT_UPPER=$(echo ${PALUDIS_CLIENT} | tr a-z A-Z)
echo "\${!${PALUDIS_CLIENT_UPPER}_CMDLINE_*} ${PALUDIS_CLIENT_UPPER}_OPTIONS" )
unset -v CATEGORY PN PV P PNV PVR PF PNVR
unset -v ebuild EBUILD MERGE_TYPE
unset -v $(
for v in ${PALUDIS_SOURCE_MERGED_VARIABLES} ${PALUDIS_BRACKET_MERGED_VARIABLES} ; do
echo E_${v}
done )
unset -v ${!PALUDIS_*}
unset -v $(
for v in ${!SANDBOX_*}; do
[[ ${v} != SANDBOX_ACTIVE ]] && echo ${v}
done )
export -n SANDBOX_ACTIVE
unset -v $(
for v in ${!BASH_*}; do
case "${v#BASH_}" in
(ARGC|ARGV|LINENO|SOURCE|VERSINFO|REMATCH) : ;;
(*) echo ${v} ;;
esac
done
)
set >"${1}"
print_exports >>"${1}"
)
}
ebuild_load_environment()
{
if [[ -n "${PALUDIS_LOAD_ENVIRONMENT}" ]] ; then
[[ -d ${PALUDIS_TMPDIR} ]] \
|| die "You need to create PALUDIS_TMPDIR (${PALUDIS_TMPDIR})."
local save_PALUDIS_EXTRA_DIE_MESSAGE="${PALUDIS_EXTRA_DIE_MESSAGE}"
export PALUDIS_EXTRA_DIE_MESSAGE="
!!! Could not extract the saved environment file. This is usually
!!! caused by a broken environment.bz2 that was generated by an old
!!! Portage version. The file that needs repairing is:
!!! ${PALUDIS_LOAD_ENVIRONMENT}
!!! Try copying this file, bunzip2ing it and sourcing it using a new
!!! bash shell (do not continue to use said shell afterwards). You
!!! should get an error that gives you a rough idea of where the
!!! problem lies.
"
if [[ "${PALUDIS_LOAD_ENVIRONMENT%.bz2}" != "${PALUDIS_LOAD_ENVIRONMENT}" ]] ; then
echo bunzip2 \< "${PALUDIS_LOAD_ENVIRONMENT}" \> ${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$ 1>&2
bunzip2 < "${PALUDIS_LOAD_ENVIRONMENT}" > ${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$ \
|| die "Can't extract ${PALUDIS_LOAD_ENVIRONMENT}"
else
echo cp "${PALUDIS_LOAD_ENVIRONMENT}" "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" 1>&2
cp "${PALUDIS_LOAD_ENVIRONMENT}" "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" \
|| die "Can't copy ${PALUDIS_LOAD_ENVIRONMENT}"
fi
echo ebuild_scrub_environment "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" "$@" 1>&2
ebuild_scrub_environment "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" "$@" \
|| die "Can't load saved environment for cleaning"
echo ebuild_safe_source "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" 1>&2
ebuild_safe_source "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" \
|| die "Can't load saved environment"
export PALUDIS_EXTRA_DIE_MESSAGE="${save_PALUDIS_EXTRA_DIE_MESSAGE}"
echo rm "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$" 1>&2
rm "${PALUDIS_TMPDIR}/environment-${CATEGORY}-${!PALUDIS_NAME_VERSION_REVISION_VAR}-$$"
fi
}
ebuild_unset_all_except()
{
local ${2}
unset -v ${1}
}
ebuild_load_ebuild()
{
local paludis_v paludis_e_v
ebuild_unset_all_except "${EBUILD_METADATA_VARIABLES}" "${EBUILD_METADATA_VARIABLES_FROM_CPLUSPLUS}"
unset -v ${PALUDIS_EBUILD_MUST_NOT_SET_VARIABLES}
unset -v ${PALUDIS_SOURCE_MERGED_VARIABLES} ${PALUDIS_BRACKET_MERGED_VARIABLES}
for paludis_v in ${PALUDIS_MUST_NOT_CHANGE_VARIABLES} ; do
local paludis_saved_${paludis_v}
eval paludis_saved_${paludis_v}='${!paludis_v}'
done
local paludis_shopts=$(shopt -p)
[[ -n ${PALUDIS_SHELL_OPTIONS_GLOBAL} ]] && shopt -s ${PALUDIS_SHELL_OPTIONS_GLOBAL}
if [[ ! -f ${1} ]]; then
[[ -r ${1} ]] || die "Ebuild '${1}' cannot be read"
die "Ebuild '${1}' is not a file"
fi
source ${1} || die "Error sourcing ebuild '${1}'"
eval "${paludis_shopts}"
# we may or may not use this later
PALUDIS_EBUILD_RDEPEND_WAS_SET=
PALUDIS_EBUILD_DEPEND="${DEPEND}"
[[ ${RDEPEND+set} != set ]] || PALUDIS_EBUILD_RDEPEND_WAS_SET=true
for paludis_v in ${PALUDIS_SOURCE_MERGED_VARIABLES} ; do
paludis_e_v=E_${paludis_v}
eval ${paludis_v}='"${!paludis_v} ${!paludis_e_v}"'
done
for paludis_v in ${PALUDIS_BRACKET_MERGED_VARIABLES} ; do
paludis_e_v=E_${paludis_v}
if [[ -z "${!paludis_v}" ]] ; then
eval ${paludis_v}='"${!paludis_e_v}"'
elif has "${paludis_v}" ${PALUDIS_BRACKET_MERGED_VARIABLES_ANNOTATABLE} ; then
eval ${paludis_v}='"( ${!paludis_v} ) [[ '\
${PALUDIS_BRACKET_MERGED_VARIABLES_ANNOTATION}' = [ '${1##*/}' ] ]] ${!paludis_e_v}"'
else
eval ${paludis_v}='"( ${!paludis_v} ) ${!paludis_e_v}"'
fi
done
for paludis_v in ${PALUDIS_MUST_NOT_CHANGE_VARIABLES} ; do
local paludis_s_v=paludis_saved_${paludis_v}
if [[ -n ${!paludis_s_v} ]] && [[ ${!paludis_v} != ${!paludis_s_v} ]] ; then
ebuild_notice "qa" \
"Ebuild ${1} illegally tried to change ${paludis_v} from '${!paludis_s_v}' to '${!paludis_v}'"
eval ${paludis_v}='${!paludis_s_v}'
fi
done
for paludis_v in ${PALUDIS_MUST_NOT_CHANGE_AFTER_SOURCE_VARIABLES} ; do
local paludis_s_v=PALUDIS_SAVE_GLOBAL_SCOPE_${paludis_v}
export ${paludis_s_v}="$(declare -p ${paludis_v} 2>/dev/null)"
done
local paludis_p
for paludis_p in ${PALUDIS_MUST_NOT_SET_VARS_STARTING_WITH} ; do
for paludis_v in $(eval echo \${!${paludis_p}*}) ; do
has ${paludis_v} ${PALUDIS_MUST_NOT_CHANGE_AFTER_SOURCE_VARIABLES} ||
die "${paludis_v} starts with ${paludis_p} but isn't a known variable name"
done
done
PALUDIS_DECLARED_FUNCTIONS=$(declare -F | while read paludis_v ; do
echo -n ${paludis_v#declare -f } " "
done )
}
ebuild_load_em_up_dan()
{
export CONFIG_PROTECT=${PALUDIS_CONFIG_PROTECT}
export CONFIG_PROTECT_MASK=${PALUDIS_CONFIG_PROTECT_MASK}
local paludis_save_vars=$(eval echo ${PALUDIS_SAVE_VARIABLES} )
local paludis_save_base_vars=$(eval echo ${PALUDIS_SAVE_BASE_VARIABLES} )
local paludis_save_unmodifiable_vars=$(eval echo ${PALUDIS_SAVE_UNMODIFIABLE_VARIABLES} )
local paludis_check_save_vars=${paludis_save_vars}
local paludis_check_base_vars=${paludis_save_base_vars}
local paludis_check_unmodifiable_vars=${paludis_save_unmodifiable_vars}
local paludis_var
for paludis_var in ${paludis_save_vars} ${paludis_save_base_vars} ${paludis_save_unmodifiable_vars} ; do
local paludis_save_var_${paludis_var}
eval paludis_save_var_${paludis_var}='${!paludis_var}'
done
if [[ -e ${ROOT}/etc/profile.env ]] && ! source "${ROOT}"/etc/profile.env; then
echo "error sourcing ${ROOT}/etc/profile.env" >&2
exit 126
fi
ebuild_sanitise_envvars
if [[ -n ${PALUDIS_PROFILES_DIRS:-${PALUDIS_PROFILE_DIRS}} ]] ; then
for paludis_var in ${PALUDIS_PROFILES_DIRS:-${PALUDIS_PROFILE_DIRS}} ; do
ebuild_source_profile "$(canonicalise "${paludis_var}")"
done
elif [[ -n ${PALUDIS_PROFILE_DIR} ]] ; then
ebuild_source_profile "$(canonicalise "${PALUDIS_PROFILE_DIR}")"
fi
unset ${paludis_save_vars} ${paludis_save_base_vars}
local paludis_f
for paludis_f in ${PALUDIS_BASHRC_FILES} ; do
if [[ -f ${paludis_f} ]] ; then
ebuild_notice "debug" "Loading bashrc file ${paludis_f}"
local paludis_old_set=${-}
set -a
source ${paludis_f}
[[ ${paludis_old_set} == *a* ]] || set +a
else
ebuild_notice "debug" "Skipping bashrc file ${paludis_f}"
fi
for paludis_var in ${paludis_check_save_vars} ; do
if [[ -n ${!paludis_var} ]] ; then
die "${paludis_f} attempted to set \$${paludis_var}, which must not be set in bashrc"
fi
done
for paludis_var in ${paludis_check_save_unmodifiable_vars} ; do
local paludis_s_var=paludis_save_var_${paludis_var}
if [[ "${!paludis_s_var}" != "${!paludis_var}" ]] ; then
die "${paludis_f} attempted to modify \$${var}, which must not be modified in bashrc"
fi
done
done
for paludis_var in ${paludis_save_vars} ; do
local paludis_s_var=paludis_save_var_${paludis_var}
eval ${paludis_var}='${!paludis_s_var}'
done
for paludis_var in ${paludis_save_base_vars} ; do
local paludis_s_var=paludis_save_var_${paludis_var}
eval ${paludis_var}='"${!paludis_s_var} $(echo ${!paludis_var})"'
done
if [[ -z ${PALUDIS_DO_NOTHING_SANDBOXY} ]] ; then
if [[ -n ${CCACHE_DIR} ]]; then
export SANDBOX_WRITE=${SANDBOX_WRITE}:${CCACHE_DIR}
esandbox check 2>/dev/null && esandbox allow "${CCACHE_DIR}"
fi
if [[ -n ${TMPDIR} ]] && esandbox check 2>/dev/null; then
local tmpdirc="$(canonicalise "${TMPDIR}")"
esandbox allow_net unix:"${tmpdirc}" unix-abstract:"${tmpdirc}"
unset tmpdirc
fi
fi
[[ -z ${CBUILD} ]] && export CBUILD=${CHOST}
export REAL_CHOST=${CHOST}
ebuild_load_environment
if [[ ${EBUILD} != - ]] ; then
ebuild_load_ebuild "${EBUILD}"
fi
}
perform_hook()
{
export HOOK=${1}
ebuild_notice "debug" "Starting hook '${HOOK}'"
local old_sandbox_on="${SANDBOX_ON}"
local old_box_enabled
esandbox enabled 2>/dev/null && old_box_enabled=true || old_box_enabled=false
if [[ -z "${PALUDIS_DO_NOTHING_SANDBOXY}" ]]; then
export SANDBOX_ON="0"
if esandbox check 2>/dev/null; then
esandbox disable || ebuild_notice "warning" "esandbox disable returned failure"
fi
fi
local hook_dir
for hook_dir in ${PALUDIS_HOOK_DIRS} ; do
[[ -d "${hook_dir}/${HOOK}" ]] || continue
local hook_file
for hook_file in "${hook_dir}/${HOOK}/"*.bash ; do
[[ -e "${hook_file}" ]] || continue
ebuild_notice "debug" "Starting hook script '${hook_file}' for '${HOOK}'"
if ! ( source "${hook_file}" ) ; then
ebuild_notice "warning" "Hook '${hook_file}' returned failure"
else
ebuild_notice "debug" "Hook '${hook_file}' returned success"
fi
done
done
if [[ -z "${PALUDIS_DO_NOTHING_SANDBOXY}" ]]; then
export SANDBOX_ON="${old_sandbox_on}"
if esandbox check 2>/dev/null; then
if $old_box_enabled; then
esandbox enable || ebuild_notice "warning" "esandbox enable returned failure"
else
esandbox disable || ebuild_notice "warning" "esandbox disable returned failure"
fi
fi
fi
true
}
paludis_phase_to_function_name() {
local p
for p in builtin src pkg; do
if has ${p}_${1} ${PALUDIS_EBUILD_FUNCTIONS}; then
echo ${p}_${1}
return
fi
done
die "Usage error: Unknown phase '${1}'"
}
ebuild_main()
{
if ! [[ -e /proc/self ]] && [[ "$(uname -s)" == Linux ]] ; then
ebuild_notice "warning" "/proc appears to be unmounted or unreadable."
ebuild_notice "warning" "This will cause problems."
fi
# this is fatal in builtin_init, but warn early for good measure
if [[ -z "${PALUDIS_TMPDIR}" ]] ; then
ebuild_notice "warning" "PALUDIS_TMPDIR unset or empty."
elif ! cd "${PALUDIS_TMPDIR}" ; then
ebuild_notice "warning" "Could not change directory to ${PALUDIS_TMPDIR}."
fi
local action
export EBUILD="${1}"
shift
ebuild_notice "debug" "Using ebuild '${EBUILD}', EAPI before source is '${EAPI}'"
# If we're running under sandbox lock magic commands when execve() is called.
if esandbox check 2>/dev/null; then
esandbox exec_lock || ebuild_notice "warning" "esandbox exec_lock returned failure"
fi
if [[ ${#@} -ge 2 ]] ; then
ebuild_section "Running ebuild phases $@ as $(id -un ):$(id -gn )..."
else
ebuild_section "Running ebuild phase $@ as $(id -un ):$(id -gn )..."
fi
for action in $@ ; do
ebuild_load_module $(paludis_phase_to_function_name "${action}")
done
for action in $@ ; do
export ${PALUDIS_EBUILD_PHASE_VAR}="${action}"
[[ -n ${PALUDIS_EBUILD_PHASE_FUNC_VAR} ]] && export ${PALUDIS_EBUILD_PHASE_FUNC_VAR}="$(paludis_phase_to_function_name "${action}")"
perform_hook ebuild_${action}_pre
if [[ ${action} == metadata ]]; then
# Ban execve() calls if we're running under sandbox
if esandbox check 2>/dev/null; then
esandbox enable_exec || ebuild_notice "warning" "esandbox enable_exec returned failure"
else
for f in cut tr date ; do
eval "${f}() { ebuild_notice qa 'global scope ${f}' ; $(type -P ${f} ) \"\$@\" ; }"
done
fi
for f in locked_pipe_command ; do
eval "${f}() { $(type -P ${f} ) \"\$@\" ; }"
if esandbox check 2>/dev/null; then
esandbox allow_exec "$(type -P ${f})"
fi
done
PATH="" ebuild_load_ebuild "${EBUILD}"
# Unban execve() calls if we're running under sandbox
if esandbox check 2>/dev/null; then
esandbox disable_exec || ebuild_notice "warning" "esandbox disable_exec returned failure"
fi
fi
if [[ ${#@} -eq 1 ]] && [[ ${action} == variable || ${action} == pretend || ${action} == bad_options ]]; then
ebuild_load_em_up_dan
fi
# Restrict network access if running under sandbox
if [[ $action != unpack ]] && [[ $action != fetch_extra ]] ; then
if esandbox check 2>/dev/null; then
esandbox enable_net || ebuild_notice "warning" "esandbox enable_net returned failure"
fi
fi
${PALUDIS_F_FUNCTION_PREFIX:-ebuild_f}_${action}
local paludis_ebuild_phase_status="${?}"
if [[ $action != unpack ]] && [[ $action != fetch_extra ]] ; then
if esandbox check 2>/dev/null; then
esandbox disable_net || ebuild_notice "warning" "esandbox disable_net returned failure"
fi
fi
if [[ ${paludis_ebuild_phase_status} -ne 0 ]]; then
perform_hook ebuild_${action}_fail
die "${action} failed"
fi
perform_hook ebuild_${action}_post
done
if [[ ${#@} -ge 2 ]] ; then
ebuild_section "Completed ebuild phases $@"
else
ebuild_section "Completed ebuild phase $@"
fi
}
ebuild_main "$@"