diff -urN a/configure.in b/configure.in --- a/configure.in 2012-06-24 16:36:39.855815810 +0100 +++ b/configure.in 2012-06-24 16:36:40.072817294 +0100 @@ -84,7 +84,15 @@ fi AC_SUBST(VERSION) +case $host in + *-*-mingw*) + dnl To be compatible with MSVC build. +VERSION=`echo PYTHON_VERSION | sed -e 's|\.||g'` + ;; + *) VERSION=PYTHON_VERSION + ;; +esac AC_SUBST(SOVERSION) SOVERSION=1.0 @@ -345,6 +353,26 @@ dnl linux with 1.x(if someone still use it) and 2.x host kernels. dnl As example setup.py check for linux2(get from sys.platform) and will dnl install some host plaform specific files into subdirectory "plat-linux2". +dnl In addition $host_os may contain specific settings for some host systems +dnl as example mingwNN{YYYY} but the host winNN. So we may set MACHDEP +dnl to winNN in this case, i.e. different host systems from gnu autotools +dnl point of view but same for python. +if test -z "$MACHDEP" +then + dnl set MACHDEP only on certain host systems + case $host in + *-*-mingw*) + dnl we use only case based on "host triplet" + ac_sys_system=ignore + dnl FIXME: what is correct: + dnl - PLATFORM is always "win32" (see define in PC/pyconfig.h ) + dnl - getplatform.o is build with -DPLATFORM='"$(MACHDEP)"' + dnl - the platform specific files go in plat-$(MACHDEP) + dnl - but an item in PYTHONPATH is "plat-win" !!! oops + MACHDEP=win + ;; + esac +fi if test -z "$MACHDEP" then ac_sys_system=`uname -s` @@ -494,6 +522,16 @@ fi AC_MSG_RESULT($MACHDEP) +AC_MSG_CHECKING([for init system calls]) +AC_SUBST(INITSYS) +case $host in + # FIXME: May configure lack detection for os2 host system ? + #?#*-*-os2*) INITSYS=os2;; + *-*-mingw*) INITSYS=nt;; + *) INITSYS=posix;; +esac +AC_MSG_RESULT([$INITSYS]) + # And add extra plat-mac for darwin AC_SUBST(EXTRAPLATDIR) AC_SUBST(EXTRAMACHDEPPATH) @@ -801,6 +839,10 @@ *) enable_shared="no";; esac + case $host in + *-*-mingw*) + enable_shared="yes";; + esac fi AC_MSG_RESULT($enable_shared) @@ -902,6 +944,14 @@ ;; esac + case $host in + *-*-mingw*) + LDLIBRARY='libpython$(VERSION).dll.a' + DLLLIBRARY='libpython$(VERSION).dll' + dnl setup.py add it for mingw host + dnl BLDLIBRARY='-L. -lpython$(VERSION)' + ;; + esac else # shared is disabled case $ac_sys_system in CYGWIN*) @@ -909,6 +959,10 @@ LDLIBRARY='libpython$(VERSION).dll.a' ;; esac + case $host in + *-*-mingw*) + LDLIBRARY='libpython$(VERSION).a';; + esac fi AC_MSG_RESULT($LDLIBRARY) @@ -968,6 +1022,8 @@ esac fi +dnl TODO: to move --with-pydebug earlier in script and to group +dnl debug related statements togeder (if posible) # Check for --with-pydebug AC_MSG_CHECKING(for --with-pydebug) AC_ARG_WITH(pydebug, @@ -982,6 +1038,29 @@ else AC_MSG_RESULT(no); Py_DEBUG='false' fi], [AC_MSG_RESULT(no)]) +# FIXME: We define BUILDEXEEXT and LDLIBRARY above but: +# For debug versions MSVC build prepend suffix by '_d'. +# If we support this convention we may modify distutils(TODO). +# To support different build directories is good "--with-pydebug" +# to be earlier in the script(why i wrote this?). +if test "x$Py_DEBUG" = xtrue; then + case $host in + dnl TODO: This is good to be where we define LDLIBRARY + dnl but --with-pydebug is defined too late in the script. + # Since Makefile.pre.in may isn't suitable for now we will not + # change LDLIBRARY. + *-*-mingw*) + BUILDEXEEXT=_d$BUILDEXEEXT + if test x$enable_shared = xyes; then + #LDLIBRARY='libpython$(VERSION)_d.dll.a' + DLLLIBRARY='libpython$(VERSION)_d.dll' + else # shared is disabled + #LDLIBRARY='libpython$(VERSION)_d.dll.a';; + : + fi + ;; + esac +fi # XXX Shouldn't the code above that fiddles with BASECFLAGS and OPT be # merged with this chunk of code? @@ -998,6 +1077,8 @@ # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line +# NOTE: If user set OPT at this point script ignore all previously set +# options (not important - BeOS is depricated for python 2.6+). AC_SUBST(OPT) if test "${OPT-unset}" = "unset" then @@ -1077,6 +1158,10 @@ alpha*) BASECFLAGS="$BASECFLAGS -mieee" ;; + *-*-mingw*) + #MSVC in-compatable storage layout for bitfields in structures (Roumen has -mms-bitfields) + BASECFLAGS="$BASECFLAGS" + ;; esac case $ac_sys_system in @@ -1209,8 +1294,15 @@ ;; esac +dnl NOTE: although Py_DEBUG is set earlier in the script we can't move +dnl before "# tweak OPT based on compiler" - if user specify environment +dnl variable OPT we will lost our settings!!! +dnl FIXME: why script add debug definition to OPT instead to BASECFLAGS? if test "$Py_DEBUG" = 'true'; then - : + case $host in + dnl Same as in PC/pyconfig.h but order in opposite(Py_DEBUG=>-D_DEBUG). + *-*-mingw*) OPT="-D_DEBUG $OPT";; + esac else OPT="-DNDEBUG $OPT" fi @@ -1397,6 +1489,20 @@ AC_MSG_RESULT($ac_cv_pthread) fi +if test "x$ac_cv_kpthread" = xno && \ + test "x$ac_cv_kthread" = xno && \ + test "x$ac_cv_pthread" = xno && \ + test "x$ac_cv_pthread_is_default" = xno +then + AC_MSG_CHECKING(for NT threads) + AC_CACHE_VAL(ac_cv_ntthread, + [AC_LINK_IFELSE([ + AC_LANG_PROGRAM([], [_beginthread(0, 0, 0);])], + ac_cv_ntthread=yes, + ac_cv_ntthread=no)]) + AC_MSG_RESULT([$ac_cv_ntthread]) +fi + # If we have set a CC compiler flag for thread support then # check if it works for CXX, too. ac_cv_cxx_thread=no @@ -1417,6 +1523,9 @@ then CXX="$CXX -pthread" ac_cv_cxx_thread=yes +elif test "x$ac_cv_ntthread" = xyes +then + ac_cv_cxx_thread=always fi if test $ac_cv_cxx_thread = yes @@ -1458,7 +1567,7 @@ sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ -bluetooth/bluetooth.h linux/tipc.h spawn.h util.h) +bluetooth/bluetooth.h linux/tipc.h spawn.h util.h winsock2.h) AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -1667,19 +1776,20 @@ elif test "$ac_cv_pthread" = "yes" then CC="$CC -pthread" fi -AC_MSG_CHECKING(for pthread_t) -have_pthread_t=no -AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[#include ]], [[pthread_t x; x = *(pthread_t*)0;]]) -],[have_pthread_t=yes],[]) -AC_MSG_RESULT($have_pthread_t) -if test "$have_pthread_t" = yes ; then +dnl NOTE: avoid duplicate check for pthread_t(it is done in AC_CHECK_SIZEOF(pthread_t...) ) +dnl AC_MSG_CHECKING(for pthread_t) +dnl have_pthread_t=no +dnl AC_COMPILE_IFELSE([ +dnl AC_LANG_PROGRAM([[#include ]], [[pthread_t x; x = *(pthread_t*)0;]]) +dnl ],[have_pthread_t=yes],[]) +dnl AC_MSG_RESULT($have_pthread_t) +dnl if test "$have_pthread_t" = yes ; then AC_CHECK_SIZEOF(pthread_t, [], [ #ifdef HAVE_PTHREAD_H #include #endif ]) -fi +dnl fi CC="$ac_save_cc" AC_MSG_CHECKING(for --enable-toolbox-glue) @@ -1840,6 +1950,16 @@ CYGWIN*) SO=.dll;; *) SO=.so;; esac + case $host in + *-*-mingw*) + #NOTE: see _PyImport_DynLoadFiletab in dynload_win.c + if test "x$Py_DEBUG" = xtrue; then + SO=_d.pyd + else + SO=.pyd + fi + ;; + esac else # this might also be a termcap variable, see #610332 echo @@ -1996,6 +2116,12 @@ LDCXXSHARED="g++ -shared";; *) LDSHARED="ld";; esac + case $host in + *-*-mingw*) + LDSHARED='$(CC) -shared -Wl,--enable-auto-image-base' + LDCXXSHARED='$(CXX) -shared -Wl,--enable-auto-image-base' + ;; + esac fi AC_MSG_RESULT($LDSHARED) LDCXXSHARED=${LDCXXSHARED-$LDSHARED} @@ -2093,6 +2219,12 @@ # when running test_compile.py. LINKFORSHARED='-Wl,-E -N 2048K';; esac + case $host in + *-*-mingw*) + if test x$enable_shared = xyes; then + LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)' + fi;; + esac fi AC_MSG_RESULT($LINKFORSHARED) @@ -2109,6 +2241,12 @@ *) CFLAGSFORSHARED='$(CCSHARED)' esac + case $host in + *-*-mingw*) + # TODO mingw may needs CCSHARED when building extension DLLs + # but not when building the interpreter DLL. + CFLAGSFORSHARED='';; + esac fi AC_MSG_RESULT($CFLAGSFORSHARED) @@ -2141,9 +2279,18 @@ fi # check if we need libintl for locale functions +case $host in + *-*-mingw*) + dnl Native windows build don't use libintl (see _localemodule.c). + dnl Also we don't like setup.py to add "intl" library to the list + dnl when build _locale module. + ;; + *) AC_CHECK_LIB(intl, textdomain, AC_DEFINE(WITH_LIBINTL, 1, [Define to 1 if libintl is needed for locale functions.])) + ;; +esac # checks for system dependent C++ extensions support case "$ac_sys_system" in @@ -2325,6 +2472,13 @@ AC_DEFINE(WITH_THREAD) posix_threads=yes THREADOBJ="Python/thread.o" +elif test "x$ac_cv_ntthread" = xyes +then + AC_DEFINE(WITH_THREAD) + posix_threads=no + THREADOBJ="Python/thread.o" + AC_DEFINE(NT_THREADS, 1, + [Define to 1 if you want to use native NT threads]) else if test ! -z "$with_threads" -a -d "$with_threads" then LDFLAGS="$LDFLAGS -L$with_threads" @@ -2488,6 +2642,18 @@ fi +AC_SUBST(BUILDIN_WIN32_MODULE) +BUILDIN_WIN32_MODULE='#' +case $host in + *-*-mingw*) + # On win32 host(mingw build MSYS environment) site.py fail to load + # if _functools is not build-in by reason of dependency: + # setup->site->locale->functools&operator + BUILDIN_WIN32_MODULE= + ;; +esac + + # Check for enable-ipv6 AH_TEMPLATE(ENABLE_IPV6, [Define if --enable-ipv6 is specified]) AC_MSG_CHECKING([if --enable-ipv6 is specified]) @@ -2777,6 +2943,14 @@ fi ;; esac + case $host in + *-*-mingw*) + # FIXME: it is good to use portable "$OBJEXT" instead "o" but + # python build isn't yet ready to use it (see Makefile.pre.in) + #DYNLOADFILE="dynload_win.$OBJEXT" + DYNLOADFILE="dynload_win.o" + ;; + esac fi AC_MSG_RESULT($DYNLOADFILE) if test "$DYNLOADFILE" != "dynload_stub.o" @@ -2789,6 +2963,11 @@ AC_SUBST(MACHDEP_OBJS) AC_MSG_CHECKING(MACHDEP_OBJS) +case $host in + *-*-mingw*) + extra_machdep_objs="PC/dl_nt.o PC/getpathp.o PC/import_nt.o" + ;; +esac if test -z "$MACHDEP_OBJS" then MACHDEP_OBJS=$extra_machdep_objs @@ -2818,6 +2997,17 @@ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unsetenv utimes waitpid wait3 wait4 wcscoll _getpty) +dnl NOTE: On windows platform some functions aren't C functions and require +dnl additional non-standard decoration and may be libraries. +dnl As example winsock2 functions, although are based on berkeley sockets +dnl use stdcall convention. Also they require an additional library ws2_32. +dnl One of those functions is "getpeername" (see list above) +dnl and can't be detected by script. Now this impact mingw host platforms. +dnl Since this function is used only by socketmodule, module include +dnl necessary headers and is linked with requred libs (see setup.py) +dnl windows exception will be handled in module code. +dnl FIXME: If you don't like this, write appropriate check here. + # For some functions, having a definition is not sufficient, since # we want to take their address. AC_MSG_CHECKING(for chroot) @@ -3218,6 +3408,15 @@ [ac_cv_buggy_getaddrinfo=yes], [ac_cv_buggy_getaddrinfo=yes])) fi +case $host in + *-*-mingw*) + #FIXME: mingw "w32api" define getaddinfo if WINVER >= 0x501, i.e. XP or greater. + #TODO: mingw require additional check. + #NOTE: above check is not correct for windows platforms. + # ac_cv_buggy_getaddrinfo=no + : + ;; +esac AC_MSG_RESULT($ac_cv_buggy_getaddrinfo) @@ -3273,19 +3472,33 @@ AC_MSG_CHECKING(for addrinfo) AC_CACHE_VAL(ac_cv_struct_addrinfo, -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct addrinfo a]])], +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_WINSOCK2_H +# include +#else +# include +#endif]], + [[struct addrinfo a]])], [ac_cv_struct_addrinfo=yes], [ac_cv_struct_addrinfo=no])) AC_MSG_RESULT($ac_cv_struct_addrinfo) if test $ac_cv_struct_addrinfo = yes; then - AC_DEFINE(HAVE_ADDRINFO, 1, [struct addrinfo (netdb.h)]) + AC_DEFINE(HAVE_ADDRINFO, 1, [struct addrinfo]) fi AC_MSG_CHECKING(for sockaddr_storage) AC_CACHE_VAL(ac_cv_struct_sockaddr_storage, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -# include -# include ]], [[struct sockaddr_storage s]])], +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK2_H +#include +#endif]], + [[struct sockaddr_storage s]])], [ac_cv_struct_sockaddr_storage=yes], [ac_cv_struct_sockaddr_storage=no])) AC_MSG_RESULT($ac_cv_struct_sockaddr_storage) @@ -3479,11 +3692,16 @@ # check for --with-libm=... AC_SUBST(LIBM) +dnl obsolete style to set libraries for a system case $ac_sys_system in Darwin) ;; BeOS) ;; *) LIBM=-lm esac +dnl new style to set libraries for host system +case $host in + *-*-mingw*) LIBM=;; +esac AC_MSG_CHECKING(for --with-libm=STRING) AC_ARG_WITH(libm, AS_HELP_STRING([--with-libm=STRING], [math library]), @@ -3517,6 +3735,13 @@ # ************************************************** # * Check for various properties of floating point * # ************************************************** +case $host in + *-*-mingw*) + ac_cv_little_endian_double=yes + ac_cv_big_endian_double=no + ac_cv_mixed_endian_double=no + ;; +esac AC_MSG_CHECKING(whether C doubles are little-endian IEEE 754 binary64) AC_CACHE_VAL(ac_cv_little_endian_double, [ @@ -3600,6 +3825,8 @@ # This inline assembler syntax may also work for suncc and icc, # so we try it on all platforms. +# Note MSVC build use Python/dtoa.c, but I could not find any reason +# to use this file for GCC(mingw*) builds, so mingw* will use gcc asm :) AC_MSG_CHECKING(whether we can use gcc inline assembler to get and set x87 control word) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ @@ -3647,6 +3874,11 @@ [ac_cv_x87_double_rounding=yes], [ac_cv_x87_double_rounding=no]) CC="$ac_save_cc" +if test "x$cross_compiling" = xyes; then + case $host in + *-*-mingw*) ac_cv_x87_double_rounding=yes;; + esac +fi AC_MSG_RESULT($ac_cv_x87_double_rounding) if test "$ac_cv_x87_double_rounding" = yes then @@ -3664,6 +3896,12 @@ # On FreeBSD 6.2, it appears that tanh(-0.) returns 0. instead of # -0. on some architectures. AC_MSG_CHECKING(whether tanh preserves the sign of zero) +case $host in + *-*-mingw*) + # Some MSVC runtimes don't preserve zero sign. + # On mingw host we will use always replacement function. + ac_cv_tanh_preserves_zero_sign=no;; +esac AC_CACHE_VAL(ac_cv_tanh_preserves_zero_sign, [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include @@ -3689,6 +3927,12 @@ AC_CHECK_FUNCS([acosh asinh atanh copysign erf erfc expm1 finite gamma]) AC_CHECK_FUNCS([hypot lgamma log1p round tgamma]) +dnl NOTE: +dnl MSVC build PC/pyconfig.h define HAVE_DECL_ISINF but it is useless +dnl since header define Py_IS_INFINITY as (!_finite(X) && !_isnan(X)). +dnl Also in pymath.h is commented too how PC/pyconfig.h define isinf. +dnl For mingw to keep compatibility with MSVC build we will define +dnl Py_IS_INFINITY in pyport.h. AC_CHECK_DECLS([isinf, isnan, isfinite], [], [], [[#include ]]) LIBS=$LIBS_SAVE @@ -3698,6 +3942,13 @@ # the kernel module that provides POSIX semaphores # isn't loaded by default, so an attempt to call # sem_open results in a 'Signal 12' error. +if test $ac_cv_func_sem_open = yes; then +case $host in + *-*-mingw*) + # GCC 4.4+ (mingw) support posix threads(!) + # bug we won't use them on windows platform. + ac_cv_posix_semaphores_enabled=no;; +esac AC_MSG_CHECKING(whether POSIX semaphores are enabled) AC_CACHE_VAL(ac_cv_posix_semaphores_enabled, AC_RUN_IFELSE([AC_LANG_SOURCE([[ @@ -3723,6 +3974,9 @@ [ac_cv_posix_semaphores_enabled=yes]) ) AC_MSG_RESULT($ac_cv_posix_semaphores_enabled) +else + ac_cv_posix_semaphores_enabled=no +fi if test $ac_cv_posix_semaphores_enabled = no then AC_DEFINE(POSIX_SEMAPHORES_NOT_ENABLED, 1, @@ -3732,6 +3986,16 @@ # Multiprocessing check for broken sem_getvalue if test $ac_cv_func_sem_getvalue = yes; then AC_MSG_CHECKING(for broken sem_getvalue) +case $host in + *-*-mingw*) + # GCC(mingw) 4.4+ require and use posix threads(pthreads-w32) + # Also system may contain installed pthreads-w32. + # NOTE the test case below don't work for pthreads-w32: + # - SEM_FAILED is not defined; + # - sem_open is stub; + # - sem_getvalue work(!). + ac_cv_broken_sem_getvalue=no;; +esac AC_CACHE_VAL(ac_cv_broken_sem_getvalue, AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include @@ -3818,6 +4082,9 @@ then # check whether wchar_t is signed or not AC_MSG_CHECKING(whether wchar_t is signed) + case $host in + *-*-mingw*) ac_cv_wchar_t_signed=no;; + esac AC_CACHE_VAL(ac_cv_wchar_t_signed, [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include @@ -4248,6 +4515,12 @@ ) AC_MSG_NOTICE([checking for device files]) +case $host in + *-*-mingw*) + ac_cv_file__dev_ptmx=ignore #NOTE: under MSYS environment device exist + ac_cv_file__dev_ptc=no + ;; +esac dnl NOTE: Inform user how to proceed with files when cross compiling. if test "x$cross_compiling" = xyes; then @@ -4279,6 +4552,9 @@ if test "$have_long_long" = yes then + case $host in + *-*-mingw*) ac_cv_have_long_long_format=yes;; + esac AC_MSG_CHECKING(for %lld and %llu printf() format support) AC_CACHE_VAL(ac_cv_have_long_long_format, AC_RUN_IFELSE([AC_LANG_SOURCE([[[ @@ -4331,6 +4607,9 @@ fi +case $host in + *-*-mingw*) ac_cv_have_size_t_format=no;; +esac AC_CACHE_CHECK([for %zd printf() format support], ac_cv_have_size_t_format, [dnl AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include @@ -4377,6 +4656,8 @@ [Define to printf format modifier for Py_ssize_t]) fi +dnl NOTE: check is incorrect for win host systems, i.e. mingw and etc., +dnl but on those systems socklen_t is defined in ws2tcpip.h as int ;) AC_CHECK_TYPE(socklen_t,, AC_DEFINE(socklen_t,int, [Define to `int' if does not define.]),[ @@ -4401,8 +4682,39 @@ THREADHEADERS="$THREADHEADERS \$(srcdir)/$h" done +# FIXME: in cross-compilation env. (mingw on linux) how to select correct compiler ? +# The current py-code will created modules with .so suffix and environment +# variable setting SO=$(SO) don't help +# see output of: python setup.py build --help-compiler +AC_SUBST(PYMOD_BUILDOPT) +case $host in + *-*-mingw*) PYMOD_BUILDOPT="--compiler mingw32";; +esac + +dnl Objects for python and modules +# Python interpreter main program for frozen scripts +AC_SUBST(PYTHON_OBJS_FROZENMAIN) +PYTHON_OBJS_FROZENMAIN="Python/frozenmain.o" +# MODULE_GETPATH - default sys.path calculations +AC_SUBST(MODULE_GETPATH) +MODULE_GETPATH=Modules/getpath.o +case $host in + *-*-mingw*) + dnl "PC" is project sub-directory and we has to prepend user defined flags + CPPFLAGS="-I\$(srcdir)/Python -I\$(srcdir)/PC $CPPFLAGS" + + # FIXME: why windows builds don't use PC/frozen_dllmain.o ? + PYTHON_OBJS_FROZENMAIN="" + # default sys.path calculations for windows platforms + MODULE_GETPATH=PC/getpathp.o + ;; +esac + AC_SUBST(SRCDIRS) SRCDIRS="Parser Grammar Objects Python Modules Mac" +case $host in + *-*-mingw*) SRCDIRS="$SRCDIRS PC";; +esac AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then diff -urN a/Include/objimpl.h b/Include/objimpl.h --- a/Include/objimpl.h 2012-04-10 00:07:29.000000000 +0100 +++ b/Include/objimpl.h 2012-06-24 16:36:40.068817267 +0100 @@ -256,6 +256,12 @@ Py_ssize_t gc_refs; } gc; long double dummy; /* force worst-case alignment */ +#if defined(__MINGW32__) +/* FIXME: what about 64-bit platforms ? + * see http://mail.python.org/pipermail/python-dev/2009-July/090724.html + */ + double dummy1; +#endif } PyGC_Head; extern PyGC_Head *_PyGC_generation0; diff -urN a/Include/pymath.h b/Include/pymath.h --- a/Include/pymath.h 2012-04-10 00:07:29.000000000 +0100 +++ b/Include/pymath.h 2012-06-24 16:36:40.068817267 +0100 @@ -109,6 +109,8 @@ * non-infinite value v sitting in an 80-bit x87 register such that * v becomes infinite when spilled from the register to 64-bit memory. * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf + * FIXME: PC/pyconfig.h defines Py_IS_INFINITY as (!_finite(X) && !_isnan(X)) + * so that above note isn't correct !!! */ #ifndef Py_IS_INFINITY # if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 diff -urN a/Include/pyport.h b/Include/pyport.h --- a/Include/pyport.h 2012-04-10 00:07:29.000000000 +0100 +++ b/Include/pyport.h 2012-06-24 16:36:40.069817274 +0100 @@ -656,6 +656,137 @@ #endif /* 0 */ +#ifdef __MINGW32__ +/* FIXME: some of next definitions specific to gcc(mingw build) can be + generalized on definitions of _WIN32 or WIN32 and to be common for + all windows build instead explicitly to define only for non-autotools + based builds (see PC/pyconfig.h for details). */ +#if defined(_WIN64) +# define MS_WIN64 +#endif +#if !defined(MS_WIN32) && defined(_WIN32) +# define MS_WIN32 +#endif +#if !defined(MS_WIN32) && defined(_WIN32) +# define MS_WIN32 +#endif +#if !defined(MS_WINDOWS) && defined(MS_WIN32) +# define MS_WINDOWS +#endif + +#ifndef PYTHONPATH +# define PYTHONPATH ".\\DLLs;.\\lib;.\\lib\\plat-win;.\\lib\\lib-tk" +#endif + +/* python 2.6+ requires Windows 2000 or greater. */ +#define Py_WINVER 0x0500 + +#if defined(Py_BUILD_CORE) || defined(Py_BUILD_CORE_MODULE) +/* FIXME if NTDDI_xxx is in use by mingw (see PC/pyconfig.h) */ +#ifndef WINVER +# define WINVER Py_WINVER +#endif +#ifndef _WIN32_WINNT +# define _WIN32_WINNT Py_WINVER +#endif +#endif + +#ifdef PLATFORM +/*NOTE: if compile getplatform.c PLATFORM is set to MACHDEP that is + "win" for mingw build (see respective comment in configure.in). */ +# undef PLATFORM +#endif +/* always set to "win32" - see PC/pyconfig.h */ +#define PLATFORM "win32" + +#if defined(MS_WIN64) +# define SIZEOF_HKEY 8 +#elif defined(MS_WIN32) +# define SIZEOF_HKEY 4 +#endif + +/*NOTE: mingw has isinf as macro defined in math.h. + Since PC/pyconfig.h define Py_IS_INFINITY(X) that cover HAVE_DECL_ISFINITE + here for Py_IS_INFINITY we define same as for MSVC build. + This makes HAVE_DECL_ISFINITE needless. + Also see commants in configure.in and pymath.h. */ +#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) + +#ifndef HAVE_LARGEFILE_SUPPORT +/* + FIXME: on windows platforms: + - Python use PY_LONG_LONG(!) for Py_off_t (_fileio.c); + - HAVE_LARGEFILE_SUPPORT is defined in PC/pyconfig.h; + - PC/pyconfig.h define 4 for SIZEOF_OFF_T and 8 for SIZEOF_FPOS_T; + - If HAVE_LARGEFILE_SUPPORT isn't defined python will use off_t(!) + for Py_off_t (see fileobjects.c and bz2module.c). + Since for mingw configure detect 4 for size of "off_t" and 8 - for + "fpos_t" we has to define HAVE_LARGEFILE_SUPPORT too. + TODO: to test with AC_SYS_LARGEFILE and appropriate updates in + python code. +*/ +# define HAVE_LARGEFILE_SUPPORT +#endif + +#if defined(Py_ENABLE_SHARED) +# define MS_COREDLL 1 /* deprecated old symbol, but still in use for windows code */ +#else +# define MS_NO_COREDLL 1 +#endif + +#if Py_UNICODE_SIZE == 2 +/* For mingw is 2 but FIXME: What about to raise error in configure if + unicode size isn't two ? Did python windows code support ucs4 ? */ +# define Py_WIN_WIDE_FILENAMES +#endif + +/* NOTE: Don't define HAVE_STDDEF_H. + * It is defined by PC/pyconfig.h and used by Include/Python.h + * (with comment For size_t?) but isn't required for mingw */ +#define Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE + +/* All other defines from PC/pyconfig.h are in autoconf generated + pyconfig.h */ +#if 0 +/*FIXME: + MSDN: + "The getaddrinfo function was added to the ws2_32.dll on Windows XP + and later." + mingw: + getaddrinfo and getnameinfo is defined for WINVER >= 0x0501. + PC/pyconfig.h: + "Python 2.6+ requires Windows 2000 or greater" + So far so good but socketmodule.h define HAVE_GETADDRINFO and + HAVE_GETNAMEINFO under very specific condition : + # ifdef SIO_GET_MULTICAST_FILTER + # include + So the question is "Separate SDKs" required for w2k in MSVC build ? + TODO: resolve later, may by configure :-/. For now python code will + use fake implementation and if user define appropriate value for + WINVER - the functionas from C runtime. + For details see socketmodule.c . + */ +#ifndef HAVE_GETADDRINFO +# define HAVE_GETADDRINFO +#endif +#ifndef HAVE_GETNAMEINFO +# define HAVE_GETNAMEINFO +#endif +#endif + +/* Refer to . + For mingw host configure detect functions described as HAVE_XXX + in _math.h but as MSVC don't define them we will undefine HAVE_XXX + too to use _Py_* replacements same as MSVC build . + */ +#undef HAVE_ACOSH +#undef HAVE_ASINH +#undef HAVE_ATANH +#undef HAVE_EXPM1 +#undef HAVE_LOG1P + +#endif /*def __MINGW32__*/ + /* On 4.4BSD-descendants, ctype functions serves the whole range of * wchar_t character set rather than single byte code points only. * This characteristic can break some operations of string object @@ -709,12 +840,12 @@ */ /* - All windows ports, except cygwin, are handled in PC/pyconfig.h. + MSVC windows port is handled in PC/pyconfig.h. - BeOS and cygwin are the only other autoconf platform requiring special - linkage handling and both of these use __declspec(). + BeOS, mingw32 and cygwin use autoconf and require special + linkage handling and all of these use __declspec(). */ -#if defined(__CYGWIN__) || defined(__BEOS__) +#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BEOS__) # define HAVE_DECLSPEC_DLL #endif @@ -737,9 +868,17 @@ /* Under Cygwin, auto-import functions to prevent compilation */ /* failures similar to those described at the bottom of 4.1: */ /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ -# if !defined(__CYGWIN__) +# if !defined(__CYGWIN__) && !defined(__MINGW32__) # define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE -# endif /* !__CYGWIN__ */ +# else +# define PyAPI_FUNC(RTYPE) RTYPE +# endif /* !__CYGWIN__ !__MINGW32__ */ + /* NOTE: The issue3945 "compile error in _fileio.c (cygwin)" + * was resolved with modification of code. + * This issue was resolved for gcc(mingw) with enabling auto + * import feature. Since _fileio.c problem now disappear there + * is no more reasons to avoid dllimport for gcc(mingw). + */ # define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE /* module init functions outside the core must be exported */ # if defined(__cplusplus) diff -urN a/Lib/ctypes/test/test_as_parameter.py b/Lib/ctypes/test/test_as_parameter.py --- a/Lib/ctypes/test/test_as_parameter.py 2012-04-10 00:07:29.000000000 +0100 +++ b/Lib/ctypes/test/test_as_parameter.py 2012-06-24 16:36:40.066817253 +0100 @@ -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 -urN a/Lib/ctypes/test/test_functions.py b/Lib/ctypes/test/test_functions.py --- a/Lib/ctypes/test/test_functions.py 2012-04-10 00:07:29.000000000 +0100 +++ b/Lib/ctypes/test/test_functions.py 2012-06-24 16:36:40.065817247 +0100 @@ -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 -urN a/Lib/ctypes/util.py b/Lib/ctypes/util.py --- a/Lib/ctypes/util.py 2012-04-10 00:07:29.000000000 +0100 +++ b/Lib/ctypes/util.py 2012-06-24 16:36:40.066817253 +0100 @@ -7,6 +7,11 @@ if os.name == "nt": def _get_build_version(): + #*********************************************************** + # NOTE: As example for GCC(mingw) build sys.version return: + # '2.7a0 (trunk:M, ,