Add some cross-compilation fixes to distutils

Inspired by work done by Marc Kleine-Budde <mkl@pengutronix.de> in
PTXdist.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 Lib/distutils/sysconfig.py |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

Index: b/Lib/distutils/sysconfig.py
===================================================================
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -18,14 +18,38 @@
 
 from distutils.errors import DistutilsPlatformError
 
-# These are needed in a couple of spots, so just compute them once.
-PREFIX = os.path.normpath(sys.prefix)
-EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+if os.environ.get('CROSS_COMPILING') == 'yes':
+    _sysroot=os.environ.get('_python_sysroot')
+    PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_prefix'))
+    EXEC_PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_exec_prefix'))
+    # In the cross-compilation case, we have two cases:
+    #
+    #  1/ We're currently cross-compiling Python itself. In this case,
+    #  EXECUTABLE_DIRNAME should point to the source directory of the
+    #  target Python, so that the rest of the code, especially the
+    #  _python_build() function will properly understand that we are
+    #  building Python itself. In this case, _python_srcdir is
+    #  defined.
+    #
+    #  2/ We're currently cross-compiling third party Python
+    #  modules. In this case, EXECUTABLE_DIRNAME should point to where
+    #  the target python executable is installed in the sysroot, so
+    #  that the proper Makefile is going to be read. In this case,
+    #  _python_srcdir is not defined.
+    #
+    if os.environ.get('_python_srcdir') is not None:
+        EXECUTABLE_DIRNAME = os.environ.get('_python_srcdir')
+    else:
+        EXECUTABLE_DIRNAME = os.path.join(_sysroot, "usr/bin")
+else:
+    PREFIX = os.path.normpath(sys.prefix)
+    EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+    EXECUTABLE_DIRNAME = os.path.dirname(os.path.realpath(sys.executable))
 
 # Path to the base directory of the project. On Windows the binary may
 # live in project/PCBuild9.  If we're dealing with an x64 Windows build,
 # it'll live in project/PCbuild/amd64.
-project_base = os.path.dirname(os.path.abspath(sys.executable))
+project_base = EXECUTABLE_DIRNAME
 if os.name == "nt" and "pcbuild" in project_base[-8:].lower():
     project_base = os.path.abspath(os.path.join(project_base, os.path.pardir))
 # PC/VS7.1
@@ -74,7 +98,7 @@
 
     if os.name == "posix":
         if python_build:
-            buildir = os.path.dirname(sys.executable)
+            buildir = EXECUTABLE_DIRNAME
             if plat_specific:
                 # python.h is located in the buildir
                 inc_dir = buildir
@@ -245,7 +269,7 @@
 def get_makefile_filename():
     """Return full pathname of installed Makefile from the Python build."""
     if python_build:
-        return os.path.join(os.path.dirname(sys.executable), "Makefile")
+        return os.path.join(EXECUTABLE_DIRNAME, "Makefile")
     lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
     return os.path.join(lib_dir, "config", "Makefile")
 
@@ -311,6 +335,11 @@
             # `$$' is a literal `$' in make
             tmpv = v.replace('$$', '')
 
+            # Adjust prefix and exec_prefix when we're cross compiling
+            if os.environ.get('CROSS_COMPILING') == "yes":
+                if n == "prefix" or n == "exec_prefix":
+                    v = _sysroot + v
+
             if "$" in tmpv:
                 notdone[n] = v
             else:
Index: b/configure.in
===================================================================
--- a/configure.in
+++ b/configure.in
@@ -4342,6 +4342,20 @@
 CROSS_COMPILING=$cross_compiling
 AC_SUBST(CROSS_COMPILING)
 
+#
+# Cross compiling
+#
+# special RUNSHARED
+if test "$cross_compiling" = "yes"; then
+    RUNSHARED="\
+               CROSS_COMPILING=yes \
+               _python_cross_host=${ac_cv_host} \
+               _python_srcdir=\"\$(srcdir)\" \
+               _python_prefix=\"\$(prefix)\" \
+               _python_exec_prefix=\"\$(exec_prefix)\""
+fi
+
+
 # generate output files
 AC_CONFIG_FILES(Makefile.pre Modules/Setup.config Misc/python.pc)
 AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix])
Index: b/Lib/distutils/command/build_ext.py
===================================================================
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -237,7 +237,7 @@
         if ((sys.platform.startswith('linux') or sys.platform.startswith('gnu')
              or sys.platform.startswith('sunos'))
             and sysconfig.get_config_var('Py_ENABLE_SHARED')):
-            if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")):
+            if not sysconfig.python_build:
                 # building third party extensions
                 self.library_dirs.append(sysconfig.get_config_var('LIBDIR'))
             else:
