diff options
author | Steve Dower <steve.dower@microsoft.com> | 2014-09-25 08:46:53 -0700 |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2014-09-25 08:46:53 -0700 |
commit | b0f93f3bdd1d67cce1dd03d4a6ecea8256fa4e55 (patch) | |
tree | 039f9235f98626c0a63c2db71a3b62837e052477 /setuptools/extension.py | |
parent | d42aea783a347d431eaf293250bab60c05b4c779 (diff) | |
download | external_python_setuptools-b0f93f3bdd1d67cce1dd03d4a6ecea8256fa4e55.tar.gz external_python_setuptools-b0f93f3bdd1d67cce1dd03d4a6ecea8256fa4e55.tar.bz2 external_python_setuptools-b0f93f3bdd1d67cce1dd03d4a6ecea8256fa4e55.zip |
Adds monkeypatching for msvc9compiler.find_vcvarsall() to look for a standalone compiler installation and improves the error message for missing VC installation.
Diffstat (limited to 'setuptools/extension.py')
-rw-r--r-- | setuptools/extension.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/setuptools/extension.py b/setuptools/extension.py index ab5908da..41a817b7 100644 --- a/setuptools/extension.py +++ b/setuptools/extension.py @@ -2,12 +2,66 @@ import sys import re import functools import distutils.core +import distutils.errors import distutils.extension +import distutils.msvc9compiler from setuptools.dist import _get_unpatched _Extension = _get_unpatched(distutils.core.Extension) +def _patch_msvc9compiler_find_vcvarsall(): + """ + Looks for the standalone VC for Python before falling back on + distutils's original approach. + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + find_vcvarsall = distutils.msvc9compiler.find_vcvarsall + query_vcvarsall = distutils.msvc9compiler.query_vcvarsall + if find_vcvarsall and find_vcvarsall.__module__.startswith('setuptools.'): + # Already patched + return + + def _find_vcvarsall(version): + Reg = distutils.msvc9compiler.Reg + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(VC_BASE % ('', version), "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + productdir = Reg.get_value(VC_BASE % ('Wow6432Node\\', version), "installdir") + except KeyError: + productdir = None + + if productdir: + import os + vcvarsall = os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return find_vcvarsall(version) + + def _query_vcvarsall(version, *args, **kwargs): + try: + return query_vcvarsall(version, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + exc = sys.exc_info()[1] + if exc and "vcvarsall.bat" in exc.args[0]: + message = 'Microsoft Visual C++ %0.1f is required (%s).' % (version, exc.args[0]) + if int(version) == 9: + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + raise distutils.errors.DistutilsPlatformError( + message + ' Get it from http://aka.ms/vcpython27' + ) + raise distutils.errors.DistutilsPlatformError(message) + raise + + distutils.msvc9compiler.find_vcvarsall = _find_vcvarsall + distutils.msvc9compiler.query_vcvarsall = _query_vcvarsall +_patch_msvc9compiler_find_vcvarsall() + def have_pyrex(): """ Return True if Cython or Pyrex can be imported. |