commit:     a41dacf7926c0242678300a8e1770df84029e8a4
Author:     James Le Cuirot <chewi <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 23 21:49:43 2018 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue May  1 08:28:43 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=a41dacf7

Export SYSROOT and ESYSROOT in ebuild env in EAPI 7

SYSROOT is the new destination for DEPEND, however it must currently
be equal either / or ROOT. This is partly to simplify the
implementation and partly because supporting a third separate
destination would not be of much practical benefit anyway.

Bug: https://bugs.gentoo.org/317337

 bin/eapi.sh                                        |  4 ++++
 bin/phase-functions.sh                             |  6 ++++++
 pym/_emerge/actions.py                             |  2 +-
 pym/_emerge/depgraph.py                            |  4 +++-
 pym/portage/__init__.py                            |  6 +++---
 pym/portage/_legacy_globals.py                     |  3 ++-
 pym/portage/eapi.py                                |  7 ++++++-
 .../package/ebuild/_config/LocationsManager.py     | 19 +++++++++++++++--
 pym/portage/package/ebuild/config.py               | 24 +++++++++++++++++++---
 9 files changed, 63 insertions(+), 12 deletions(-)

diff --git a/bin/eapi.sh b/bin/eapi.sh
index 40af7b776..b4d8c9a90 100644
--- a/bin/eapi.sh
+++ b/bin/eapi.sh
@@ -30,6 +30,10 @@ ___eapi_has_prefix_variables() {
        [[ ! ${1-${EAPI-0}} =~ ^(0|1|2)$ || " ${FEATURES} " == *" force-prefix 
"* ]]
 }
 
+___eapi_has_SYSROOT() {
+       [[ ! ${1-${EAPI-0}} =~ 
^(0|1|2|3|4|4-python|4-slot-abi|5|5-hdepend|5-progress|6)$ ]]
+}
+
 ___eapi_has_HDEPEND() {
        [[ ${1-${EAPI-0}} =~ ^(5-hdepend)$ ]]
 }

diff --git a/bin/phase-functions.sh b/bin/phase-functions.sh
index 3de8d01b5..1e096cddc 100644
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@ -100,10 +100,16 @@ __filter_readonly_variables() {
        filtered_vars="$readonly_bash_vars $bash_misc_vars
                $PORTAGE_READONLY_VARS $misc_garbage_vars"
 
+       if ___eapi_has_SYSROOT; then
+               filtered_vars+=" SYSROOT"
+       fi
        # Don't filter/interfere with prefix variables unless they are
        # supported by the current EAPI.
        if ___eapi_has_prefix_variables; then
                filtered_vars+=" ED EPREFIX EROOT"
+               if ___eapi_has_SYSROOT; then
+                       filtered_vars+=" ESYSROOT"
+               fi
        fi
        if ___eapi_has_PORTDIR_ECLASSDIR; then
                filtered_vars+=" PORTDIR ECLASSDIR"

diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
index 1a289f523..70fb8d3b4 100644
--- a/pym/_emerge/actions.py
+++ b/pym/_emerge/actions.py
@@ -2438,7 +2438,7 @@ def load_emerge_config(emerge_config=None, env=None, 
**kargs):
        env = os.environ if env is None else env
        kwargs = {'env': env}
        for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"), 
("target_root", "ROOT"),
-                       ("eprefix", "EPREFIX")):
+                       ("sysroot", "SYSROOT"), ("eprefix", "EPREFIX")):
                v = env.get(envvar)
                if v and v.strip():
                        kwargs[k] = v

diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 67f912f5e..fbd16ad98 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -3322,8 +3322,10 @@ class depgraph(object):
                if removal_action:
                        depend_root = myroot
                else:
-                       if eapi_attrs.bdepend or eapi_attrs.hdepend:
+                       if eapi_attrs.hdepend:
                                depend_root = myroot
+                       elif eapi_attrs.bdepend:
+                               depend_root = 
pkg.root_config.settings["ESYSROOT"]
                        else:
                                depend_root = 
self._frozen_config._running_root.root
                                root_deps = 
self._frozen_config.myopts.get("--root-deps")

diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 137351a69..15c404f6f 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -525,7 +525,7 @@ class _trees_dict(dict):
                self._target_eroot = None
 
 def create_trees(config_root=None, target_root=None, trees=None, env=None,
-       eprefix=None):
+       sysroot=None, eprefix=None):
 
        if trees is None:
                trees = _trees_dict()
@@ -538,7 +538,7 @@ def create_trees(config_root=None, target_root=None, 
trees=None, env=None,
                env = os.environ
 
        settings = config(config_root=config_root, target_root=target_root,
-               env=env, eprefix=eprefix)
+               env=env, sysroot=sysroot, eprefix=eprefix)
        settings.lock()
 
        depcachedir = settings.get('PORTAGE_DEPCACHEDIR')
