Files
MINGW-packages/mingw-w64-python3/0530-mingw-system-libffi.patch
2014-05-20 01:12:05 +04:00

136 lines
5.2 KiB
Diff

diff -Naur a/configure.ac b/configure.ac
--- a/configure.ac 2014-05-20 00:56:01.817200000 +0400
+++ b/configure.ac 2014-05-20 00:56:01.973200000 +0400
@@ -2516,14 +2516,32 @@
[],
[with_system_ffi="no"])
-if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
- LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
+if test "$with_system_ffi" = "yes"; then
+ LIBFFI_INCLUDEDIR="$LIBFFI_INCLUDEDIR"
+fi
+AC_MSG_RESULT($with_system_ffi)
+
+ac_previous_cppflags=$CPPFLAGS
+CPPFLAGS="-I$LIBFFI_INCLUDEDIR"
+ac_previous_ldflags=$LDFLAGS
+# check for ffi.h
+AC_CHECK_HEADER(ffi.h, [
+ AC_DEFINE(WITH_SYSTEM_LIBFFI, 1,
+ [Define if we have external libffi.])
+ ffi_h="yes"
+],
+ffi_h="no"
+)
+if test "$ffi_h" = "yes"; then
+ LIBFFI_INCLUDEDIR="$LIBFFI_INCLUDEDIR"
else
LIBFFI_INCLUDEDIR=""
fi
+CPPFLAGS=$ac_previous_cppflags
+LDFLAGS=$ac_previous_ldflags
AC_SUBST(LIBFFI_INCLUDEDIR)
-AC_MSG_RESULT($with_system_ffi)
+
# Check for use of the system libmpdec library
AC_MSG_CHECKING(for --with-system-libmpdec)
diff -Naur a/Lib/ctypes/test/test_as_parameter.py b/Lib/ctypes/test/test_as_parameter.py
--- a/Lib/ctypes/test/test_as_parameter.py 2014-05-19 09:19:37.000000000 +0400
+++ b/Lib/ctypes/test/test_as_parameter.py 2014-05-20 00:56:01.973200000 +0400
@@ -1,6 +1,7 @@
import unittest
from ctypes import *
import _ctypes_test
+import sys
dll = CDLL(_ctypes_test.__file__)
@@ -171,6 +172,10 @@
s2h = dll.ret_2h_func(self.wrap(inp))
self.assertEqual((s2h.x, s2h.y), (99*2, 88*3))
+ # This is known cdecl incompatibility between GCC
+ # and MSVC. It is addressed in GCC issue #36834.
+ # Python libffi detect it and complain.
+ @unittest.skipIf(sys.platform == "win32" and sys.version.find("GCC") >= 0, 'XFAIL GCC(mingw)')
def test_struct_return_8H(self):
class S8I(Structure):
_fields_ = [("a", c_int),
diff -Naur a/Lib/ctypes/test/test_functions.py b/Lib/ctypes/test/test_functions.py
--- a/Lib/ctypes/test/test_functions.py 2014-05-19 09:19:37.000000000 +0400
+++ b/Lib/ctypes/test/test_functions.py 2014-05-20 00:56:01.973200000 +0400
@@ -359,6 +359,10 @@
s2h = windll.s_ret_2h_func(S2H(99, 88))
self.assertEqual((s2h.x, s2h.y), (99*2, 88*3))
+ # This is known cdecl incompatibility between GCC
+ # and MSVC. It is addressed in GCC issue #36834.
+ # Python libffi detect it and complain.
+ @unittest.skipIf(sys.platform == "win32" and sys.version.find("GCC") >= 0, 'XFAIL GCC(mingw)')
def test_struct_return_8H(self):
class S8I(Structure):
_fields_ = [("a", c_int),
diff -Naur a/Modules/_ctypes/libffi/fficonfig.py.in b/Modules/_ctypes/libffi/fficonfig.py.in
--- a/Modules/_ctypes/libffi/fficonfig.py.in 2014-05-19 09:19:39.000000000 +0400
+++ b/Modules/_ctypes/libffi/fficonfig.py.in 2014-05-20 00:56:01.973200000 +0400
@@ -22,6 +22,7 @@
'FRV': ['src/frv/eabi.S', 'src/frv/ffi.c'],
'S390': ['src/s390/sysv.S', 'src/s390/ffi.c'],
'X86_64': ['src/x86/ffi64.c', 'src/x86/unix64.S', 'src/x86/ffi.c', 'src/x86/sysv.S'],
+ 'X86_WIN64': ['src/x86/ffi.c', 'src/x86/win64.S'],
'SH': ['src/sh/sysv.S', 'src/sh/ffi.c'],
'SH64': ['src/sh64/sysv.S', 'src/sh64/ffi.c'],
'PA': ['src/pa/linux.S', 'src/pa/ffi.c'],
@@ -29,6 +30,9 @@
'PA_HPUX': ['src/pa/hpux32.S', 'src/pa/ffi.c'],
}
+ffi_target = '@TARGET@'
+if ffi_target not in ['X86_WIN32', 'X86_WIN64']:
+ ffi_sources += 'src/dlmalloc.c'
ffi_sources += ffi_platforms['@TARGET@']
ffi_cflags = '@CFLAGS@'
diff -Naur a/pyconfig.h.in b/pyconfig.h.in
--- a/pyconfig.h.in 2014-05-20 00:55:28.417600000 +0400
+++ b/pyconfig.h.in 2014-05-20 00:56:01.988800000 +0400
@@ -1352,6 +1352,9 @@
/* Define if you want to compile in Python-specific mallocs */
#undef WITH_PYMALLOC
+/* Define if we have external libffi. */
+#undef WITH_SYSTEM_LIBFFI
+
/* Define if you want to compile in rudimentary thread support */
#undef WITH_THREAD
diff -Naur a/setup.py b/setup.py
--- a/setup.py 2014-05-20 00:55:49.415200000 +0400
+++ b/setup.py 2014-05-20 00:56:01.988800000 +0400
@@ -1872,6 +1872,11 @@
return True
def configure_ctypes(self, ext):
+ if host_platform in ['mingw', 'win32']:
+ ext.libraries.extend(['ole32', 'oleaut32', 'uuid'])
+ #AdditionalOptions="/EXPORT:DllGetClassObject,PRIVATE /EXPORT:DllCanUnloadNow,PRIVATE"
+ ext.export_symbols.extend(['DllGetClassObject PRIVATE',
+ 'DllCanUnloadNow PRIVATE'])
if not self.use_system_libffi:
if host_platform == 'darwin':
return self.configure_ctypes_darwin(ext)
@@ -1896,6 +1901,10 @@
if not self.verbose:
config_args.append("-q")
+ if host_platform in ['mingw', 'win32']:
+ table = str.maketrans('\\', '/')
+ ffi_builddir = ffi_builddir.translate(table)
+ ffi_srcdir = ffi_srcdir.translate(table)
# Pass empty CFLAGS because we'll just append the resulting
# CFLAGS to Python's; -g or -O2 is to be avoided.
cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \