\chapter{The ebuild environment}

\input{ebuild-env-vars.tex}

\section{The state of variables between functions}
\label{sec:ebuild-env-state}

Exported and default scope variables are saved between functions. A non-local variable set in a
function earlier in the call sequence must have its value preserved for later functions, including
functions executed as part of a later uninstall.

\note{\t{pkg_pretend} is \emph{not} part of the normal call sequence, and does not take part in
environment saving.}

The visibility of variables defined at the top level of an ebuild or eclass is unspecified.
Depending on the implementation, such variables may behave as if evaluated in global scope or as if
evaluated within a function body; ebuilds must not rely upon either behaviour. Consequently, at the
top level, the \t{local} builtin may not be used, and the \t{declare} builtin may only be used with
the \t{-g} option when defining variables.

Variables that were exported must remain exported in later functions; variables with default
visibility may retain default visibility or be exported. Variables with special meanings to the
package manager are excluded from this rule.

Global variables must only contain invariant values (see section~\ref{sec:metadata-invariance}).
If a global variable's value is invariant, it may have the value that would be generated at any
given point in the build sequence.

This is demonstrated by code listing~\ref{lst:env-saving}.

\begin{listing}
\caption{Environment state between functions} \label{lst:env-saving}
\begin{verbatim}
GLOBAL_VARIABLE="a"

src_compile()
{
    GLOBAL_VARIABLE="b"
    DEFAULT_VARIABLE="c"
    export EXPORTED_VARIABLE="d"
    local LOCAL_VARIABLE="e"
}

src_install(){
    [[ ${GLOBAL_VARIABLE} == "a" ]] \
        || [[ ${GLOBAL_VARIABLE} == "b" ]] \
        || die "broken env saving for globals"

    [[ ${DEFAULT_VARIABLE} == "c" ]] \
        || die "broken env saving for default"

    [[ ${EXPORTED_VARIABLE} == "d" ]] \
        || die "broken env saving for exported"

    [[ $(printenv EXPORTED_VARIABLE ) == "d" ]] \
        || die "broken env saving for exported"

    [[ -z ${LOCAL_VARIABLE} ]] \
        || die "broken env saving for locals"
}
\end{verbatim}
\end{listing}

\section{The state of the system between functions}

For the sake of this section:
\nobreakpar
\begin{compactitem}
\item Variancy is any package manager action that modifies either \t{ROOT} or \t{/} in any way that
    isn't merely a simple addition of something that doesn't alter other packages. This includes
    any non-default call to any \t{pkg} phase function except \t{pkg_setup}, a merge of any package
    or an unmerge of any package.
\item As an exception, changes to \t{DISTDIR} do not count as variancy.
\item The \t{pkg_setup} function may be assumed not to introduce variancy. Thus, ebuilds must not
    perform variant actions in this phase.
\end{compactitem}

The following exclusivity and invariancy requirements are mandated:
\nobreakpar
\begin{compactitem}
\item No variancy shall be introduced at any point between a package's \t{pkg_setup} being started
    up to the point that that package is merged, except for any variancy introduced by that package.
\item There must be no variancy between a package's \t{pkg_setup} and a package's \t{pkg_postinst},
    except for any variancy introduced by that package.
\item Any non-default \t{pkg} phase function must be run exclusively.
\item Each phase function must be called at most once during the build process for any given
    package.
\end{compactitem}

% vim: set filetype=tex fileencoding=utf8 et tw=100 spell spelllang=en :

%%% Local Variables:
%%% mode: latex
%%% TeX-master: "pms"
%%% LaTeX-indent-level: 4
%%% LaTeX-item-indent: 0
%%% TeX-brace-indent-level: 4
%%% fill-column: 100
%%% End:
