[Numpy-discussion] NumPy and Python 2.6 on Windows
David Cournapeau
david at ar.media.kyoto-u.ac.jp
Sat Dec 27 21:58:55 EST 2008
Lenard Lindstrom wrote:
> David Cournapeau wrote:
>> Hi Lenard,
>>
>>
>> On Sun, Dec 28, 2008 at 5:05 AM, Lenard Lindstrom <len-l at telus.net> wrote:
>>
>>> Hi everyone,
>>>
>>> I build the Pygame dependencies for Windows. With the next Pygame
>>> release, 1.9.0, we would like to include Python 2.6 support. As you
>>> already know, Pygame has NumPy bindings. Though NumPy is not required,
>>> it is a useful addition. I understand NumPy is built with MinGW on
>>> Windows, which I use to with Pygame and its dependencies. I know the
>>> problems linking against msvcr90.dll. I am willing to offer what advice
>>> I can to get NumPy up and running for Python 2.6.
>>>
>> Thanks. I think I have covered most problems concerning python 2.6 and
>> windows in the trunk (upcoming 1.3):
>>
>> - linking against msvcr90.dll
>> - generating manifest for running code snippets (with mingw)
>> - fix some bugs with python 2.6 msvc support (in particular
>> http://bugs.python.org/issue4702)
>>
>> You are welcome to test the trunk to see if that fixes everything. I
>> don't think everything can be fixed for 1.2.2, because the changes are
>> not all trivial (much revamp C99 math support, in particular).
>>
>> Unfortunately, I have been working on some formatting issues which
>> were more difficult than previously thought, and it was time to go to
>> sleep before I actually fixed the problem, so the trunk may be broken
>> ATM. I will fix this now,
>>
>>
> It looks like you have a handle on the problem. How did you get around
> the problems with the incomplete libmsvcr90.a import library? I have
> custom import libraries which you can use if needed.
Do you mean on xp 32 bits or 64 bits ? For the later, I have yet to
submit patchs to the mingw-w64 project - the whole libmsvcr90.a is
missing, actually. For 32 bits, I simply got around it by changing the
missing functions in numpy itself - if we are talking about the same
thing, that is missing time functions for random. You can look at
revisions r6080, r6076, r6074, r6073, r6072,r6070,r6069,r6029,r6028, the
final patch is as follow:
diff --git a/numpy/random/mtrand/randomkit.c
b/numpy/random/mtrand/randomkit.c
index 56f52c0..0fbc40d 100644
--- a/numpy/random/mtrand/randomkit.c
+++ b/numpy/random/mtrand/randomkit.c
@@ -64,18 +64,33 @@
/* static char const rcsid[] =
"@(#) $Jeannot: randomkit.c,v 1.28 2005/07/21 22:14:09 js Exp $"; */
-
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
-#include <time.h>
#include <limits.h>
#include <math.h>
#ifdef _WIN32
/* Windows */
+/* XXX: we have to use this ugly defined(__GNUC__) because it is not
easy to
+ * detect the compiler used in distutils itself */
+#if (defined(__GNUC__) && defined(NPY_NEEDS_MINGW_TIME_WORKAROUND))
+/* FIXME: ideally, we should set this to the real version of MSVCRT. We
need
+ * something higher than 0x601 to enable _ftime64 and co */
+#define __MSVCRT_VERSION__ 0x0700
+#include <time.h>
#include <sys/timeb.h>
+/* mingw msvcr lib import wrongly export _ftime, which does not exist
in the
+ * actual msvc runtime for version >= 8; we make it an alias to
_ftime64, which
+ * is available in those versions of the runtime
+ */
+#define _FTIME(x) _ftime64((x))
+#else
+#include <time.h>
+#include <sys/timeb.h>
+#define _FTIME(x) _ftime((x))
+#endif
#ifndef RK_NO_WINCRYPT
/* Windows crypto */
#ifndef _WIN32_WINNT
@@ -86,6 +101,7 @@
#endif
#else
/* Unix */
+#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#endif
@@ -167,7 +183,7 @@ rk_error rk_randomseed(rk_state *state)
rk_seed(rk_hash(getpid()) ^ rk_hash(tv.tv_sec) ^ rk_hash(tv.tv_usec)
^ rk_hash(clock()), state);
#else
- _ftime(&tv);
+ _FTIME(&tv);
rk_seed(rk_hash(tv.time) ^ rk_hash(tv.millitm) ^ rk_hash(clock()),
state);
#endif
diff --git a/numpy/random/setup.py b/numpy/random/setup.py
index e7955db..dde3119 100644
--- a/numpy/random/setup.py
+++ b/numpy/random/setup.py
@@ -1,13 +1,19 @@
-from os.path import join, split
+from os.path import join, split, dirname
+import os
import sys
+from distutils.dep_util import newer
+from distutils.msvccompiler import get_build_version as
get_msvc_build_version
-def msvc_version():
- """Return the msvc version used to build the running python, None
if not
- built with MSVC."""
- msc_pos = sys.version.find('MSC v.')
- if msc_pos != -1:
- return sys.version[msc_pos+6:msc_pos+10]
- return None
+def needs_mingw_ftime_workaround():
+ # We need the mingw workaround for _ftime if the msvc runtime
version is
+ # 7.1 or above and we build with mingw ...
+ # ... but we can't easily detect compiler version outside distutils
command
+ # context, so we will need to detect in randomkit whether we build
with gcc
+ msver = get_msvc_build_version()
+ if msver and msver >= 8:
+ return True
+
+ return False
def configuration(parent_package='',top_path=None):
from numpy.distutils.misc_util import Configuration, get_mathlibs
@@ -22,6 +28,10 @@ def configuration(parent_package='',top_path=None):
ext.libraries.extend(libs)
return None
+ defs = []
+ if needs_mingw_ftime_workaround():
+ defs.append(("NPY_NEEDS_MINGW_TIME_WORKAROUND", None))
+
libs = []
# Configure mtrand
config.add_extension('mtrand',
@@ -32,7 +42,8 @@ def configuration(parent_package='',top_path=None):
depends = [join('mtrand','*.h'),
join('mtrand','*.pyx'),
join('mtrand','*.pxi'),
- ]
+ ],
+ define_macros = defs,
)
config.add_data_files(('.', join('mtrand', 'randomkit.h')))
David
More information about the NumPy-Discussion
mailing list