Drop Python2 support. Round 4

This commit is contained in:
Alexey Pavlov
2020-03-02 12:44:15 +03:00
parent 8e4c3cd3da
commit 885bbbadf0
53 changed files with 218 additions and 262 deletions

View File

@@ -0,0 +1,27 @@
--- Python-3.4.3/setup.py.orig 2015-02-25 05:27:46.000000000 -0600
+++ Python-3.4.3/setup.py 2015-05-05 11:18:04.030880000 -0500
@@ -1241,7 +1241,7 @@ class PyBuildExt(build_ext):
dbm_setup_debug = False # verbose debug prints from this script?
dbm_order = ['gdbm']
# The standard Unix dbm module:
- if host_platform not in ['cygwin']:
+ if host_platform not in ['win32']:
config_args = [arg.strip("'")
for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
dbm_args = [arg for arg in config_args
@@ -1296,6 +1296,15 @@ class PyBuildExt(build_ext):
],
libraries = gdbm_libs)
break
+ if find_file("ndbm.h", inc_dirs, []) is not None:
+ if dbm_setup_debug: print("building dbm using gdbm")
+ dbmext = Extension(
+ '_dbm', ['_dbmmodule.c'],
+ define_macros=[
+ ('HAVE_NDBM_H', None),
+ ],
+ libraries = gdbm_libs)
+ break
elif cand == "bdb":
if dblibs:
if dbm_setup_debug: print("building dbm using bdb")

View File

@@ -0,0 +1,15 @@
diff -up Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 Python-3.2.3/Lib/ctypes/__init__.py
--- Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 2012-04-20 15:12:49.017867692 -0400
+++ Python-3.2.3/Lib/ctypes/__init__.py 2012-04-20 15:15:09.501111408 -0400
@@ -266,11 +266,6 @@ def _reset_cache():
# _SimpleCData.c_char_p_from_param
POINTER(c_char).from_param = c_char_p.from_param
_pointer_type_cache[None] = c_void_p
- # XXX for whatever reasons, creating the first instance of a callback
- # function is needed for the unittests on Win64 to succeed. This MAY
- # be a compiler bug, since the problem occurs only when _ctypes is
- # compiled with the MS SDK compiler. Or an uninitialized variable?
- CFUNCTYPE(c_int)(lambda: None)
def create_unicode_buffer(init, size=None):
"""create_unicode_buffer(aString) -> character array

View File

@@ -0,0 +1,311 @@
diff --git a/Include/object.h b/Include/object.h
index c772dea..5729797 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -1098,6 +1098,49 @@ PyAPI_FUNC(void)
_PyObject_DebugTypeStats(FILE *out);
#endif /* ifndef Py_LIMITED_API */
+/*
+ Define a pair of assertion macros.
+
+ These work like the regular C assert(), in that they will abort the
+ process with a message on stderr if the given condition fails to hold,
+ but compile away to nothing if NDEBUG is defined.
+
+ However, before aborting, Python will also try to call _PyObject_Dump() on
+ the given object. This may be of use when investigating bugs in which a
+ particular object is corrupt (e.g. buggy a tp_visit method in an extension
+ module breaking the garbage collector), to help locate the broken objects.
+
+ The WITH_MSG variant allows you to supply an additional message that Python
+ will attempt to print to stderr, after the object dump.
+*/
+#ifdef NDEBUG
+/* No debugging: compile away the assertions: */
+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) ((void)0)
+#else
+/* With debugging: generate checks: */
+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
+ ((expr) \
+ ? (void)(0) \
+ : _PyObject_AssertFailed((obj), \
+ (msg), \
+ (__STRING(expr)), \
+ (__FILE__), \
+ (__LINE__), \
+ (__PRETTY_FUNCTION__)))
+#endif
+
+#define PyObject_ASSERT(obj, expr) \
+ PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
+
+/*
+ Declare and define the entrypoint even when NDEBUG is defined, to avoid
+ causing compiler/linker errors when building extensions without NDEBUG
+ against a Python built with NDEBUG defined
+*/
+PyAPI_FUNC(void) _PyObject_AssertFailed(PyObject *, const char *,
+ const char *, const char *, int,
+ const char *);
+
#ifdef __cplusplus
}
#endif
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index 8d806db..dc8bb16 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,10 +1,12 @@
import unittest
from test.support import (verbose, refcount_test, run_unittest,
strip_python_stderr, cpython_only, start_threads,
- temp_dir, requires_type_collecting, TESTFN, unlink)
+ temp_dir, requires_type_collecting, TESTFN, unlink,
+ import_module)
from test.support.script_helper import assert_python_ok, make_script
import sys
+import sysconfig
import time
import gc
import weakref
@@ -46,6 +48,8 @@ class GC_Detector(object):
# gc collects it.
self.wr = weakref.ref(C1055820(666), it_happened)
+BUILD_WITH_NDEBUG = ('-DNDEBUG' in sysconfig.get_config_vars()['PY_CFLAGS'])
+
@with_tp_del
class Uncollectable(object):
"""Create a reference cycle with multiple __del__ methods.
@@ -878,6 +882,50 @@ class GCCallbackTests(unittest.TestCase):
self.assertEqual(len(gc.garbage), 0)
+ @unittest.skipIf(BUILD_WITH_NDEBUG,
+ 'built with -NDEBUG')
+ def test_refcount_errors(self):
+ self.preclean()
+ # Verify the "handling" of objects with broken refcounts
+ import_module("ctypes") #skip if not supported
+
+ import subprocess
+ code = '''if 1:
+ a = []
+ b = [a]
+
+ # Simulate the refcount of "a" being too low (compared to the
+ # references held on it by live data), but keeping it above zero
+ # (to avoid deallocating it):
+ import ctypes
+ ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
+
+ # The garbage collector should now have a fatal error when it reaches
+ # the broken object:
+ import gc
+ gc.collect()
+ '''
+ p = subprocess.Popen([sys.executable, "-c", code],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ stdout, stderr = p.communicate()
+ p.stdout.close()
+ p.stderr.close()
+ # Verify that stderr has a useful error message:
+ self.assertRegex(stderr,
+ b'Modules/gcmodule.c:[0-9]+: visit_decref: Assertion "\(\(gc\)->gc.gc_refs >> \(1\)\) != 0" failed.')
+ self.assertRegex(stderr,
+ b'refcount was too small')
+ self.assertRegex(stderr,
+ b'object : \[\]')
+ self.assertRegex(stderr,
+ b'type : list')
+ self.assertRegex(stderr,
+ b'refcount: 1')
+ self.assertRegex(stderr,
+ b'address : 0x[0-9a-f]+')
+
+
class GCTogglingTests(unittest.TestCase):
def setUp(self):
gc.enable()
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 4d701cb..388dd78 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -239,7 +239,8 @@ update_refs(PyGC_Head *containers)
{
PyGC_Head *gc = containers->gc.gc_next;
for (; gc != containers; gc = gc->gc.gc_next) {
- assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
+ PyObject_ASSERT(FROM_GC(gc),
+ _PyGCHead_REFS(gc) == GC_REACHABLE);
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
/* Python's cyclic gc should never see an incoming refcount
* of 0: if something decref'ed to 0, it should have been
@@ -259,7 +260,8 @@ update_refs(PyGC_Head *containers)
* so serious that maybe this should be a release-build
* check instead of an assert?
*/
- assert(_PyGCHead_REFS(gc) != 0);
+ PyObject_ASSERT(FROM_GC(gc),
+ _PyGCHead_REFS(gc) != 0);
}
}
@@ -274,7 +276,9 @@ visit_decref(PyObject *op, void *data)
* generation being collected, which can be recognized
* because only they have positive gc_refs.
*/
- assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
+ PyObject_ASSERT_WITH_MSG(FROM_GC(gc),
+ _PyGCHead_REFS(gc) != 0,
+ "refcount was too small"); /* else refcount was too small */
if (_PyGCHead_REFS(gc) > 0)
_PyGCHead_DECREF(gc);
}
@@ -334,9 +338,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
* If gc_refs == GC_UNTRACKED, it must be ignored.
*/
else {
- assert(gc_refs > 0
- || gc_refs == GC_REACHABLE
- || gc_refs == GC_UNTRACKED);
+ PyObject_ASSERT(FROM_GC(gc),
+ gc_refs > 0
+ || gc_refs == GC_REACHABLE
+ || gc_refs == GC_UNTRACKED);
}
}
return 0;
@@ -378,7 +383,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
*/
PyObject *op = FROM_GC(gc);
traverseproc traverse = Py_TYPE(op)->tp_traverse;
- assert(_PyGCHead_REFS(gc) > 0);
+ PyObject_ASSERT(op, _PyGCHead_REFS(gc) > 0);
_PyGCHead_SET_REFS(gc, GC_REACHABLE);
(void) traverse(op,
(visitproc)visit_reachable,
@@ -441,7 +446,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
PyObject *op = FROM_GC(gc);
- assert(IS_TENTATIVELY_UNREACHABLE(op));
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
next = gc->gc.gc_next;
if (has_legacy_finalizer(op)) {
@@ -517,7 +522,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
PyWeakReference **wrlist;
op = FROM_GC(gc);
- assert(IS_TENTATIVELY_UNREACHABLE(op));
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
next = gc->gc.gc_next;
if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
@@ -538,9 +543,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
* the callback pointer intact. Obscure: it also
* changes *wrlist.
*/
- assert(wr->wr_object == op);
+ PyObject_ASSERT(wr->wr_object, wr->wr_object == op);
_PyWeakref_ClearRef(wr);
- assert(wr->wr_object == Py_None);
+ PyObject_ASSERT(wr->wr_object, wr->wr_object == Py_None);
if (wr->wr_callback == NULL)
continue; /* no callback */
@@ -574,7 +579,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
*/
if (IS_TENTATIVELY_UNREACHABLE(wr))
continue;
- assert(IS_REACHABLE(wr));
+ PyObject_ASSERT(op, IS_REACHABLE(wr));
/* Create a new reference so that wr can't go away
* before we can process it again.
@@ -583,7 +588,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
/* Move wr to wrcb_to_call, for the next pass. */
wrasgc = AS_GC(wr);
- assert(wrasgc != next); /* wrasgc is reachable, but
+ PyObject_ASSERT(op, wrasgc != next);
+ /* wrasgc is reachable, but
next isn't, so they can't
be the same */
gc_list_move(wrasgc, &wrcb_to_call);
@@ -599,11 +605,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
gc = wrcb_to_call.gc.gc_next;
op = FROM_GC(gc);
- assert(IS_REACHABLE(op));
- assert(PyWeakref_Check(op));
+ PyObject_ASSERT(op, IS_REACHABLE(op));
+ PyObject_ASSERT(op, PyWeakref_Check(op));
wr = (PyWeakReference *)op;
callback = wr->wr_callback;
- assert(callback != NULL);
+ PyObject_ASSERT(op, callback != NULL);
/* copy-paste of weakrefobject.c's handle_callback() */
temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
@@ -717,12 +723,14 @@ check_garbage(PyGC_Head *collectable)
for (gc = collectable->gc.gc_next; gc != collectable;
gc = gc->gc.gc_next) {
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
- assert(_PyGCHead_REFS(gc) != 0);
+ PyObject_ASSERT(FROM_GC(gc),
+ _PyGCHead_REFS(gc) != 0);
}
subtract_refs(collectable);
for (gc = collectable->gc.gc_next; gc != collectable;
gc = gc->gc.gc_next) {
- assert(_PyGCHead_REFS(gc) >= 0);
+ PyObject_ASSERT(FROM_GC(gc),
+ _PyGCHead_REFS(gc) >= 0);
if (_PyGCHead_REFS(gc) != 0)
return -1;
}
diff --git a/Objects/object.c b/Objects/object.c
index 220aa90..f6c7161 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -2177,6 +2177,35 @@ _PyTrash_thread_destroy_chain(void)
--tstate->trash_delete_nesting;
}
+PyAPI_FUNC(void)
+_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
+ const char *file, int line, const char *function)
+{
+ fprintf(stderr,
+ "%s:%d: %s: Assertion \"%s\" failed.\n",
+ file, line, function, expr);
+ if (msg) {
+ fprintf(stderr, "%s\n", msg);
+ }
+
+ fflush(stderr);
+
+ if (obj) {
+ /* This might succeed or fail, but we're about to abort, so at least
+ try to provide any extra info we can: */
+ _PyObject_Dump(obj);
+ }
+ else {
+ fprintf(stderr, "NULL object\n");
+ }
+
+ fflush(stdout);
+ fflush(stderr);
+
+ /* Terminate the process: */
+ abort();
+}
+
#ifndef Py_TRACE_REFS
/* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
Define this here, so we can undefine the macro. */

