Change setup.py to respect the SYSROOT environment variable.
This is needed to build the installed standard modules (e.g. readline & zlib).

--- a/setup.py
+++ b/setup.py
@@ -57,6 +57,8 @@ MACOS = (HOST_PLATFORM == 'darwin')
 AIX = (HOST_PLATFORM.startswith('aix'))
 VXWORKS = ('vxworks' in HOST_PLATFORM)
 
+# We must respect the user specified sysroot!
+GENTOO_SYSROOT = os.getenv('SYSROOT', '')
 
 SUMMARY = """
 Python is an interpreted, interactive, object-oriented programming
@@ -126,6 +128,15 @@ def sysroot_paths(make_vars, subdirs):
       headers or libraries.
     """
 
+    if GENTOO_SYSROOT:
+        dirs = []
+        for subdir in subdirs:
+            subdir.lstrip(os.sep)
+            path = os.path.join(GENTOO_SYSROOT, subdir)
+            if os.path.isdir(path):
+                dirs.append(path)
+        return dirs
+
     dirs = []
     for var_name in make_vars:
         var = sysconfig.get_config_var(var_name)
@@ -653,8 +664,8 @@ class PyBuildExt(build_ext):
         # directories (i.e. '.' and 'Include') must be first.  See issue
         # 10520.
         if not CROSS_COMPILING:
-            add_dir_to_list(self.compiler.library_dirs, '/usr/local/@@GENTOO_LIBDIR@@')
-            add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+            add_dir_to_list(self.compiler.library_dirs, GENTOO_SYSROOT + '/usr/local/@@GENTOO_LIBDIR@@')
+            add_dir_to_list(self.compiler.include_dirs, GENTOO_SYSROOT + '/usr/local/include')
         # only change this for cross builds for 3.3, issues on Mageia
         if CROSS_COMPILING:
             self.add_cross_compiling_paths()
@@ -670,9 +681,9 @@ class PyBuildExt(build_ext):
             # building a framework with different architectures than
             # the one that is currently installed (issue #7473)
             add_dir_to_list(self.compiler.library_dirs,
-                            sysconfig.get_config_var("LIBDIR"))
+                            GENTOO_SYSROOT + sysconfig.get_config_var("LIBDIR"))
             add_dir_to_list(self.compiler.include_dirs,
-                            sysconfig.get_config_var("INCLUDEDIR"))
+                            GENTOO_SYSROOT + sysconfig.get_config_var("INCLUDEDIR"))
 
         system_lib_dirs = ['/@@GENTOO_LIBDIR@@', '/usr/@@GENTOO_LIBDIR@@']
         system_include_dirs = ['/usr/include']
@@ -957,11 +968,11 @@ class PyBuildExt(build_ext):
             elif curses_library:
                 readline_libs.append(curses_library)
             elif self.compiler.find_library_file(self.lib_dirs +
-                                                     ['/usr/@@GENTOO_LIBDIR@@/termcap'],
+                                                     [GENTOO_SYSROOT + '/usr/@@GENTOO_LIBDIR@@/termcap'],
                                                      'termcap'):
                 readline_libs.append('termcap')
             self.add(Extension('readline', ['readline.c'],
-                               library_dirs=['/usr/@@GENTOO_LIBDIR@@/termcap'],
+                               library_dirs=[GENTOO_SYSROOT + '/usr/@@GENTOO_LIBDIR@@/termcap'],
                                extra_link_args=readline_extra_link_args,
                                libraries=readline_libs))
         else:
@@ -975,7 +986,7 @@ class PyBuildExt(build_ext):
         if curses_library == 'ncursesw':
             curses_defines.append(('HAVE_NCURSESW', '1'))
             if not CROSS_COMPILING:
-                curses_includes.append('/usr/include/ncursesw')
+                curses_includes.append(GENTOO_SYSROOT + '/usr/include/ncursesw')
             # Bug 1464056: If _curses.so links with ncursesw,
             # _curses_panel.so must link with panelw.
             panel_library = 'panelw'
@@ -1127,6 +1138,7 @@ class PyBuildExt(build_ext):
             db_inc_paths.append('/usr/local/include/db3%d' % x)
             db_inc_paths.append('/pkg/db-3.%d/include' % x)
             db_inc_paths.append('/opt/db-3.%d/include' % x)
+        db_inc_paths = [GENTOO_SYSROOT + x for x in db_inc_paths]
 
         if CROSS_COMPILING:
             db_inc_paths = []
@@ -1373,7 +1385,7 @@ class PyBuildExt(build_ext):
             sysroot = macosx_sdk_root()
 
         for d_ in self.inc_dirs + sqlite_inc_paths:
-            d = d_
+            d = GENTOO_SYSROOT + d_
             if MACOS and is_macosx_sdk_path(d):
                 d = os.path.join(sysroot, d[1:])
 
@@ -1678,7 +1690,7 @@ class PyBuildExt(build_ext):
 
     def detect_uuid(self):
         # Build the _uuid module if possible
-        uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
+        uuid_incs = find_file("uuid.h", self.inc_dirs, [GENTOO_SYSROOT + "/usr/include/uuid"])
         if uuid_incs is not None:
             if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
                 uuid_libs = ['uuid']
@@ -1803,7 +1815,7 @@ class PyBuildExt(build_ext):
         # For 8.4a2, the X11 headers are not included. Rather than include a
         # complicated search, this is a hard-coded path. It could bail out
         # if X11 libs are not found...
-        include_dirs.append('/usr/X11R6/include')
+        include_dirs.append(GENTOO_SYSROOT + '/usr/X11R6/include')
         frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
 
         # All existing framework builds of Tcl/Tk don't support 64-bit
@@ -1917,8 +1929,8 @@ class PyBuildExt(build_ext):
             added_lib_dirs.append('/usr/X11R5/@@GENTOO_LIBDIR@@')
         else:
             # Assume default location for X11
-            include_dirs.append('/usr/X11/include')
-            added_lib_dirs.append('/usr/X11/@@GENTOO_LIBDIR@@')
+            include_dirs.append(GENTOO_SYSROOT + '/usr/X11/include')
+            added_lib_dirs.append(GENTOO_SYSROOT + '/usr/X11/@@GENTOO_LIBDIR@@')
 
         # If Cygwin, then verify that X is installed before proceeding
         if CYGWIN:
