Commit 15f29791 authored by Jason R. Coombs's avatar Jason R. Coombs

Extract patched functions as top-level functions

parent c735886b
import sys import sys
distutils = None
unpatched = dict()
def patch_for_specialized_compiler(): def patch_for_specialized_compiler():
""" """
Patch functions in distutils.msvc9compiler to use the standalone compiler Patch functions in distutils.msvc9compiler to use the standalone compiler
build for Python (Windows only). Fall back to original behavior when the build for Python (Windows only). Fall back to original behavior when the
standalone compiler is not available. standalone compiler is not available.
""" """
global distutils
try: try:
distutils = __import__('distutils.msvc9compiler') distutils = __import__('distutils.msvc9compiler')
except ImportError: except ImportError:
# The module isn't available to be patched # The module isn't available to be patched
return return
VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' if unpatched:
find_vcvarsall = distutils.msvc9compiler.find_vcvarsall
query_vcvarsall = distutils.msvc9compiler.query_vcvarsall
if find_vcvarsall and find_vcvarsall.__module__.startswith('setuptools.'):
# Already patched # Already patched
return return
def _find_vcvarsall(version): unpatched.update(vars(distutils.msvc9compiler))
Reg = distutils.msvc9compiler.Reg
distutils.msvc9compiler.find_vcvarsall = find_vcvarsall
distutils.msvc9compiler.query_vcvarsall = query_vcvarsall
def find_vcvarsall(version):
Reg = distutils.msvc9compiler.Reg
VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f'
try:
# Per-user installs register the compiler path here
productdir = Reg.get_value(VC_BASE % ('', version), "installdir")
except KeyError:
try: try:
# Per-user installs register the compiler path here # All-user installs on a 64-bit system register here
productdir = Reg.get_value(VC_BASE % ('', version), "installdir") productdir = Reg.get_value(VC_BASE % ('Wow6432Node\\', version), "installdir")
except KeyError: except KeyError:
try: productdir = None
# 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: if productdir:
import os import os
vcvarsall = os.path.join(productdir, "vcvarsall.bat") vcvarsall = os.path.join(productdir, "vcvarsall.bat")
if os.path.isfile(vcvarsall): if os.path.isfile(vcvarsall):
return vcvarsall return vcvarsall
return find_vcvarsall(version) return unpatched['find_vcvarsall'](version)
def _query_vcvarsall(version, *args, **kwargs): def query_vcvarsall(version, *args, **kwargs):
try: try:
return query_vcvarsall(version, *args, **kwargs) return unpatched['query_vcvarsall'](version, *args, **kwargs)
except distutils.errors.DistutilsPlatformError: except distutils.errors.DistutilsPlatformError:
exc = sys.exc_info()[1] exc = sys.exc_info()[1]
if exc and "vcvarsall.bat" in exc.args[0]: if exc and "vcvarsall.bat" in exc.args[0]:
message = 'Microsoft Visual C++ %0.1f is required (%s).' % (version, exc.args[0]) message = 'Microsoft Visual C++ %0.1f is required (%s).' % (version, exc.args[0])
if int(version) == 9: if int(version) == 9:
# This redirection link is maintained by Microsoft. # This redirection link is maintained by Microsoft.
# Contact vspython@microsoft.com if it needs updating. # Contact vspython@microsoft.com if it needs updating.
raise distutils.errors.DistutilsPlatformError( raise distutils.errors.DistutilsPlatformError(
message + ' Get it from http://aka.ms/vcpython27' message + ' Get it from http://aka.ms/vcpython27'
) )
raise distutils.errors.DistutilsPlatformError(message) raise distutils.errors.DistutilsPlatformError(message)
raise raise
distutils.msvc9compiler.find_vcvarsall = _find_vcvarsall
distutils.msvc9compiler.query_vcvarsall = _query_vcvarsall
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment