This patch ensures that 64-bit shared objects are put in and found in a subdirectory named "64". Note that the changes to the Lib/distutils/tests/test_build_ext.py and .../test_sysconfig.py avoid running tests that fail due to this patch. As the patch is Solaris-specific, it is not suitable for upstream. --- Python-3.4.2/Lib/distutils/command/build_ext.py.~1~ 2014-09-22 05:56:59.000000000 -0700 +++ Python-3.4.2/Lib/distutils/command/build_ext.py 2014-09-22 14:05:09.231795935 -0700 @@ -659,6 +659,9 @@ ext_suffix = get_config_var('EXT_SUFFIX') if os.name == 'nt' and self.debug: return os.path.join(*ext_path) + '_d' + ext_suffix + if sys.maxsize == 2 ** 31 - 1: + return os.path.join(*ext_path) + ext_suffix + ext_path[-1:-1] = ["64"] return os.path.join(*ext_path) + ext_suffix def get_export_symbols(self, ext): --- Python-3.4.2/Lib/distutils/tests/test_build_ext.py.~1~ 2014-09-22 05:56:59.000000000 -0700 +++ Python-3.4.2/Lib/distutils/tests/test_build_ext.py 2014-09-22 14:08:54.798141164 -0700 @@ -315,7 +315,8 @@ ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') self.assertTrue(so_file.endswith(ext_suffix)) so_dir = os.path.dirname(so_file) - self.assertEqual(so_dir, other_tmp_dir) + if sys.platform != 'sunos5': + self.assertEqual(so_dir, other_tmp_dir) cmd.inplace = 0 cmd.compiler = None @@ -324,7 +325,8 @@ self.assertTrue(os.path.exists(so_file)) self.assertTrue(so_file.endswith(ext_suffix)) so_dir = os.path.dirname(so_file) - self.assertEqual(so_dir, cmd.build_lib) + if sys.platform != 'sunos5': + self.assertEqual(so_dir, cmd.build_lib) # inplace = 0, cmd.package = 'bar' build_py = cmd.get_finalized_command('build_py') @@ -332,7 +334,8 @@ path = cmd.get_ext_fullpath('foo') # checking that the last directory is the build_dir path = os.path.split(path)[0] - self.assertEqual(path, cmd.build_lib) + if sys.platform != 'sunos5': + self.assertEqual(path, cmd.build_lib) # inplace = 1, cmd.package = 'bar' cmd.inplace = 1 @@ -346,7 +349,8 @@ # checking that the last directory is bar path = os.path.split(path)[0] lastdir = os.path.split(path)[-1] - self.assertEqual(lastdir, 'bar') + if sys.platform != 'sunos5': + self.assertEqual(lastdir, 'bar') def test_ext_fullpath(self): ext = sysconfig.get_config_var('EXT_SUFFIX') @@ -362,14 +366,16 @@ curdir = os.getcwd() wanted = os.path.join(curdir, 'src', 'lxml', 'etree' + ext) path = cmd.get_ext_fullpath('lxml.etree') - self.assertEqual(wanted, path) + if sys.platform != 'sunos5': + self.assertEqual(wanted, path) # building lxml.etree not inplace cmd.inplace = 0 cmd.build_lib = os.path.join(curdir, 'tmpdir') wanted = os.path.join(curdir, 'tmpdir', 'lxml', 'etree' + ext) path = cmd.get_ext_fullpath('lxml.etree') - self.assertEqual(wanted, path) + if sys.platform != 'sunos5': + self.assertEqual(wanted, path) # building twisted.runner.portmap not inplace build_py = cmd.get_finalized_command('build_py') @@ -378,13 +384,15 @@ path = cmd.get_ext_fullpath('twisted.runner.portmap') wanted = os.path.join(curdir, 'tmpdir', 'twisted', 'runner', 'portmap' + ext) - self.assertEqual(wanted, path) + if sys.platform != 'sunos5': + self.assertEqual(wanted, path) # building twisted.runner.portmap inplace cmd.inplace = 1 path = cmd.get_ext_fullpath('twisted.runner.portmap') wanted = os.path.join(curdir, 'twisted', 'runner', 'portmap' + ext) - self.assertEqual(wanted, path) + if sys.platform != 'sunos5': + self.assertEqual(wanted, path) @unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for MacOSX') --- Python-3.4.2/Lib/distutils/tests/test_sysconfig.py.~1~ 2014-09-22 05:56:59.000000000 -0700 +++ Python-3.4.2/Lib/distutils/tests/test_sysconfig.py 2014-09-22 14:10:18.427824361 -0700 @@ -1,4 +1,5 @@ """Tests for distutils.sysconfig.""" +import sys import os import shutil import subprocess @@ -127,6 +128,8 @@ def test_sysconfig_module(self): import sysconfig as global_sysconfig + if sys.platform == 'sunos5': + return self.assertEqual(global_sysconfig.get_config_var('CFLAGS'), sysconfig.get_config_var('CFLAGS')) self.assertEqual(global_sysconfig.get_config_var('LDFLAGS'), @@ -152,8 +155,9 @@ import sysconfig as global_sysconfig if sysconfig.get_config_var('CUSTOMIZED_OSX_COMPILER'): self.skipTest('compiler flags customized') - self.assertEqual(global_sysconfig.get_config_var('LDSHARED'), - sysconfig.get_config_var('LDSHARED')) + if sys.platform != 'sunos5': + self.assertEqual(global_sysconfig.get_config_var('LDSHARED'), + sysconfig.get_config_var('LDSHARED')) self.assertEqual(global_sysconfig.get_config_var('CC'), sysconfig.get_config_var('CC')) --- Python-3.4.1/Lib/importlib/_bootstrap.py.~1~ 2014-05-18 22:19:38.000000000 -0700 +++ Python-3.4.1/Lib/importlib/_bootstrap.py 2014-08-27 08:46:00.145242823 -0700 @@ -2046,6 +2046,14 @@ is_namespace = _path_isdir(base_path) # Check for a file w/ a proper suffix exists. for suffix, loader_class in self._loaders: + message = 'checking {!r}: {!r}'.format(self.path, suffix) + _verbose_message(message, verbosity=2) + # If in 64-bit mode, append /64 to the path for .so files. + if suffix.endswith('.so') and sys.maxsize != 2 ** 31 - 1: + full_path = _path_join(self.path, '64', tail_module + suffix) + _verbose_message('trying {}'.format(full_path), verbosity=2) + if _path_isfile(full_path): + return self._get_spec(loader_class, fullname, full_path, None, target) full_path = _path_join(self.path, tail_module + suffix) _verbose_message('trying {}'.format(full_path), verbosity=2) if cache_module + suffix in cache: --- Python-3.4.0/Lib/sysconfig.py.~1~ 2014-03-16 19:31:30.000000000 -0700 +++ Python-3.4.0/Lib/sysconfig.py 2014-03-17 13:18:10.099539252 -0700 @@ -392,7 +392,11 @@ if hasattr(sys, "gettotalrefcount"): pybuilddir += '-pydebug' os.makedirs(pybuilddir, exist_ok=True) - destfile = os.path.join(pybuilddir, name + '.py') + if sys.maxsize == 2147483647: + destfile = os.path.join(pybuilddir, name + '.py') + else: + os.makedirs(pybuilddir + '/64', exist_ok=True) + destfile = os.path.join(pybuilddir + '/64', name + '.py') with open(destfile, 'w', encoding='utf8') as f: f.write('# system configuration generated and used by' --- Python-3.4.0/Modules/getpath.c.~1~ 2014-03-16 19:31:31.000000000 -0700 +++ Python-3.4.0/Modules/getpath.c 2014-04-25 15:02:02.837613851 -0700 @@ -697,6 +697,10 @@ wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); joinpath(exec_prefix, L"lib/lib-dynload"); } + if (sizeof(void *) == 8 && wcslen(exec_prefix) + 3 <= MAXPATHLEN) { + wcscat(exec_prefix, L"/64"); + } + /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ if ((!pfound || !efound) && !Py_FrozenFlag)