View File

@@ -0,0 +1,13 @@
Cygwin ld (as of binutils-2.19.51) does not understand --enable-new-dtags.
--- Python-3.1/Lib/distutils/unixccompiler.py.orig 2009-05-09 06:55:12.000000000 -0500
+++ Python-3.1/Lib/distutils/unixccompiler.py 2009-08-19 22:46:55.222993300 -0500
@@ -224,7 +224,7 @@ class UnixCCompiler(CCompiler):
# the configuration data stored in the Python installation, so
# we use this hack.
compiler = os.path.basename(sysconfig.get_config_var("CC"))
- if sys.platform[:6] == "darwin":
+ if sys.platform[:6] == "darwin" or sys.platform[:6] == "cygwin":
# MacOSX's linker doesn't understand the -R flag at all
return "-L" + dir
elif sys.platform[:7] == "freebsd":

View File

@@ -0,0 +1,27 @@
--- Python-3.4.3/setup.py.orig 2015-02-25 05:27:46.000000000 -0600
+++ Python-3.4.3/setup.py 2015-05-05 11:18:04.030880000 -0500
@@ -1849,12 +1849,6 @@ class PyBuildExt(build_ext):
include_dirs.append('/usr/X11/include')
added_lib_dirs.append('/usr/X11/lib')
- # If Cygwin, then verify that X is installed before proceeding
- if host_platform == 'cygwin':
- x11_inc = find_file('X11/Xlib.h', [], include_dirs)
- if x11_inc is None:
- return
-
# Check for BLT extension
if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
'BLT8.0'):
@@ -1872,9 +1866,8 @@ class PyBuildExt(build_ext):
if host_platform in ['aix3', 'aix4']:
libs.append('ld')
- # Finally, link with the X11 libraries (not appropriate on cygwin)
- if host_platform != "cygwin":
- libs.append('X11')
+ # Finally, link with the X11 libraries
+ libs.append('X11')
ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
define_macros=[('WITH_APPINIT', 1)] + defs,

View File

@@ -0,0 +1,51 @@
--- Python-3.4.3/Lib/ctypes/__init__.py.orig 2015-02-25 05:27:44.000000000 -0600
+++ Python-3.4.3/Lib/ctypes/__init__.py 2015-05-05 11:39:39.945940300 -0500
@@ -431,7 +431,8 @@ pydll = LibraryLoader(PyDLL)
if _os.name == "nt":
pythonapi = PyDLL("python dll", None, _sys.dllhandle)
elif _sys.platform == "cygwin":
- pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
+ pythonapi = PyDLL("libpython%d.%d%s.dll" % \
+ (_sys.version_info[:2] + tuple(_sys.abiflags)))
else:
pythonapi = PyDLL(None)
--- Python-3.4.3/Lib/ctypes/util.py.orig 2015-02-25 05:27:44.000000000 -0600
+++ Python-3.4.3/Lib/ctypes/util.py 2015-05-05 11:10:45.202655900 -0500
@@ -80,6 +80,25 @@ if os.name == "posix" and sys.platform =
continue
return None
+elif sys.platform == "cygwin":
+ def find_library(name):
+ for libdir in ['/usr/lib', '/usr/local/lib']:
+ for libext in ['lib%s.dll.a' % name, 'lib%s.a' % name]:
+ implib = os.path.join(libdir, libext)
+ if not os.path.exists(implib):
+ continue
+ cmd = "dlltool -I " + implib + " 2>/dev/null"
+ f = os.popen(cmd)
+ try:
+ data = f.read()
+ finally:
+ f.close()
+ res = data.replace("\n","")
+ if not res:
+ continue
+ return res
+ return None
+
elif os.name == "posix":
# Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump
import re, tempfile
@@ -328,6 +347,10 @@ def test():
print(cdll.LoadLibrary("libcrypto.dylib"))
print(cdll.LoadLibrary("libSystem.dylib"))
print(cdll.LoadLibrary("System.framework/System"))
+ elif sys.platform == "cygwin":
+ print(cdll.LoadLibrary("cygbz2-1.dll"))
+ print(cdll.LoadLibrary("cygcrypt-0.dll"))
+ print(find_library("crypt"))
# issue-26439 - fix broken test call for AIX
elif sys.platform.startswith("aix"):
from ctypes import CDLL

