Add some cross-compilation fixes to distutils Inspired by work done by Marc Kleine-Budde in PTXdist. Signed-off-by: Thomas Petazzoni --- 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: