Add support for a distinct SYSROOT location
This location cannot be prefix-aware as we don't currently have any
variable to represent that. Given that this is intended to be used
with crossdev toolchains under /usr/${CHOST}, that should not
matter. Even if that location is nested within a prefixed system, it
does not need to be aware of that as it is not intended for execution.
Cherry-picked from https://github.com/chewi/portage/tree/sysroot-fixes
Upstream status: Not sent
BUG=chromium:929503
TEST=build_packages
Change-Id: I98f95bc6f2ba9240174ee7d0602cae8868d3f4b1
Reviewed-on: https://chromium-review.googlesource.com/1686967
Tested-by: Chris McDonald <cjmcdonald@chromium.org>
Commit-Ready: Chris McDonald <cjmcdonald@chromium.org>
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/lib/portage/__init__.py b/lib/portage/__init__.py
index 053d197..bec7a26 100644
--- a/lib/portage/__init__.py
+++ b/lib/portage/__init__.py
@@ -561,11 +561,17 @@
clean_env[k] = v
if depcachedir is not None:
clean_env['PORTAGE_DEPCACHEDIR'] = depcachedir
- settings = config(config_root=None, target_root="/",
+ mysettings = config(config_root=None, target_root="/",
env=clean_env, sysroot="/", eprefix=None)
- settings.lock()
- trees._running_eroot = settings['EROOT']
- myroots.append((settings['EROOT'], settings))
+ mysettings.lock()
+ trees._running_eroot = mysettings['EROOT']
+ myroots.append((mysettings['EROOT'], mysettings))
+
+ if settings['SYSROOT'] != '/' and settings['SYSROOT'] != settings['ROOT']:
+ mysettings = config(config_root=settings['SYSROOT'], target_root=settings['SYSROOT'],
+ env=clean_env, sysroot=settings['SYSROOT'], eprefix='')
+ mysettings.lock()
+ myroots.append((mysettings['EROOT'], mysettings))
for myroot, mysettings in myroots:
trees[myroot] = portage.util.LazyItemsDict(trees.get(myroot, {}))
diff --git a/lib/portage/package/ebuild/_config/LocationsManager.py b/lib/portage/package/ebuild/_config/LocationsManager.py
index 36149ce..fe90c08 100644
--- a/lib/portage/package/ebuild/_config/LocationsManager.py
+++ b/lib/portage/package/ebuild/_config/LocationsManager.py
@@ -309,6 +309,12 @@
self.target_root = normalize_path(os.path.abspath(
self.target_root)).rstrip(os.path.sep) + os.path.sep
+ if self.sysroot != "/" and self.target_root == "/":
+ writemsg(_("!!! Error: SYSROOT (currently %s) must "
+ "be set to / when ROOT is /.\n") % self.sysroot,
+ noiselevel=-1)
+ raise InvalidLocation(self.sysroot)
+
ensure_dirs(self.target_root)
self._check_var_directory("ROOT", self.target_root)