View File

@@ -0,0 +1,12 @@
--- Python-3.6.0/Modules/main.c.orig 2017-02-08 04:28:31.840450700 -0500
+++ Python-3.6.0/Modules/main.c 2017-02-08 04:31:01.757513100 -0500
@@ -12,6 +12,9 @@
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
+#ifndef PATH_MAX
+#define PATH_MAX MAXPATHLEN
+#endif
#endif
#endif

View File

@@ -0,0 +1,16 @@
--- Python-3.1.2/Include/py_curses.h.orig 2009-09-06 16:26:46.000000000 -0500
+++ Python-3.1.2/Include/py_curses.h 2010-05-03 01:25:11.226933700 -0500
@@ -17,6 +17,13 @@
#endif
#endif /* __APPLE__ */
+#ifdef __CYGWIN__
+/* the following define is necessary for Cygwin; without it, the
+ Cygwin-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python
+ can't get at the WINDOW flags field. */
+#define NCURSES_INTERNALS
+#endif /* __CYGWIN__ */
+
/* On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards
against multiple definition of wchar_t and wint_t. */
#if defined(__FreeBSD__) && defined(_XOPEN_SOURCE_EXTENDED)

View File

@@ -0,0 +1,11 @@
--- Python-3.2/Include/pyerrors.h.orig
+++ Python-3.2/Include/pyerrors.h
@@ -358,7 +358,7 @@ PyAPI_FUNC(int) PyErr_CheckSignals(void)
/* In signalmodule.c */
#ifndef Py_LIMITED_API
-int PySignal_SetWakeupFd(int fd);
+PyAPI_FUNC(int) PySignal_SetWakeupFd(int fd);
#endif
/* Support for adding program text to SyntaxErrors */

View File

@@ -0,0 +1,26 @@
This is necessary for find_library_file to work where a library has only
an implib but no static lib (e.g. sqlite3).
--- Python-3.2.3/Lib/distutils/cygwinccompiler.py.orig 2012-04-11 01:54:02.000000000 -0500
+++ Python-3.2.3/Lib/distutils/cygwinccompiler.py 2012-06-22 19:37:11.740576800 -0500
@@ -92,9 +92,7 @@ class CygwinCCompiler(UnixCCompiler):
compiler_type = 'cygwin'
obj_extension = ".o"
static_lib_extension = ".a"
- shared_lib_extension = ".dll"
- static_lib_format = "lib%s%s"
- shared_lib_format = "%s%s"
+ shared_lib_extension = ".dll.a"
exe_extension = ".exe"
def __init__(self, verbose=0, dry_run=0, force=0):
--- Python-3.2.5/Lib/distutils/unixccompiler.py.orig 2013-07-30 16:39:21.092550800 -0500
+++ Python-3.2.5/Lib/distutils/unixccompiler.py 2013-07-30 20:01:52.168552600 -0500
@@ -81,6 +81,7 @@ class UnixCCompiler(CCompiler):
xcode_stub_lib_format = dylib_lib_format
if sys.platform == "cygwin":
exe_extension = ".exe"
+ dylib_lib_extension = ".dll.a"
def preprocess(self, source, output_file=None, macros=None,
include_dirs=None, extra_preargs=None, extra_postargs=None):

View File

@@ -0,0 +1,22 @@
--- Python-3.4.3/Python/dynload_shlib.c.orig 2015-02-25 05:27:46.000000000 -0600
+++ Python-3.4.3/Python/dynload_shlib.c 2015-05-05 11:25:41.882019700 -0500
@@ -34,6 +34,8 @@
const char *_PyImport_DynLoadFiletab[] = {
#ifdef __CYGWIN__
+ "." SOABI ".dll",
+ ".abi" PYTHON_ABI_STRING ".dll",
".dll",
#else /* !__CYGWIN__ */
"." SOABI ".so",
--- Python-3.6.0/configure.ac.orig 2017-02-08 04:39:39.793333600 -0500
+++ Python-3.6.0/configure.ac 2017-02-08 04:45:44.649752400 -0500
@@ -4614,7 +4614,7 @@
AC_SUBST(EXT_SUFFIX)
case $ac_sys_system in
- Linux*|GNU*|Darwin)
+ Linux*|GNU*|Darwin|CYGWIN*)
EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};;
*)
EXT_SUFFIX=${SHLIB_SUFFIX};;

View File

