Blob Blame History Raw
diff -rupN Python-2.7.13/configure.ac Python-2.7.13-new/configure.ac
--- Python-2.7.13/configure.ac	2017-01-21 01:46:12.753540859 +0100
+++ Python-2.7.13-new/configure.ac	2017-01-21 01:46:13.465533257 +0100
@@ -648,6 +648,17 @@ AC_SUBST(EXPORT_MACOSX_DEPLOYMENT_TARGET
 CONFIGURE_MACOSX_DEPLOYMENT_TARGET=
 EXPORT_MACOSX_DEPLOYMENT_TARGET='#'
 
+# There are certain cases where we don't want build machine's
+# sysroot folders (/usr/include, /usr/lib, /usr/lib64 etc) to
+# be used. An example of where this is needed is if running
+# on a 64bit machine via linux32 running a 32bit targetting GCC.
+# Without this, 64bit libs will cause the linker to fail.
+# This also prevents add_multiarch_paths from being called.
+# You can specify this multiple times to add more prefixes.
+AC_MSG_CHECKING(for --with-build-sysroot)
+AC_ARG_WITH([build-sysroot],
+AS_HELP_STRING([--with-build-sysroot], [Select sysroot and ignore multilibs, even when not cross-compiling]))
+
 # checks for alternative programs
 
 # compiler flags are generated in two sets, BASECFLAGS and OPT.  OPT is just
diff -rupN Python-2.7.13/setup.py Python-2.7.13-new/setup.py
--- Python-2.7.13/setup.py	2017-01-21 01:46:13.041537784 +0100
+++ Python-2.7.13-new/setup.py	2017-01-21 01:46:13.465533257 +0100
@@ -43,6 +43,16 @@ if sys.platform == "win32" and "MSYSTEM"
 # Were we compiled --with-pydebug or with #define Py_DEBUG?
 COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
 
+with_build_sysroot_args = [arg.split('=')[-1] for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
+                           if ('--with-build-sysroot' in arg)]
+
+if len(with_build_sysroot_args):
+    with_build_sysroot_specified = True
+    with_build_sysroots = [arg.replace("'",'') for arg in with_build_sysroot_args]
+else:
+    with_build_sysroot_specified = False
+    with_build_sysroots = ['/usr']
+
 # This global variable is used to hold the list of modules to be disabled.
 disabled_module_list = []
 
@@ -407,10 +417,11 @@ class PyBuildExt(build_ext):
             os.unlink(tmpfile)
 
         if multiarch_path_component != '':
-            add_dir_to_list(self.compiler.library_dirs,
-                            '/usr/lib/' + multiarch_path_component)
-            add_dir_to_list(self.compiler.include_dirs,
-                            '/usr/include/' + multiarch_path_component)
+            for sysroot in with_build_sysroots:
+                add_dir_to_list(self.compiler.library_dirs,
+                                sysroot + '/lib/' + multiarch_path_component)
+                add_dir_to_list(self.compiler.include_dirs,
+                                sysroot + '/include/' + multiarch_path_component)
             return
 
         if not find_executable('dpkg-architecture'):
@@ -428,10 +439,11 @@ class PyBuildExt(build_ext):
             if ret >> 8 == 0:
                 with open(tmpfile) as fp:
                     multiarch_path_component = fp.readline().strip()
-                add_dir_to_list(self.compiler.library_dirs,
-                                '/usr/lib/' + multiarch_path_component)
-                add_dir_to_list(self.compiler.include_dirs,
-                                '/usr/include/' + multiarch_path_component)
+                for sysroot in with_build_sysroots:
+                    add_dir_to_list(self.compiler.library_dirs,
+                                    sysroot + '/lib/' + multiarch_path_component)
+                    add_dir_to_list(self.compiler.include_dirs,
+                                    sysroot + '/include/' + multiarch_path_component)
         finally:
             os.unlink(tmpfile)
 
@@ -469,7 +481,7 @@ class PyBuildExt(build_ext):
 
     def detect_modules(self):
         # Ensure that /usr/local is always used
-        if not cross_compiling:
+        if not cross_compiling and not with_build_sysroot_specified:
             add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
             add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
         if cross_compiling:
@@ -532,7 +544,7 @@ class PyBuildExt(build_ext):
         # be assumed that no additional -I,-L directives are needed.
         inc_dirs = self.compiler.include_dirs[:]
         lib_dirs = self.compiler.library_dirs[:]
-        if not cross_compiling:
+        if not cross_compiling and not with_build_sysroot_specified:
             for d in (
                 '/usr/include',
                 ):
@@ -824,11 +836,11 @@ class PyBuildExt(build_ext):
             elif curses_library:
                 readline_libs.append(curses_library)
             elif self.compiler.find_library_file(lib_dirs +
-                                                     ['/usr/lib/termcap'],
+                                                     [sr + '/lib/termcap' for sr in with_build_sysroots],
                                                      'termcap'):
                 readline_libs.append('termcap')
             exts.append( Extension('readline', ['readline.c'],
-                                   library_dirs=['/usr/lib/termcap'],
+                                   library_dirs=[sr + '/lib/termcap' for sr in with_build_sysroots],
                                    extra_link_args=readline_extra_link_args,
                                    libraries=readline_libs) )
         else:
@@ -857,20 +869,20 @@ class PyBuildExt(build_ext):
                                libraries=_socket_libs) )
         # Detect SSL support for the socket module (via _ssl)
         search_for_ssl_incs_in = [
-                              '/usr/local/ssl/include',
-                              '/usr/contrib/ssl/include/'
+                              sr + sslinc for sr in with_build_sysroots
+                              for sslinc in ('/local/ssl/include', '/contrib/ssl/include')
                              ]
         ssl_incs = find_file('openssl/ssl.h', inc_dirs,
                              search_for_ssl_incs_in
                              )
         if ssl_incs is not None:
             krb5_h = find_file('krb5.h', inc_dirs,
-                               ['/usr/kerberos/include'])
+                               [sr + '/kerberos/include' for sr in with_build_sysroots])
             if krb5_h:
                 ssl_incs += krb5_h
         ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-                                     ['/usr/local/ssl/lib',
-                                      '/usr/contrib/ssl/lib/'
+                                     [sr + ssllib for sr in with_build_sysroots
+                                      for ssllib in ('/local/ssl/lib', '/contrib/ssl/lib')
                                      ] )
 
         if (ssl_incs is not None and