Issue 5235: distutils seems to only work with VC++ 2008 (9.0) (original) (raw)
Building python extensions using distutils in python 2.6 with only VC++ 2005 installed no longer works.
distutils appears to require VC++ 2008. The documentation on building extensions for Python 2.6 seems to suggest that VC++ 2008, while preferred, is not required and that it should be possible to build extensions with VC++ 2005.
distutils appears to look for vcvarsall.bat in the VC++ 9.0 directories. It decides to use 9.0 based on the return value of distutils.msvc9compiler.find_build_version, which returns 9.0 -- presumably because python 2.6 was built on VC++ 9.0 (2008). Why is does it no longer search for older versions of VC++ (like 2005)? Is this a bug in distutils?
If VC++ 2008 (9.0) is required to build extensions, then the python 2.6 web site should make this clear.
distutils will use the same compiler used to build Python.
If you want to build with a previous version of MSVC, you need to compile Python with that particular version.
That said, MSVCCompiler could probably take new options, to force the MSVC version and the arch.
This is in theory. Are you willing to help me build that patch ?
Some tests on your system would be appreciated.
Hi Tarek, I have been debugging this and found the following: If you set the DISTUTILS_USE_SDK environment variable to any value (I used DISTUTILS_USE_SDK=1) and the MSSdk environment variable to anything (I used MSSdk=1), and you manually run the "vcvarsall.bat" file that a VC++ user should find in his "c:/Program Files/Visual Studio 8/VC" directory, then easy_install/setuptools/distutils works fine for building extensions.
It would appear that if you set those environment variables, and the "cl.exe", and "link.exe", etc. commands can be found on the path (the vcvarsall.bat file would have done this), then distutils.MSVCompiler (msvc9compiler) is perfectly happy to build the extension.
That said, I think it would be nice to have a means of making this more painless. I'm more than happy to help out. If you have things for me to try/test, I'll be happy to do that. Since the compiler class is located automatically, and I don't know much about distutils, I don't, off the top of my head, know how to elegantly provide options to the not-yet-determined compiler class. (I'm sure you could point me in the right direction...)
I have a vmware VM setup with windows xp, python 2.6, and VC++ 2008 to use for testing, so please let me know how I can best be of assistance.
Thanks. -- Eric
On Thu, Feb 12, 2009 at 3:20 PM, Tarek Ziadé <report@bugs.python.org> wrote:
Tarek Ziadé <ziade.tarek@gmail.com> added the comment:
distutils will use the same compiler used to build Python.
If you want to build with a previous version of MSVC, you need to compile Python with that particular version.
That said, MSVCCompiler could probably take new options, to force the MSVC version and the arch.
This is in theory. Are you willing to help me build that patch ?
Some tests on your system would be appreciated.
priority: -> normal type: -> feature request versions: +Python 2.7, Python 3.1 -Python 2.6
Python tracker <report@bugs.python.org> <http://bugs.python.org/issue5235>
Whether VC++ 2008 is required very much depends on what precisely you do in your extension. If you use a different compiler (in particular, a different CRT), chances are fair that the resulting extension crashes the interpreter. Users using a different compiler must understand the issues, and understand why it is safe to use a different CRT.
Hence, I'm not sure that simplifying switching to a different compiler is a good thing - it will likely lead to more frustration because the resulting binaries fail in strange ways.