@@ -0,0 +1,88 @@
--- Python-3.4.3/Include/pythread.h.orig 2015-02-25 05:27:44.000000000 -0600
+++ Python-3.4.3/Include/pythread.h 2015-05-05 11:27:20.117994100 -0500
@@ -74,11 +74,11 @@ PyAPI_FUNC(int) PyThread_set_stacksize(s
platforms, but it is not POSIX-compliant. Therefore, the new TSS API uses
opaque data type to represent TSS keys to be compatible (see PEP 539).
*/
-PyAPI_FUNC(int) PyThread_create_key(void) Py_DEPRECATED(3.7);
-PyAPI_FUNC(void) PyThread_delete_key(int key) Py_DEPRECATED(3.7);
-PyAPI_FUNC(int) PyThread_set_key_value(int key, void *value) Py_DEPRECATED(3.7);
-PyAPI_FUNC(void *) PyThread_get_key_value(int key) Py_DEPRECATED(3.7);
-PyAPI_FUNC(void) PyThread_delete_key_value(int key) Py_DEPRECATED(3.7);
+PyAPI_FUNC(long) PyThread_create_key(void) Py_DEPRECATED(3.7);
+PyAPI_FUNC(void) PyThread_delete_key(long key) Py_DEPRECATED(3.7);
+PyAPI_FUNC(int) PyThread_set_key_value(long key, void *value) Py_DEPRECATED(3.7);
+PyAPI_FUNC(void *) PyThread_get_key_value(long key) Py_DEPRECATED(3.7);
+PyAPI_FUNC(void) PyThread_delete_key_value(long key) Py_DEPRECATED(3.7);
/* Cleanup after a fork */
PyAPI_FUNC(void) PyThread_ReInitTLS(void) Py_DEPRECATED(3.7);
--- Python-3.6.0/Python/thread_pthread.h.orig 2016-12-22 21:21:22.000000000 -0500
+++ Python-3.6.0/Python/thread_pthread.h 2017-02-08 05:18:45.791168100 -0500
@@ -603,44 +603,47 @@
removing this API.
*/
-int
+long
PyThread_create_key(void)
{
#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
pthread_key_t key;
int fail = pthread_key_create(&key, NULL);
if (fail)
- return -1;
- if (key > INT_MAX) {
+ return -1L;
+#ifndef __CYGWIN__
+ /* Cygwin pthread types are pointers, which may "overflow" signed long */
+ if (key > LONG_MAX) {
/* Issue #22206: handle integer overflow */
pthread_key_delete(key);
errno = ENOMEM;
- return -1;
+ return -1L;
}
- return (int)key;
+ return (long)key;
+#endif
#else
- return -1; /* never return valid key value. */
+ return -1L; /* never return valid key value. */
#endif
}
void
-PyThread_delete_key(int key)
+PyThread_delete_key(long key)
{
#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
pthread_key_delete(key);
#endif
}
void
-PyThread_delete_key_value(int key)
+PyThread_delete_key_value(long key)
{
#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
pthread_setspecific(key, NULL);
#endif
}
int
-PyThread_set_key_value(int key, void *value)
+PyThread_set_key_value(long key, void *value)
{
#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
int fail;
@@ -640,7 +640,7 @@ PyThread_set_key_value(int key, void *va
}
void *
-PyThread_get_key_value(int key)
+PyThread_get_key_value(long key)
{
#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
return pthread_getspecific(key);
#else

View File

@@ -0,0 +1,31 @@
--- Python-3.2.3/Modules/getpath.c.orig 2012-04-11 02:54:07.000000000 -0400
+++ Python-3.2.3/Modules/getpath.c 2012-06-14 13:33:30.179375000 -0400
@@ -551,6 +551,28 @@
break;
}
+#ifdef __CYGWIN__
+ /*
+ * Cygwin automatically removes the ".exe" extension from argv[0]
+ * to make programs feel like they are in a more Unix-like
+ * environment. Unfortunately, this can make it problemmatic for
+ * Cygwin to distinguish between a directory and an executable with
+ * the same name excluding the ".exe" extension. For example, the
+ * Cygwin Python build directory has a "Python" directory and a
+ * "python.exe" executable. This causes isxfile() to erroneously
+ * return false. If isdir() returns true and there is enough space
+ * to append the ".exe" extension, then we try again with the
+ * extension appended.
+ */
+#define EXE L".exe"
+ if (isdir(program_full_path) && wcslen(program_full_path) + wcslen(EXE) <= MAXPATHLEN)
+ {
+ wcscat(program_full_path, EXE);
+ if (isxfile(program_full_path))
+ break;
+ }
+#endif /* __CYGWIN__ */
+
if (!delim) {
program_full_path[0] = L'\0';
break;

View File

@@ -0,0 +1,36 @@
--- Python-3.4.3/Modules/selectmodule.c.orig 2015-02-25 05:27:46.000000000 -0600
+++ Python-3.4.3/Modules/selectmodule.c 2015-05-05 13:58:58.914394500 -0500
@@ -8,6 +8,16 @@
#define _GNU_SOURCE
#endif
+/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
+ 64 is too small (too many people have bumped into that limit).
+ Here we boost it.
+ Users who want even more than the boosted limit should #define
+ FD_SETSIZE higher before this; e.g., via compiler /D switch.
+*/
+#if (defined(MS_WINDOWS) || defined(__CYGWIN__)) && !defined(FD_SETSIZE)
+#define FD_SETSIZE 512
+#endif
+
#include "Python.h"
#include <structmember.h>
@@ -26,16 +36,6 @@
#undef HAVE_BROKEN_POLL
#endif
-/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
- 64 is too small (too many people have bumped into that limit).
- Here we boost it.
- Users who want even more than the boosted limit should #define
- FD_SETSIZE higher before this; e.g., via compiler /D switch.
-*/
-#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
-#define FD_SETSIZE 512
-#endif
-
#if defined(HAVE_POLL_H)
#include <poll.h>
#elif defined(HAVE_SYS_POLL_H)

14
python/016-3.6-ftm.patch Normal file
View File

@@ -0,0 +1,14 @@
--- Python-3.6.1rc1/configure.ac 2017-03-12 14:28:34.395001700 -0500
+++ Python-3.6.1rc1/configure.ac 2017-03-21 00:27:44.595584900 -0500
@@ -138,11 +138,6 @@ AC_DEFINE(_GNU_SOURCE, 1, [Define on Lin
AC_DEFINE(_NETBSD_SOURCE, 1, [Define on NetBSD to activate all library features])
# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
-# certain features on FreeBSD, so we need __BSD_VISIBLE to re-enable
-# them.
-AC_DEFINE(__BSD_VISIBLE, 1, [Define on FreeBSD to activate all library features])
-
-# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables
# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable
# them.
AC_DEFINE(_DARWIN_C_SOURCE, 1, [Define on Darwin to activate all library features])

View File

@@ -0,0 +1,11 @@
--- a/setup.py
+++ b/setup.py
@@ -2061,7 +2061,7 @@ class PyBuildExt(build_ext):
undef_macros = []
if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
include_dirs = []
- libraries = [':libmpdec.so.2']
+ libraries = [':libmpdec.dll.a']
sources = ['_decimal/_decimal.c']
depends = ['_decimal/docstrings.h']
else:

View File

@@ -0,0 +1,36 @@
diff -urN a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
--- a/Lib/distutils/sysconfig.py 2014-10-11 14:19:27.487874300 +0100
+++ b/Lib/distutils/sysconfig.py 2014-10-11 14:19:30.049020800 +0100
@@ -156,7 +156,23 @@
Mainly needed on Unix, so we can plug in the information that
varies across Unices and is stored in Python's Makefile.
"""
- if compiler.compiler_type == "unix":
+ global _config_vars
+ if compiler.compiler_type in ["cygwin", "mingw32"]:
+ # Note that cygwin use posix build and 'unix' compiler.
+ # If build is not based on posix then we must predefine
+ # some environment variables corresponding to posix
+ # build rules and defaults.
+ if not 'GCC' in sys.version:
+ _config_vars['CC'] = "gcc"
+ _config_vars['CXX'] = "g++"
+ _config_vars['OPT'] = "-fwrapv -O3 -Wall -Wstrict-prototypes"
+ _config_vars['CFLAGS'] = ""
+ _config_vars['CCSHARED'] = ""
+ _config_vars['LDSHARED'] = "gcc -shared -Wl,--enable-auto-image-base"
+ _config_vars['AR'] = "ar"
+ _config_vars['ARFLAGS'] = "rc"
+
+ if compiler.compiler_type in ["unix", "cygwin", "mingw32"]:
if sys.platform == "darwin":
# Perform first-time customization of compiler-related
# config vars on OS X now that we know we need a compiler.
@@ -166,7 +182,6 @@
# that Python itself was built on. Also the user OS
# version and build tools may not support the same set
# of CPU architectures for universal builds.
- global _config_vars
# Use get_config_var() to ensure _config_vars is initialized.
if not get_config_var('CUSTOMIZED_OSX_COMPILER'):
import _osx_support

View File

@@ -0,0 +1,19 @@
getrandom(2) without GRND_RANDOM is broken prior to Cygwin 2.8.0:
https://sourceware.org/git/?p=newlib-cygwin.git;a=commitdiff;h=6c420fa
--- origsrc/Python-3.6.1/configure.ac 2017-03-21 21:36:53.153779000 -0500
+++ src/Python-3.6.1/configure.ac 2017-03-21 21:42:30.270960000 -0500
@@ -5372,6 +5372,12 @@ AC_MSG_CHECKING(for the getrandom() func
AC_LINK_IFELSE(
[
AC_LANG_SOURCE([[
+ #ifdef __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_MAJOR < 2008
+ #error getrandom(2) is broken prior to Cygwin 2.8.0
+ #endif
+ #endif
#include <sys/random.h>
int main() {

516
python/900-msysize.patch Normal file
View File

@@ -0,0 +1,516 @@
diff -Naur Python-3.7.0-orig/config.guess Python-3.7.0/config.guess
--- Python-3.7.0-orig/config.guess 2015-02-25 14:27:46.000000000 +0300
+++ Python-3.7.0/config.guess 2015-05-07 09:58:31.810000000 +0300
@@ -866,6 +866,9 @@
amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
echo x86_64-unknown-cygwin
exit ;;
+ amd64:MSYS*:*:* | x86_64:MSYS*:*:*)
+ echo x86_64-unknown-msys
+ exit ;;
prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
exit ;;
diff -Naur Python-3.6.0/configure.ac.orig Python-3.6.0/configure.ac
--- Python-3.6.0/configure.ac.orig 2017-02-08 09:14:49.544766100 -0500
+++ Python-3.6.0/configure.ac 2017-02-08 09:23:26.742594900 -0500
@@ -383,6 +383,9 @@
*-*-cygwin*)
ac_sys_system=Cygwin
;;
+ *-*-msys*)
+ ac_sys_system=Msys
+ ;;
*)
# for now, limit cross builds to known configurations
MACHDEP="unknown"
@@ -407,6 +410,7 @@
case $MACHDEP in
linux*) MACHDEP="linux";;
cygwin*) MACHDEP="cygwin";;
+ msys*) MACHDEP="msys";;
darwin*) MACHDEP="darwin";;
irix646) MACHDEP="irix6";;
'') MACHDEP="unknown";;
@@ -428,6 +432,9 @@
*-*-cygwin*)
_host_cpu=
;;
+ *-*-msys*)
+ _host_cpu=
+ ;;
*)
# for now, limit cross builds to known configurations
MACHDEP="unknown"
@@ -1087,7 +1094,7 @@
if test -z "$enable_shared"
then
case $ac_sys_system in
- CYGWIN*)
+ CYGWIN*|MSYS*)
enable_shared="yes";;
*)
enable_shared="no";;
@@ -1142,6 +1149,10 @@
LDLIBRARY='libpython$(LDVERSION).dll.a'
DLLLIBRARY='libpython$(LDVERSION).dll'
;;
+ MSYS*)
+ LDLIBRARY='libpython$(LDVERSION).dll.a'
+ DLLLIBRARY='msys-python$(LDVERSION).dll'
+ ;;
SunOS*)
LDLIBRARY='libpython$(LDVERSION).so'
BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
@@ -1188,7 +1200,7 @@
else # shared is disabled
PY_ENABLE_SHARED=0
case $ac_sys_system in
- CYGWIN*)
+ CYGWIN*|MSYS*)
BLDLIBRARY='$(LIBRARY)'
LDLIBRARY='libpython$(LDVERSION).dll.a'
;;
@@ -1238,7 +1250,7 @@
AC_SUBST(LN)
if test -z "$LN" ; then
case $ac_sys_system in
- CYGWIN*) LN="ln -s";;
+ CYGWIN*|MSYS*) LN="ln -s";;
*) LN=ln;;
esac
fi
@@ -2380,7 +2392,7 @@
*) SHLIB_SUFFIX=.sl;;
esac
;;
- CYGWIN*) SHLIB_SUFFIX=.dll;;
+ CYGWIN*|MSYS*) SHLIB_SUFFIX=.dll;;
*) SHLIB_SUFFIX=.so;;
esac
fi
@@ -2518,7 +2530,7 @@
SCO_SV*)
LDSHARED='$(CC) -Wl,-G,-Bexport'
LDCXXSHARED='$(CXX) -Wl,-G,-Bexport';;
- CYGWIN*)
+ CYGWIN*|MSYS*)
LDSHARED="gcc -shared -Wl,--enable-auto-image-base"
LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";;
*) LDSHARED="ld";;
@@ -2606,7 +2618,7 @@
LINKFORSHARED="-Xlinker --export-dynamic"
fi;;
esac;;
- CYGWIN*)
+ CYGWIN*|MSYS*)
if test $enable_shared = "no"
then
LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
@@ -2628,7 +2640,7 @@
if test ! "$LIBRARY" = "$LDLIBRARY"
then
case $ac_sys_system in
- CYGWIN*)
+ CYGWIN*|MSYS*)
# Cygwin needs CCSHARED when building extension DLLs
# but not when building the interpreter DLL.
CFLAGSFORSHARED='';;
@@ -3061,7 +3073,7 @@
fi
AC_CHECK_FUNCS(pthread_sigmask,
[case $ac_sys_system in
- CYGWIN*)
+ CYGWIN*|MSYS*)
AC_DEFINE(HAVE_BROKEN_PTHREAD_SIGMASK, 1,
[Define if pthread_sigmask() does not work on your system.])
;;
@@ -4609,7 +4621,7 @@
AC_SUBST(EXT_SUFFIX)
case $ac_sys_system in
- Linux*|GNU*|Darwin|CYGWIN*)
+ Linux*|GNU*|Darwin|CYGWIN*|MSYS*)
EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};;
*)
EXT_SUFFIX=${SHLIB_SUFFIX};;
diff -Naur Python-3.6.0/Lib/asyncio/base_events.py.orig Python-3.6.0/Lib/asyncio/base_events.py
--- Python-3.6.0/Lib/asyncio/base_events.py.orig 2016-12-22 21:21:19.000000000 -0500
+++ Python-3.6.0/Lib/asyncio/base_events.py 2017-02-08 08:59:15.247005800 -0500
@@ -895,7 +895,7 @@
exceptions = []
if reuse_address is None:
- reuse_address = os.name == 'posix' and sys.platform != 'cygwin'
+ reuse_address = os.name == 'posix' and sys.platform != 'cygwin' and sys.platform != 'msys'
for ((family, proto),
(local_address, remote_address)) in addr_pairs_info:
@@ -997,7 +997,7 @@
AF_INET6 = getattr(socket, 'AF_INET6', 0)
if reuse_address is None:
- reuse_address = os.name == 'posix' and sys.platform != 'cygwin'
+ reuse_address = os.name == 'posix' and sys.platform != 'cygwin' and sys.platform != 'msys'
sockets = []
if host == '':
hosts = [None]
diff -Naur Python-3.7.0-orig/Lib/ctypes/__init__.py Python-3.7.0/Lib/ctypes/__init__.py
--- Python-3.7.0-orig/Lib/ctypes/__init__.py 2015-05-07 09:55:34.078000000 +0300
+++ Python-3.7.0/Lib/ctypes/__init__.py 2015-05-07 09:58:31.825600000 +0300
@@ -1,6 +1,6 @@
"""create and manipulate C data types in Python"""
-import os as _os, sys as _sys
+import os as _os, sys as _sys, sysconfig as _sysconfig
__version__ = "1.1.0"
@@ -430,9 +430,8 @@
if _os.name == "nt":
pythonapi = PyDLL("python dll", None, _sys.dllhandle)
-elif _sys.platform == "cygwin":
- pythonapi = PyDLL("libpython%d.%d%s.dll" % \
- (_sys.version_info[:2] + tuple(_sys.abiflags)))
+elif _sys.platform in ['cygwin', 'msys']:
+ pythonapi = PyDLL(_sysconfig.get_config_var('DLLLIBRARY'))
else:
pythonapi = PyDLL(None)
diff -Naur Python-3.7.0-orig/Lib/ctypes/test/test_loading.py Python-3.7.0/Lib/ctypes/test/test_loading.py
--- Python-3.7.0-orig/Lib/ctypes/test/test_loading.py 2015-02-25 14:27:44.000000000 +0300
+++ Python-3.7.0/Lib/ctypes/test/test_loading.py 2015-05-07 09:58:31.841200000 +0300
@@ -13,6 +13,8 @@
libc_name = find_library("c")
elif sys.platform == "cygwin":
libc_name = "cygwin1.dll"
+ elif sys.platform == "msys":
+ libc_name = "msys-2.0.dll"
else:
libc_name = find_library("c")
diff -Naur Python-3.7.0-orig/Lib/ctypes/util.py Python-3.7.0/Lib/ctypes/util.py
--- Python-3.7.0-orig/Lib/ctypes/util.py 2015-05-07 09:55:34.078000000 +0300
+++ Python-3.7.0/Lib/ctypes/util.py 2015-05-07 10:01:40.261800000 +0300
@@ -80,7 +80,7 @@
continue
return None
-elif sys.platform == "cygwin":
+elif sys.platform in ["cygwin", "msys"]:
def find_library(name):
for libdir in ['/usr/lib', '/usr/local/lib']:
for libext in ['lib%s.dll.a' % name, 'lib%s.a' % name]:
@@ -351,6 +351,10 @@
print(cdll.LoadLibrary("cygbz2-1.dll"))
print(cdll.LoadLibrary("cygcrypt-0.dll"))
print(find_library("crypt"))
+ elif sys.platform == "msys":
+ print(cdll.LoadLibrary("msys-bz2-1.dll"))
+ print(cdll.LoadLibrary("msys-crypt-0.dll"))
+ print(find_library("crypt"))
# issue-26439 - fix broken test call for AIX
elif sys.platform.startswith("aix"):
from ctypes import CDLL
diff -Naur Python-3.7.0-orig/Lib/distutils/ccompiler.py Python-3.7.0/Lib/distutils/ccompiler.py
--- Python-3.7.0-orig/Lib/distutils/ccompiler.py 2015-02-25 14:27:44.000000000 +0300
+++ Python-3.7.0/Lib/distutils/ccompiler.py 2015-05-07 09:58:31.841200000 +0300
@@ -926,6 +926,7 @@
# on a cygwin built python we can use gcc like an ordinary UNIXish
# compiler
('cygwin.*', 'unix'),
+ ('msys.*', 'unix'),
# OS name mappings
('posix', 'unix'),
@@ -963,6 +964,8 @@
"Microsoft Visual C++"),
'cygwin': ('cygwinccompiler', 'CygwinCCompiler',
"Cygwin port of GNU C Compiler for Win32"),
+ 'msys': ('cygwinccompiler', 'CygwinCCompiler',
+ "Cygwin port of GNU C Compiler for Win32"),
'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
"Mingw32 port of GNU C Compiler for Win32"),
'bcpp': ('bcppcompiler', 'BCPPCompiler',
diff -Naur Python-3.7.0-orig/Lib/distutils/command/build_ext.py Python-3.7.0/Lib/distutils/command/build_ext.py
--- Python-3.7.0-orig/Lib/distutils/command/build_ext.py 2015-05-07 09:55:34.811200000 +0300
+++ Python-3.7.0/Lib/distutils/command/build_ext.py 2015-05-07 09:58:31.856800000 +0300
@@ -217,7 +217,7 @@
# For extensions under Cygwin, Python's library directory must be
# appended to library_dirs
- if sys.platform[:6] == 'cygwin':
+ if sys.platform[:6] == 'cygwin' or sys.platform[:4] == 'msys':
if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")):
# building third party extensions
self.library_dirs.append(os.path.join(sys.prefix, "lib",
diff -Naur Python-3.7.0-orig/Lib/distutils/cygwinccompiler.py Python-3.7.0/Lib/distutils/cygwinccompiler.py
--- Python-3.7.0-orig/Lib/distutils/cygwinccompiler.py 2015-05-07 09:55:43.001200000 +0300
+++ Python-3.7.0/Lib/distutils/cygwinccompiler.py 2015-05-07 09:58:31.856800000 +0300
@@ -400,4 +400,4 @@
def is_cygwingcc():
'''Try to determine if the gcc that would be used is from cygwin.'''
out_string = check_output(['gcc', '-dumpmachine'])
- return out_string.strip().endswith(b'cygwin')
+ return (out_string.strip().endswith(b'cygwin') or out_string.strip().endswith(b'msys'))
diff -Naur Python-3.7.0-orig/Lib/distutils/sysconfig.py Python-3.7.0/Lib/distutils/sysconfig.py
--- Python-3.7.0-orig/Lib/distutils/sysconfig.py 2015-05-07 09:55:46.604800000 +0300
+++ Python-3.7.0/Lib/distutils/sysconfig.py 2015-05-07 10:07:03.222600000 +0300
@@ -157,7 +157,7 @@
varies across Unices and is stored in Python's Makefile.
"""
global _config_vars
- if compiler.compiler_type in ["cygwin", "mingw32"]:
+ if compiler.compiler_type in ["cygwin", "msys", "mingw32"]:
# Note that cygwin use posix build and 'unix' compiler.
# If build is not based on posix then we must predefine
# some environment variables corresponding to posix
@@ -172,7 +172,7 @@
_config_vars['AR'] = "ar"
_config_vars['ARFLAGS'] = "rc"
- if compiler.compiler_type in ["unix", "cygwin", "mingw32"]:
+ if compiler.compiler_type in ["unix", "cygwin", "msys", "mingw32"]:
if sys.platform == "darwin":
# Perform first-time customization of compiler-related
# config vars on OS X now that we know we need a compiler.
diff -Naur Python-3.7.0-orig/Lib/distutils/tests/support.py Python-3.7.0/Lib/distutils/tests/support.py
--- Python-3.7.0-orig/Lib/distutils/tests/support.py 2015-02-25 14:27:44.000000000 +0300
+++ Python-3.7.0/Lib/distutils/tests/support.py 2015-05-07 09:58:31.856800000 +0300
@@ -65,7 +65,7 @@
super().tearDown()
while self.tempdirs:
d = self.tempdirs.pop()
- shutil.rmtree(d, os.name in ('nt', 'cygwin'))
+ shutil.rmtree(d, os.name in ('nt', 'cygwin', 'msys'))
def mkdtemp(self):
"""Create a temporary directory that will be cleaned up.
diff -Naur Python-3.6.0/Lib/distutils/unixccompiler.py.orig Python-3.6.0/Lib/distutils/unixccompiler.py
--- Python-3.6.0/Lib/distutils/unixccompiler.py.orig 2017-02-08 08:22:40.592815800 -0500
+++ Python-3.6.0/Lib/distutils/unixccompiler.py 2017-02-08 08:32:38.946960100 -0500
@@ -79,7 +79,7 @@
xcode_stub_lib_extension = ".tbd"
static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s"
xcode_stub_lib_format = dylib_lib_format
- if sys.platform == "cygwin":
+ if sys.platform in ["cygwin", "msys"]:
exe_extension = ".exe"
dylib_lib_extension = ".dll.a"
@@ -225,7 +225,7 @@
# the configuration data stored in the Python installation, so
# we use this hack.
compiler = os.path.basename(sysconfig.get_config_var("CC"))
- if sys.platform[:6] == "darwin" or sys.platform[:6] == "cygwin":
+ if sys.platform[:6] == "darwin" or sys.platform[:6] == "cygwin" or sys.platform[:4] == "msys":
# MacOSX's linker doesn't understand the -R flag at all
return "-L" + dir
elif sys.platform[:7] == "freebsd":
diff -Naur Python-3.7.0-orig/Lib/distutils/util.py Python-3.7.0/Lib/distutils/util.py
--- Python-3.7.0-orig/Lib/distutils/util.py 2015-02-25 14:27:44.000000000 +0300
+++ Python-3.7.0/Lib/distutils/util.py 2015-05-07 09:58:31.872400000 +0300
@@ -97,6 +97,12 @@
m = rel_re.match(release)
if m:
release = m.group()
+ elif osname[:4] == "msys":
+ osname = "msys"
+ rel_re = re.compile (r'[\d.]+', re.ASCII)
+ m = rel_re.match(release)
+ if m:
+ release = m.group()
elif osname[:6] == "darwin":
import _osx_support, distutils.sysconfig
osname, release, machine = _osx_support.get_platform_osx(
diff -Naur Python-3.6.0/Lib/importlib/_bootstrap_external.py.orig Python-3.6.0/Lib/importlib/_bootstrap_external.py
--- Python-3.6.0/Lib/importlib/_bootstrap_external.py.orig 2017-02-08 08:43:48.316520300 -0500
+++ Python-3.6.0/Lib/importlib/_bootstrap_external.py 2017-02-08 08:44:28.339129300 -0500
@@ -22,7 +22,7 @@
# Bootstrap-related code ######################################################
_CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win',
-_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin'
+_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'msys', 'darwin'
_CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY
+ _CASE_INSENSITIVE_PLATFORMS_STR_KEY)
diff -Naur Python-3.7.0-orig/Lib/sysconfig.py Python-3.7.0/Lib/sysconfig.py
--- Python-3.7.0-orig/Lib/sysconfig.py 2015-02-25 14:27:44.000000000 +0300
+++ Python-3.7.0/Lib/sysconfig.py 2015-05-07 09:58:34.087600000 +0300
@@ -683,6 +683,13 @@
m = rel_re.match(release)
if m:
release = m.group()
+ elif osname[:4] == "msys":
+ osname = "msys"
+ import re
+ rel_re = re.compile (r'[\d.]+')
+ m = rel_re.match(release)
+ if m:
+ release = m.group()
elif osname[:6] == "darwin":
import _osx_support
osname, release, machine = _osx_support.get_platform_osx(
diff -Naur Python-3.7.0-orig/Lib/tempfile.py Python-3.7.0/Lib/tempfile.py
--- Python-3.7.0-orig/Lib/tempfile.py 2015-02-25 14:27:44.000000000 +0300
+++ Python-3.7.0/Lib/tempfile.py 2015-05-07 09:58:35.086000000 +0300
@@ -557,7 +557,7 @@
_os.close(fd)
raise
-if _os.name != 'posix' or _os.sys.platform == 'cygwin':
+if _os.name != 'posix' or _os.sys.platform == 'cygwin' or _os.sys.platform == 'msys':
# On non-POSIX and Cygwin systems, assume that we cannot unlink a file
# while it is open.
TemporaryFile = NamedTemporaryFile
diff -Naur Python-3.7.0-orig/Lib/test/test_curses.py Python-3.7.0/Lib/test/test_curses.py
--- Python-3.7.0-orig/Lib/test/test_curses.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/test/test_curses.py 2015-05-07 09:58:35.086000000 +0300
@@ -40,6 +40,8 @@
"$TERM=%r, calling initscr() may cause exit" % term)
@unittest.skipIf(sys.platform == "cygwin",
"cygwin's curses mostly just hangs")
+@unittest.skipIf(sys.platform == "msys",
+ "msys's curses mostly just hangs")
class TestCurses(unittest.TestCase):
@classmethod
diff -Naur Python-3.7.0-orig/Lib/test/test_importlib/util.py Python-3.7.0/Lib/test/test_importlib/util.py
--- Python-3.7.0-orig/Lib/test/test_importlib/util.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/test/test_importlib/util.py 2015-05-07 09:58:35.086000000 +0300
@@ -85,7 +85,7 @@
CASE_INSENSITIVE_FS = True
# Windows is the only OS that is *always* case-insensitive
# (OS X *can* be case-sensitive).
-if sys.platform not in ('win32', 'cygwin'):
+if sys.platform not in ('win32', 'cygwin', 'msys'):
changed_name = __file__.upper()
if changed_name == __file__:
changed_name = __file__.lower()
diff -Naur Python-3.7.0-orig/Lib/test/test_mailbox.py Python-3.7.0/Lib/test/test_mailbox.py
--- Python-3.7.0-orig/Lib/test/test_mailbox.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/test/test_mailbox.py 2015-05-07 09:58:35.086000000 +0300
@@ -591,7 +591,7 @@
def setUp(self):
TestMailbox.setUp(self)
- if (os.name == 'nt') or (sys.platform == 'cygwin'):
+ if (os.name == 'nt') or (sys.platform == 'cygwin') or (sys.platform == 'msys'):
self._box.colon = '!'
def assertMailboxEmpty(self):
diff -Naur Python-3.7.0-orig/Lib/test/test_netrc.py Python-3.7.0/Lib/test/test_netrc.py
--- Python-3.7.0-orig/Lib/test/test_netrc.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/test/test_netrc.py 2015-05-07 09:58:35.117200000 +0300
@@ -8,7 +8,7 @@
def make_nrc(self, test_data):
test_data = textwrap.dedent(test_data)
mode = 'w'
- if sys.platform != 'cygwin':
+ if sys.platform not in ['cygwin', 'msys']:
mode += 't'
with open(temp_filename, mode) as fp:
fp.write(test_data)
diff -Naur Python-3.7.0-orig/Lib/test/test_shutil.py Python-3.7.0/Lib/test/test_shutil.py
--- Python-3.7.0-orig/Lib/test/test_shutil.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/test/test_shutil.py 2015-05-07 09:58:35.117200000 +0300
@@ -97,7 +97,7 @@
super(TestShutil, self).tearDown()
while self.tempdirs:
d = self.tempdirs.pop()
- shutil.rmtree(d, os.name in ('nt', 'cygwin'))
+ shutil.rmtree(d, os.name in ('nt', 'cygwin', 'msys'))
def mkdtemp(self):
@@ -196,7 +196,7 @@
@unittest.skipUnless(hasattr(os, 'chmod'), 'requires os.chmod()')
- @unittest.skipIf(sys.platform[:6] == 'cygwin',
+ @unittest.skipIf(sys.platform[:6] == 'cygwin' or sys.platform[:4] == 'msys',
"This test can't be run on Cygwin (issue #1071513).")
@unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
"This test can't be run reliably as root (issue #1076467).")
diff -Naur Python-3.7.0-orig/Lib/_pyio.py Python-3.7.0/Lib/_pyio.py
--- Python-3.7.0-orig/Lib/_pyio.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/_pyio.py 2015-05-07 09:58:35.117200000 +0300
@@ -10,7 +10,7 @@
import sys
# Import _thread instead of threading to reduce startup cost
from _thread import allocate_lock as Lock
-if sys.platform in {'win32', 'cygwin'}:
+if sys.platform in {'win32', 'cygwin', 'msys'}:
from msvcrt import setmode as _setmode
else:
_setmode = None
diff -Naur Python-3.7.0-orig/Lib/tkinter/test/test_tkinter/test_loadtk.py Python-3.7.0/Lib/tkinter/test/test_tkinter/test_loadtk.py
--- Python-3.7.0-orig/Lib/tkinter/test/test_tkinter/test_loadtk.py 2015-02-25 14:27:45.000000000 +0300
+++ Python-3.7.0/Lib/tkinter/test/test_tkinter/test_loadtk.py 2015-05-07 09:58:35.117200000 +0300
@@ -18,7 +18,7 @@
def testLoadTkFailure(self):
old_display = None
- if sys.platform.startswith(('win', 'darwin', 'cygwin')):
+ if sys.platform.startswith(('win', 'darwin', 'cygwin', 'msys')):
# no failure possible on windows?
# XXX Maybe on tk older than 8.4.13 it would be possible,
diff -Naur Python-3.7.0-orig/Modules/makesetup Python-3.7.0/Modules/makesetup
--- Python-3.7.0-orig/Modules/makesetup 2015-05-07 09:55:42.954400000 +0300
+++ Python-3.7.0/Modules/makesetup 2015-05-07 09:58:35.132800000 +0300
@@ -86,7 +86,7 @@
# Setup to link with extra libraries when making shared extensions.
# Currently, only Cygwin needs this baggage.
case `uname -s` in
-CYGWIN*) if test $libdir = .
+CYGWIN*|MSYS*) if test $libdir = .
then
ExtraLibDir=.
else
diff -Naur Python-3.7.0-orig/setup.py Python-3.7.0/setup.py
--- Python-3.7.0-orig/setup.py 2015-05-07 09:55:33.329200000 +0300
+++ Python-3.7.0/setup.py 2015-05-07 09:58:35.132800000 +0300
@@ -361,7 +361,7 @@
# Workaround for Cygwin: Cygwin currently has fork issues when many
# modules have been imported
- if host_platform == 'cygwin':
+ if host_platform in ['cygwin', 'msys']:
self.announce('WARNING: skipping import check for Cygwin-based "%s"'
% ext.name)
return
@@ -1577,6 +1577,10 @@
macros = dict()
libraries = []
+ elif host_platform == 'msys': # MSYS
+ macros = dict()
+ libraries = []
+
elif host_platform.startswith('openbsd'):
macros = dict()
libraries = []
@@ -2223,7 +2223,7 @@
return ext
def _detect_nis(self, inc_dirs, lib_dirs):
- if host_platform in {'win32', 'cygwin', 'qnx6'}:
+ if host_platform in {'win32', 'cygwin', 'msys', 'qnx6'}:
return None
libs = []
diff -aur Python-3.6.0/Lib/test/test_asyncio/test_base_events.py.orig Python-3.6.0/Lib/test/test_asyncio/test_base_events.py
--- Python-3.6.0/Lib/test/test_asyncio/test_base_events.py.orig 2017-02-08 15:03:29.184676300 -0500
+++ Python-3.6.0/Lib/test/test_asyncio/test_base_events.py 2017-02-08 15:49:05.932013200 -0500
@@ -1576,7 +1576,7 @@
sock = transport.get_extra_info('socket')
reuse_address_default_on = (
- os.name == 'posix' and sys.platform != 'cygwin')
+ os.name == 'posix' and sys.platform != 'cygwin' and sys.platform != 'msys')
reuseport_supported = hasattr(socket, 'SO_REUSEPORT')
if reuse_address_default_on:

View File

@@ -0,0 +1,29 @@
--- a/Lib/posixpath.py 2013-11-27 06:57:57.000000000 +0000
+++ b/Lib/posixpath.py 2014-02-21 10:43:34.423932700 +0000
@@ -42,6 +42,12 @@
else:
return '/'
+def _get_altsep(path):
+ if isinstance(path, bytes):
+ return b'\\'
+ else:
+ return '\\'
+
# Normalize the case of a pathname. Trivial in Posix, string.lower on Mac.
# On MS-DOS this may also turn slashes into backslashes; however, other
# normalizations (such as optimizing '../' away) are not allowed
@@ -63,7 +69,12 @@
"""Test whether a path is absolute"""
s = os.fspath(s)
sep = _get_sep(s)
- return s.startswith(sep)
+ altsep = _get_altsep(s)
+ return s.startswith(sep) or \
+ (sys.platform == 'msys' and \
+ len(s) > 2 and \
+ s[1] == ':' and \
+ (s[2] == sep or s[2] == altsep))
# Join pathnames.

174
python/PKGBUILD Normal file
View File

@@ -0,0 +1,174 @@
# Maintainer: Alexey Pavlov <Alexpux@gmail.com>
# Contributor: Ray Donnelly <mingw.android@gmail.com>
pkgbase=python3
pkgname=python
pkgver=3.7.4
pkgrel=1
_pybasever=3.7
pkgdesc="Next generation of the python high-level scripting language"
arch=('i686' 'x86_64')
license=('custom')
url="https://www.python.org/"
depends=('libbz2' 'libexpat' 'libffi' 'liblzma' 'ncurses' 'libopenssl' 'libreadline' 'mpdecimal' 'libsqlite' 'zlib')
makedepends=('libbz2-devel' 'libexpat-devel' 'mpdecimal-devel' 'libsqlite-devel' 'libffi-devel' 'ncurses-devel' 'libreadline-devel' 'liblzma-devel' 'openssl-devel' 'zlib-devel')
#optdepends=('tk: for tkinter' 'sqlite')
provides=('python3')
replaces=('python3')
options=('!makeflags')
source=(https://www.python.org/ftp/python/${pkgver%rc*}/Python-${pkgver}.tar.xz
001-3.4-dbm-cygwin.patch
002-3.1-enable-new-dtags.patch
003-3.4-tkinter-cygwin.patch
004-3.4-ctypes-cygwin.patch
006-3.1-ncurses-abi6.patch
007-3.2-export-PySignal_SetWakeupFd.patch
009-3.2-distutils-shlibext.patch
010-3.6-pep3149-cygwin.patch
011-3.6-thread-cygwin64.patch
012-3.2-getpath-exe-extension.patch
013-3.4-select-cygwin.patch
016-3.6-ftm.patch
017-3.6-mpdec-cygwin.patch
025-MINGW-compiler-customize-mingw-cygwin-compilers.patch
900-msysize.patch
920-allow-win-drives-in-os-path-isabs.patch
dont-make-libpython-readonly.patch
00155-avoid-ctypes-thunks.patch
00170-gc-assertions.patch)
sha256sums=('fb799134b868199930b75f26678f18932214042639cd52b16da7fd134cd9b13f'
'de52e4722a6902e09dd6f343fdac0e7d45339f89386c8096b9c582c31aeb82e7'
'b5a787f02811f46800f98bf242448770492643a4431771bb4283e6ae97016263'
'4d7601b62e73c04553d22d480a873983a28b11df1f06be6898014453ce04afc3'
'ff56bfe8dc1808484926c338fb5515d2d8cef36e95cc64d4940642a72276620f'
'23bbe23afe90d5085ba7c27956c2df4ceee2acdfdc1d06a289070f045003fa09'
'1ab20d38926aa85e638317620c29c484fcbbc228cd7cdf9543c29b750556d23f'
'6ead37259110c28b16e35e05c93c82b46aa0fbb5152ff61bdaf1eea5f1ad01da'
'f5b67408d39d3fda539ea90b12c48a05bd950b38460ec3e6a688e3377b071ed3'
'b1d5a000bd5c9ec0a54f79e5487901d950e7685c57f50a5cea1a87012c034b4c'
'4a6a4cdd0b3c8f0c3ae563005cc0a398d352c98bcb1826600f1ab4c3e0c24219'
'e668b749e5f0bc584262add2cd7fffb2f6f32393a14918029d791012eda930f3'
'879ef890846d900132c4283ea65351b060bc4760ca40fbe5e80ba5acbe98370c'
'e3ef181333d5c9d20297849a46a68271a2190b7fc611c40c68c1ae240fa7ec36'
'5b1083e9b50e149d623d863dee38ac1fb8d142f1bb78c8a01dcb09bfd97f4118'
'35bf549bca1147a2a596132639d94f7b3a40de774780933e6a7f7fd9b0d309e3'
'387a2b7931fb4958e2526991760d85677f44fa13cff0aeb0f41a267f1f7fd214'
'f8b15d7079bfa1707e5bea78f600a0fca2077c25428c2bac5793b19b408f276e'
'7a3f8f43b9c9eecb65d80b60c875344950a8b55082401830599d091548a3a985'
'd8170bb446e5f3022bcc0eeb49f01d7c880161f1e115f4606e34554bf5ad0314')
apply_patch_with_msg() {
for _patch in "$@"
do
msg2 "Applying $_patch"
patch -Nbp1 -i "${srcdir}/$_patch"
done
}
del_file_exists() {
for _fname in "$@"
do
if [ -f $_fname ]; then
rm -rf $_fname
fi
done
}
prepare() {
cd "${srcdir}/Python-${pkgver}"
# FS#23997
sed -i -e "s|^#.* /usr/local/bin/python|#!/usr/bin/python|" Lib/cgi.py
apply_patch_with_msg \
001-3.4-dbm-cygwin.patch \
002-3.1-enable-new-dtags.patch \
003-3.4-tkinter-cygwin.patch \
004-3.4-ctypes-cygwin.patch \
006-3.1-ncurses-abi6.patch \
007-3.2-export-PySignal_SetWakeupFd.patch \
009-3.2-distutils-shlibext.patch \
010-3.6-pep3149-cygwin.patch \
011-3.6-thread-cygwin64.patch \
012-3.2-getpath-exe-extension.patch \
013-3.4-select-cygwin.patch \
016-3.6-ftm.patch \
017-3.6-mpdec-cygwin.patch \
025-MINGW-compiler-customize-mingw-cygwin-compilers.patch \
900-msysize.patch \
920-allow-win-drives-in-os-path-isabs.patch
#archlinux
apply_patch_with_msg dont-make-libpython-readonly.patch
#fedora
apply_patch_with_msg \
00155-avoid-ctypes-thunks.patch \
00170-gc-assertions.patch
# Incomplete patch from Ray Donnelly
# patch -p1 -i ${srcdir}/3.3.2-allow-windows-paths-for-executable.patch
# Ensure that we are using the system copy of various libraries (expat, zlib and libffi),
# rather than copies shipped in the tarball
rm -r Modules/expat
rm -r Modules/_ctypes/{darwin,libffi}*
rm -r Modules/_decimal/libmpdec
autoreconf -fiv
}
build() {
cd "${srcdir}/Python-${pkgver}"
CPPFLAGS+=" -I/usr/include/ncursesw"
LDFLAGS+=" -L."
CXX=/usr/bin/g++ \
./configure \
--prefix=/usr \
--build=${CHOST} \
--host=${CHOST} \
--enable-shared \
--enable-ipv6 \
--with-dbmliborder=gdbm \
--with-libc= \
--with-libm= \
--with-system-expat \
--with-system-ffi \
--with-system-libmpdec \
--enable-loadable-sqlite-extensions \
--without-ensurepip \
ac_cv_func_bind_textdomain_codeset=yes
LC_CTYPE=en_US.UTF-8 make EXTRA_CFLAGS="$CFLAGS"
}
check() {
cd "${srcdir}/Python-${pkgver}"
"${srcdir}/Python-${pkgver}/python" -m test.regrtest -x test_posixpath test_logging
}
package() {
cd "${srcdir}/Python-${pkgver}"
make DESTDIR="${pkgdir}" EXTRA_CFLAGS="$CFLAGS" install maninstall
# Why are these not done by default...
ln -sf python3 "${pkgdir}"/usr/bin/python.exe
ln -sf python3-config "${pkgdir}"/usr/bin/python-config
ln -sf idle3 "${pkgdir}"/usr/bin/idle
ln -sf pydoc3 "${pkgdir}"/usr/bin/pydoc
ln -sf pyvenv-${_pybasever} "${pkgdir}"/usr/bin/pyvenv3
ln -sf python${_pybasever}.1 "${pkgdir}"/usr/share/man/man1/python3.1
ln -sf python${_pybasever}.1 "${pkgdir}"/usr/share/man/man1/python.1
# Fix FS#22552
cp -f "${pkgdir}"/usr/lib/python${_pybasever}/config-${_pybasever}m/libpython${_pybasever}m.dll.a "${pkgdir}"/usr/lib/libpython${_pybasever}m.dll.a
# Clean-up reference to build directory
sed -i "s|$srcdir/Python-${pkgver}:||" "${pkgdir}/usr/lib/python${_pybasever}/config-${_pybasever}m/Makefile"
# License
install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
# fix permissons
find ${pkgdir}/usr -type f \( -name *.dll -o -name *.exe \) | xargs chmod 0755
}

View File

@@ -0,0 +1,13 @@
diff --git a/Makefile.pre.in b/Makefile.pre.in
index ce2c0aa..7d6dcf7 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -70,7 +70,7 @@ INSTALL_DATA= @INSTALL_DATA@
# Shared libraries must be installed with executable mode on some systems;
# rather than figuring out exactly which, we always give them executable mode.
# Also, making them read-only seems to be a good idea...
-INSTALL_SHARED= ${INSTALL} -m 555
+INSTALL_SHARED= ${INSTALL} -m 755
MKDIR_P= @MKDIR_P@