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)