[Numpy-discussion] Compiling NumPy on Windows for Python 3.3

Peter Cock p.j.a.cock@googlemail....
Sat Nov 10 17:43:54 CST 2012


On Sat, Nov 10, 2012 at 11:24 PM, Peter Cock <p.j.a.cock@googlemail.com> wrote:
>
> I think part of the problem could be in numpy/distutils/misc_util.py
> where there is no code to detect MSCV 10,
>
> def msvc_runtime_library():
>     "Return name of MSVC runtime library if Python was built with MSVC >= 7"
>     msc_pos = sys.version.find('MSC v.')
>     if msc_pos != -1:
>         msc_ver = sys.version[msc_pos+6:msc_pos+10]
>         lib = {'1300' : 'msvcr70',    # MSVC 7.0
>                '1310' : 'msvcr71',    # MSVC 7.1
>                '1400' : 'msvcr80',    # MSVC 8
>                '1500' : 'msvcr90',    # MSVC 9 (VS 2008)
>               }.get(msc_ver, None)
>     else:
>         lib = None
>     return lib
>
> https://github.com/numpy/numpy/blob/master/numpy/distutils/misc_util.py#L353
>
> Under Python 3.3, we have:
>
> Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600
> 32 bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
>>>> import sys
>>>> sys.version
> '3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)]'
>
> i.e. It looks to me like that dictionary needs another entry for key '1600'.
>

Adding this line seems to help,

               '1600' : 'msvcr100',   # MSVC 10 (aka 2010)

Now my compile gets further, but runs into another issue:

  File "c:\python33\lib\distutils\command\config.py", line 246, in try_link
    libraries, library_dirs, lang)
  File "C:\Downloads\numpy-1.7.0b2\build\py3k\numpy\distutils\command\config.py",
line 146, in _link
    generate_manifest(self)
  File "C:\Downloads\numpy-1.7.0b2\build\py3k\numpy\distutils\mingw32ccompiler.py",
line 562, in generate_manifest
    check_embedded_msvcr_match_linked(msver)
  File "C:\Downloads\numpy-1.7.0b2\build\py3k\numpy\distutils\mingw32ccompiler.py",
line 541, in check_embedded_msvcr_match_linked
    "(%d)" % (int(msver), maj))
ValueError: Discrepancy between linked msvcr (10) and the one about to
be embedded (1)

My hunch was version something about the new three digit version
number is breaking things... which appears to be breaking here:

def check_embedded_msvcr_match_linked(msver):
    """msver is the ms runtime version used for the MANIFEST."""
    # check msvcr major version are the same for linking and
    # embedding
    msvcv = msvc_runtime_library()
    if msvcv:
        maj = int(msvcv[5:6])
        if not maj == int(msver):
            raise ValueError(
                  "Discrepancy between linked msvcr " \
                  "(%d) and the one about to be embedded " \
                  "(%d)" % (int(msver), maj))

https://github.com/numpy/numpy/blob/master/numpy/distutils/mingw32ccompiler.py#L530

As you can see, to get the major version number from the
string it looks at the first digit. When the string was something
like "81" or "90" that was fine, but now it is "100". Instead it
should look at all the digits up to the final one, i.e. use:

        maj = int(msvcv[5:-1])

Now (finally), I get an understandable (but hopefully wrong)
error message from trying to build NumPy 1.7.0b2 under
Python 3.3 on Windows XP,

  File "numpy\core\setup.py", line 646, in get_mathlib_info
    st = config_cmd.try_link('int main(void) { return 0;}')
  File "c:\python33\lib\distutils\command\config.py", line 246, in try_link
    libraries, library_dirs, lang)
  File "C:\Downloads\numpy-1.7.0b2\build\py3k\numpy\distutils\command\config.py",
line 146, in _link
    generate_manifest(self)
  File "C:\Downloads\numpy-1.7.0b2\build\py3k\numpy\distutils\mingw32ccompiler.py",
line 568, in generate_manifest
    manxml = msvc_manifest_xml(ma, mi)
  File "C:\Downloads\numpy-1.7.0b2\build\py3k\numpy\distutils\mingw32ccompiler.py",
line 484, in msvc_manifest_xml
    % (maj, min))
ValueError: Version 10,0 of MSVCRT not supported yet

Presumably those two changes I have described are worth
committing to the trunk anyway? I can prepare a patch or
pull request, but currently I've been working on this Windows
box remotely and I'd prefer to wait until next week when I
can do it directly on the machine concerned.

Files affected:
numpy/distutils/misc_util.py function msvc_runtime_library
numpy/distutils/mingw32ccompiler.py function check_embedded_msvcr_match_linked

Peter


More information about the NumPy-Discussion mailing list