@@ -562,7 +562,7 @@ def create_trees(config_root=None, target_root=None, 
trees=None, env=None,
                if depcachedir is not None:
                        clean_env['PORTAGE_DEPCACHEDIR'] = depcachedir
                settings = config(config_root=None, target_root="/",
-                       env=clean_env, eprefix=None)
+                       env=clean_env, sysroot="/", eprefix=None)
                settings.lock()
                trees._running_eroot = settings['EROOT']
                myroots.append((settings['EROOT'], settings))

diff --git a/pym/portage/_legacy_globals.py b/pym/portage/_legacy_globals.py
index f916cc66b..45113d150 100644
--- a/pym/portage/_legacy_globals.py
+++ b/pym/portage/_legacy_globals.py
@@ -28,7 +28,8 @@ def _get_legacy_global(name):
 
        kwargs = {}
        for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"),
-                       ("target_root", "ROOT"), ("eprefix", "EPREFIX")):
+                       ("target_root", "ROOT"), ("sysroot", "SYSROOT"),
+                       ("eprefix", "EPREFIX")):
                kwargs[k] = os.environ.get(envvar)
 
        portage._initializing_globals = True

diff --git a/pym/portage/eapi.py b/pym/portage/eapi.py
index b0f993a14..f34e19ac9 100644
--- a/pym/portage/eapi.py
+++ b/pym/portage/eapi.py
@@ -123,6 +123,10 @@ def eapi_path_variables_end_with_trailing_slash(eapi):
        return eapi in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi",
                        "5", "5-progress", "6")
 
+def eapi_has_sysroot(eapi):
+       return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi",
+                       "5", "5-progress", "5-hdepend", "6")
+
 _eapi_attrs = collections.namedtuple('_eapi_attrs',
        'allows_package_provided '
        'bdepend dots_in_PN dots_in_use_flags exports_EBUILD_PHASE_FUNC '
@@ -132,7 +136,7 @@ _eapi_attrs = collections.namedtuple('_eapi_attrs',
        'path_variables_end_with_trailing_slash '
        'repo_deps required_use required_use_at_most_one_of slot_operator 
slot_deps '
        'src_uri_arrows strong_blocks use_deps use_dep_defaults '
-       'empty_groups_always_true')
+       'empty_groups_always_true sysroot')
 
 _eapi_attrs_cache = {}
 
@@ -176,6 +180,7 @@ def _get_eapi_attrs(eapi):
                slot_operator = (eapi is None or eapi_has_slot_operator(eapi)),
                src_uri_arrows = (eapi is None or 
eapi_has_src_uri_arrows(eapi)),
                strong_blocks = (eapi is None or eapi_has_strong_blocks(eapi)),
+               sysroot = (eapi is None or eapi_has_sysroot(eapi)),
                use_deps = (eapi is None or eapi_has_use_deps(eapi)),
                use_dep_defaults = (eapi is None or 
eapi_has_use_dep_defaults(eapi))
        )

diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py 
b/pym/portage/package/ebuild/_config/LocationsManager.py
index 55b8c089a..3a2697145 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -16,7 +16,7 @@ from portage import os, eapi_is_supported, _encodings, 
_unicode_encode
 from portage.const import CUSTOM_PROFILE_PATH, GLOBAL_CONFIG_PATH, \
        PROFILE_PATH, USER_CONFIG_PATH
 from portage.eapi import 
eapi_allows_directories_on_profile_level_and_repository_level
-from portage.exception import DirectoryNotFound, ParseError
+from portage.exception import DirectoryNotFound, InvalidLocation, ParseError
 from portage.localization import _
 from portage.util import ensure_dirs, grabfile, \
        normalize_path, read_corresponding_eapi_file, shlex_split, writemsg
@@ -40,12 +40,13 @@ _allow_parent_colon = frozenset(
 class LocationsManager(object):
 
        def __init__(self, config_root=None, eprefix=None, 
config_profile_path=None, local_config=True, \
-               target_root=None):
+               target_root=None, sysroot=None):
                self.user_profile_dir = None
                self._local_repo_conf_path = None
                self.eprefix = eprefix
                self.config_root = config_root
                self.target_root = target_root
+               self.sysroot = sysroot
                self._user_config = local_config
 
                if self.eprefix is None:
@@ -65,6 +66,13 @@ class LocationsManager(object):
                self.abs_user_config = os.path.join(self.config_root, 
USER_CONFIG_PATH)
                self.config_profile_path = config_profile_path
 
+               if self.sysroot is None:
+                       self.sysroot = "/"
+               else:
+                       self.sysroot = 
normalize_path(os.path.abspath(self.sysroot)).rstrip(os.sep) + os.sep
+
+               self.esysroot = self.sysroot.rstrip(os.sep) + self.eprefix + 
os.sep
+
        def load_profiles(self, repositories, known_repository_paths):
                known_repository_paths = set(os.path.realpath(x)
                        for x in known_repository_paths)
@@ -298,6 +306,13 @@ class LocationsManager(object):
                self.target_root = normalize_path(os.path.abspath(
                        self.target_root)).rstrip(os.path.sep) + os.path.sep
 
