\section{Profile variables}
\label{sec:profile-variables}

This section documents variables that have special meaning, or special behaviour, when defined in a
profile's \t{make.defaults} file.

\subsection{Incremental variables}
\i{Incremental} variables must stack between parent and child profiles in the following manner:
Beginning with the highest parent profile, tokenise the variable's value based on whitespace and
concatenate the lists. Then, for any token $T$ beginning with a hyphen, remove it and any previous
tokens whose value is equal to $T$ with the hyphen removed, or, if $T$ is equal to \t{-*}, remove
all previous values. Note that because of this treatment, the order of tokens in the final result is
arbitrary, not necessarily related to the order of tokens in any given profile. The following
variables must be treated in this fashion:
\begin{compactitem}
\item \t{USE}
\item \t{USE_EXPAND}
\item \t{USE_EXPAND_HIDDEN}
\item \t{CONFIG_PROTECT}
\item \t{CONFIG_PROTECT_MASK}
\end{compactitem}

If the package manager supports any EAPI listed in table~\ref{tab:profile-iuse-injection-table} as
using profile-defined \t{IUSE} injection, the following variables must also be treated
incrementally; otherwise, the following variables may or may not be treated incrementally:
\begin{compactitem}
\item \t{IUSE_IMPLICIT}
\item \t{USE_EXPAND_IMPLICIT}
\item \t{USE_EXPAND_UNPREFIXED}
\end{compactitem}

If the package manager supports any EAPI listed in table~\ref{tab:profile-env-unset} as using
\t{ENV_UNSET}, the following variable must also be treated incrementally; otherwise, it may or
may not be treated incrementally:
\begin{compactitem}
\item \t{ENV_UNSET}
\end{compactitem}

Other variables, except where they affect only package-manager-specific functionality (such as
Portage's \t{FEATURES} variable), must not be treated incrementally---later definitions shall
completely override those in parent profiles.

\ChangeWhenAddingAnEAPI{8}
\begin{centertable}{Profile-defined \t{IUSE} injection for EAPIs}
    \label{tab:profile-iuse-injection-table}
    \begin{tabular}{ll}
      \toprule
      \multicolumn{1}{c}{\textbf{EAPI}} &
      \multicolumn{1}{c}{\textbf{Supports profile-defined \t{IUSE} injection?}} \\
      \midrule
      0, 1, 2, 3, 4     & No  \\
      5, 6, 7, 8        & Yes \\
      \bottomrule
    \end{tabular}
\end{centertable}

\ChangeWhenAddingAnEAPI{8}
\begin{centertable}{Profile-defined unsetting of variables in EAPIs}
    \label{tab:profile-env-unset}
    \begin{tabular}{ll}
      \toprule
      \multicolumn{1}{c}{\textbf{EAPI}} &
      \multicolumn{1}{c}{\textbf{Supports \t{ENV_UNSET}?}} \\
      \midrule
      0, 1, 2, 3, 4, 5, 6 & No  \\
      7, 8                & Yes \\
      \bottomrule
    \end{tabular}
\end{centertable}

\subsection{Specific variables and their meanings}
The following variables have specific meanings when set in profiles.
\begin{description}
\item[ARCH] The system's architecture. Must be a value listed in \t{profiles/arch.list}; see
    section~\ref{sec:profiles-dir} for more information. Must be equal to the primary \t{KEYWORD}
    for this profile.
\item[CONFIG_PROTECT, CONFIG_PROTECT_MASK] Contain whitespace-delimited lists used to control the
    configuration file protection. Described more fully in section~\ref{sec:config-protect}.
\item[USE] Defines the list of default USE flags for this profile. Flags may be added or removed by
    the user's configuration. \t{USE_EXPAND} values must not be specified in this way.
\item[USE_EXPAND] Defines a list of variables which are to be treated incrementally and whose
    contents are to be expanded into the USE variable as passed to ebuilds. See
    section~\ref{sec:use-iuse-handling} for details.
\item[USE_EXPAND_UNPREFIXED] Similar to \t{USE_EXPAND}, but no prefix is used. If the repository
    contains any package using an EAPI supporting profile-defined \t{IUSE} injection (see
    table~\ref{tab:profile-iuse-injection-table}), this list must contain at least \t{ARCH}\@.
    See section~\ref{sec:use-iuse-handling} for details.
\item[USE_EXPAND_HIDDEN] Contains a (possibly empty) subset of names from \t{USE_EXPAND} and
    \t{USE_EXPAND_UNPREFIXED}\@. The package manager may use this set as a hint to avoid
    displaying uninteresting or unhelpful information to an end user.
\item[USE_EXPAND_IMPLICIT, IUSE_IMPLICIT] Used to inject implicit values into \t{IUSE}\@. See
    section~\ref{sec:use-iuse-handling} for details.
\item[ENV_UNSET] Contains a whitespace-delimited list of variables that the package manager shall
    unset. See section~\ref{sec:ebuild-env-vars} for details.
\end{description}

In addition, for EAPIs listed in table~\ref{tab:profile-iuse-injection-table} as supporting profile
defined \t{IUSE} injection, the variables named in \t{USE_EXPAND} and \t{USE_EXPAND_UNPREFIXED}
have special handling as described in section~\ref{sec:use-iuse-handling}.

Any other variables set in \t{make.defaults} must be passed on into the ebuild environment as-is,
and are not required to be interpreted by the package manager.

% 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:
