diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2014-09-26 15:17:55 -0400 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2014-09-26 15:17:55 -0400 |
commit | fb6baa09e5089c3984ee38da5f96b857c7e90c8f (patch) | |
tree | 61e3cdc00bbf32ab0ebde0890be58251540a3eaf | |
parent | 0e2681c1782320311e8cf144d4df923cfafc48c4 (diff) | |
download | external_python_setuptools-fb6baa09e5089c3984ee38da5f96b857c7e90c8f.tar.gz external_python_setuptools-fb6baa09e5089c3984ee38da5f96b857c7e90c8f.tar.bz2 external_python_setuptools-fb6baa09e5089c3984ee38da5f96b857c7e90c8f.zip |
Move monkey patch to a separate module
-rw-r--r-- | setuptools/extension.py | 56 | ||||
-rw-r--r-- | setuptools/msvc9_support.py | 55 |
2 files changed, 58 insertions, 53 deletions
diff --git a/setuptools/extension.py b/setuptools/extension.py index c695976a..8178ed33 100644 --- a/setuptools/extension.py +++ b/setuptools/extension.py @@ -4,63 +4,13 @@ import functools import distutils.core import distutils.errors import distutils.extension -import distutils.msvc9compiler -from setuptools.dist import _get_unpatched +from .dist import _get_unpatched +from . import msvc9_support _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() +msvc9_support.patch_for_specialized_compiler() def have_pyrex(): """ diff --git a/setuptools/msvc9_support.py b/setuptools/msvc9_support.py new file mode 100644 index 00000000..fba2a71a --- /dev/null +++ b/setuptools/msvc9_support.py @@ -0,0 +1,55 @@ +import sys + +import distutils.msvc9compiler + +def patch_for_specialized_compiler(): + """ + Patch functions in distutils.msvc9compiler to use the standalone compiler + build for Python (Windows only). Fall back to original behavior when the + standalone compiler is not available. + """ + 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 |