+               if self.sysroot != "/" and self.sysroot != self.target_root:
+                       writemsg(_("!!! Error: SYSROOT (currently %s) must "
+                               "equal / or ROOT (currently %s).\n") %
+                               (self.sysroot, self.target_root),
+                               noiselevel=-1)
+                       raise InvalidLocation(self.sysroot)
+
                ensure_dirs(self.target_root)
                self._check_var_directory("ROOT", self.target_root)
 

diff --git a/pym/portage/package/ebuild/config.py 
b/pym/portage/package/ebuild/config.py
index 071385684..e7a047884 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -175,7 +175,7 @@ class config(object):
 
        def __init__(self, clone=None, mycpv=None, config_profile_path=None,
                config_incrementals=None, config_root=None, target_root=None,
-               eprefix=None, local_config=True, env=None,
+               sysroot=None, eprefix=None, local_config=True, env=None,
                _unmatched_removal=False, repositories=None):
                """
                @param clone: If provided, init will use deepcopy to copy by 
value the instance.
@@ -193,6 +193,9 @@ class config(object):
                @param target_root: the target root, which typically 
corresponds to the
                        value of the $ROOT env variable (default is /)
                @type target_root: String
+               @param sysroot: the sysroot to build against, which typically 
corresponds
+                        to the value of the $SYSROOT env variable (default is 
/)
+               @type sysroot: String
                @param eprefix: set the EPREFIX variable (default is 
portage.const.EPREFIX)
                @type eprefix: String
                @param local_config: Enables loading of local config 
(/etc/portage); used most by repoman to
@@ -335,11 +338,14 @@ class config(object):
 
                        locations_manager = 
LocationsManager(config_root=config_root,
                                config_profile_path=config_profile_path, 
eprefix=eprefix,
-                               local_config=local_config, 
target_root=target_root)
+                               local_config=local_config, 
target_root=target_root,
+                               sysroot=sysroot)
                        self._locations_manager = locations_manager
 
                        eprefix = locations_manager.eprefix
                        config_root = locations_manager.config_root
+                       sysroot = locations_manager.sysroot
+                       esysroot = locations_manager.esysroot
                        abs_user_config = locations_manager.abs_user_config
                        make_conf_paths = [
                                os.path.join(config_root, 'etc', 'make.conf'),
@@ -499,8 +505,10 @@ class config(object):
                        #Loading Repositories
                        self["PORTAGE_CONFIGROOT"] = config_root
                        self["ROOT"] = target_root
+                       self["SYSROOT"] = sysroot
                        self["EPREFIX"] = eprefix
                        self["EROOT"] = eroot
+                       self["ESYSROOT"] = esysroot
                        known_repos = []
                        portdir = ""
                        portdir_overlay = ""
@@ -664,10 +672,14 @@ class config(object):
                        self.backup_changes("PORTAGE_CONFIGROOT")
                        self["ROOT"] = target_root
                        self.backup_changes("ROOT")
+                       self["SYSROOT"] = sysroot
+                       self.backup_changes("SYSROOT")
                        self["EPREFIX"] = eprefix
                        self.backup_changes("EPREFIX")
                        self["EROOT"] = eroot
                        self.backup_changes("EROOT")
+                       self["ESYSROOT"] = esysroot
+                       self.backup_changes("ESYSROOT")
 
                        # The prefix of the running portage instance is used in 
the
                        # ebuild environment to implement the --host-root 
option for
@@ -2741,6 +2753,11 @@ class config(object):
                if not eapi_exports_merge_type(eapi):
                        mydict.pop("MERGE_TYPE", None)
 
+               src_phase = _phase_func_map.get(phase, '').startswith('src_')
+
+               if not (src_phase and eapi_attrs.sysroot):
+                       mydict.pop("ESYSROOT", None)
+
                # Prefix variables are supported beginning with EAPI 3, or when
                # force-prefix is in FEATURES, since older EAPIs would 
otherwise be
                # useless with prefix configurations. This brings compatibility 
with
@@ -2752,6 +2769,7 @@ class config(object):
                        mydict.pop("ED", None)
                        mydict.pop("EPREFIX", None)
                        mydict.pop("EROOT", None)
+                       mydict.pop("ESYSROOT", None)
 
                if phase not in ("pretend", "setup", "preinst", "postinst") or \
                        not eapi_exports_replace_vars(eapi):
@@ -2788,7 +2806,7 @@ class config(object):
                        mydict.pop("ECLASSDIR", None)
 
                if not eapi_attrs.path_variables_end_with_trailing_slash:
-                       for v in ("D", "ED", "ROOT", "EROOT"):
+                       for v in ("D", "ED", "ROOT", "EROOT", "SYSROOT", 
"ESYSROOT"):
                                if v in mydict:
                                        mydict[v] = 
mydict[v].rstrip(os.path.sep)
 

Reply via email to