Alexander Pyhalov
2014-12-13 7b0dcec86c5455046c26524cf1a36c2e9df55fd9
components/python/python34/patches/06-solaris-64-bit.patch
@@ -1,44 +1,146 @@
This patch ensures that 64-bit shared objects are in a subdirectory named
"64".  Note that changes to the Lib/distutils/tests/test_build.py and
Lib/distutils/tests/test_install.py avoid running tests that fail due to
this patch.  As this is Solaris-specific, it is not suitable for upstream.
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.0/Lib/distutils/command/build_ext.py.~1~   2014-03-16 19:31:29.000000000 -0700
+++ Python-3.4.0/Lib/distutils/command/build_ext.py   2014-03-17 13:18:10.057787061 -0700
@@ -668,7 +668,12 @@
--- 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
-        return os.path.join(*ext_path) + ext_suffix
+        #return os.path.join(*ext_path) + ext_suffix
+        path = os.path.join (ext_path)
+        if sys.maxsize == 2147483647:
+        if sys.maxsize == 2 ** 31 - 1:
+            return os.path.join(*ext_path) + ext_suffix
+        (dirname, basename) = os.path.split(os.path.join(*ext_path));
+        return os.path.join(dirname, "64", basename + ext_suffix)
+        ext_path[-1:-1] = ["64"]
         return os.path.join(*ext_path) + ext_suffix
 
     def get_export_symbols(self, ext):
         """Return the list of symbols that a shared extension has to
--- Python-3.4.0/Lib/distutils/tests/test_build_ext.py.~1~   2014-03-16 19:31:29.000000000 -0700
+++ Python-3.4.0/Lib/distutils/tests/test_build_ext.py   2014-03-17 13:18:10.098081226 -0700
@@ -317,7 +317,7 @@
--- 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)
+        #self.assertEqual(so_dir, other_tmp_dir)
+        if sys.platform != 'sunos5':
+            self.assertEqual(so_dir, other_tmp_dir)
 
         cmd.inplace = 0
         cmd.compiler = None
@@ -364,7 +364,7 @@
@@ -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)
+        #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 @@
@@ -54,8 +156,8 @@
 
     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
--- 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");
@@ -67,144 +169,3 @@
     /* If we found EXEC_PREFIX do *not* reduce it!  (Yet.) */
 
     if ((!pfound || !efound) && !Py_FrozenFlag)
@@ -710,8 +714,30 @@
     if (_rtpypath && _rtpypath[0] != '\0') {
         size_t rtpypath_len;
         rtpypath = _Py_char2wchar(_rtpypath, &rtpypath_len);
-        if (rtpypath != NULL)
-            bufsz += rtpypath_len + 1;
+        if (rtpypath != NULL) {
+            wchar_t *orig_rtpypath = rtpypath;
+
+            /*
+             * Split the path; for each component, add that component + "/64"
+             * (if in 64-bit mode) and the component unadorned (regardless).
+             */
+            while (1) {
+                wchar_t *delim = wcschr(rtpypath, DELIM);
+                if (delim) {
+                    /* once for usual, another for usual + "/64" */
+                    bufsz += delim - rtpypath + 1;
+                    if (sizeof(void *) == 8)
+                        bufsz += delim - rtpypath + 1 + 3;
+                } else {
+                    bufsz += wcslen(rtpypath) + 1;
+                    if (sizeof(void *) == 8)
+                        bufsz += wcslen(rtpypath) + 1 + 3;
+                    break;
+                }
+                rtpypath = delim + 1;
+            }
+            rtpypath = orig_rtpypath;
+        }
     }
     defpath = _pythonpath;
@@ -723,9 +749,19 @@
             /* Paths are relative to prefix */
             bufsz += prefixsz;
-        if (delim)
+        if (delim) {
+            if (sizeof(void *) == 8) {
+                bufsz += delim - defpath + 1 + 3;
+                if (defpath[0] != SEP)
+                    bufsz += prefixsz;
+            }
             bufsz += delim - defpath + 1;
-        else {
+        } else {
+            if (sizeof(void *) == 8) {
+                bufsz += wcslen(defpath) + 1 + 3;
+                if (defpath[0] != SEP)
+                    bufsz += prefixsz;
+            }
             bufsz += wcslen(defpath) + 1;
             break;
         }
@@ -741,13 +777,38 @@
             "Not enough memory for dynamic PYTHONPATH");
     }
+    buf[0] = '\0';
     /* Run-time value of $PYTHONPATH goes first */
     if (rtpypath) {
-        wcscpy(buf, rtpypath);
-        wcscat(buf, delimiter);
+        wchar_t *orig_rtpypath = rtpypath;
+
+        while (1) {
+            wchar_t *delim = wcschr(rtpypath, DELIM);
+
+            if (delim) {
+                *delim = '\0';
+                if (sizeof(void *) == 8) {
+                    wcscat(buf, rtpypath);
+                    wcscat(buf, L"/64");
+                    wcscat(buf, delimiter);
+                }
+                wcscat(buf, rtpypath);
+                wcscat(buf, delimiter);
+                *delim = DELIM;
+            } else {
+                if (sizeof(void *) == 8) {
+                    wcscat(buf, rtpypath);
+                    wcscat(buf, L"/64");
+                    wcscat(buf, delimiter);
+                }
+                wcscat(buf, rtpypath);
+                wcscat(buf, delimiter);
+                break;
+            }
+            rtpypath = delim + 1;
+        }
+        rtpypath = orig_rtpypath;
     }
-    else
-        buf[0] = '\0';
     /* Next is the default zip path */
     wcscat(buf, zip_path);
@@ -766,18 +827,35 @@
         }
         if (delim) {
-            size_t len = delim - defpath + 1;
-            size_t end = wcslen(buf) + len;
-            wcsncat(buf, defpath, len);
-            *(buf + end) = '\0';
-        }
-        else {
+            *delim = '\0';
+            if (sizeof(void *) == 8) {
+                wcscat(buf, defpath);
+                wcscat(buf, L"/64");
+                wcscat(buf, delimiter);
+                if (defpath[0] != SEP) {
+                    wcscat(buf, prefix);
+                    wcscat(buf, separator);
+                }
+            }
             wcscat(buf, defpath);
+            wcscat(buf, delimiter);
+            *delim = DELIM;
+        } else {
+            if (sizeof(void *) == 8) {
+                wcscat(buf, defpath);
+                wcscat(buf, L"/64");
+                wcscat(buf, delimiter);
+                if (defpath[0] != SEP) {
+                    wcscat(buf, prefix);
+                    wcscat(buf, separator);
+                }
+            }
+            wcscat(buf, defpath);
+            wcscat(buf, delimiter);
             break;
         }
         defpath = delim + 1;
     }
-    wcscat(buf, delimiter);
     /* Finally, on goes the directory for dynamic-load modules */
     wcscat(buf, exec_prefix);