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)
