diff options
| author | Jason R. Coombs <jaraco@jaraco.com> | 2014-09-26 17:08:20 -0400 | 
|---|---|---|
| committer | Jason R. Coombs <jaraco@jaraco.com> | 2014-09-26 17:08:20 -0400 | 
| commit | 15f29791a68addcb4e6166cd43f67c1f656f82d3 (patch) | |
| tree | 2781130d0bb1f6ff52c30e0c874bffa8efcd1f2c /setuptools/msvc9_support.py | |
| parent | c735886bf4433d26f8c0679b722e46393a1dd92a (diff) | |
| download | python-setuptools-git-15f29791a68addcb4e6166cd43f67c1f656f82d3.tar.gz | |
Extract patched functions as top-level functions
Diffstat (limited to 'setuptools/msvc9_support.py')
| -rw-r--r-- | setuptools/msvc9_support.py | 78 | 
1 files changed, 41 insertions, 37 deletions
diff --git a/setuptools/msvc9_support.py b/setuptools/msvc9_support.py index f2e5cffc..61ca8579 100644 --- a/setuptools/msvc9_support.py +++ b/setuptools/msvc9_support.py @@ -1,59 +1,63 @@  import sys +distutils = None +unpatched = dict() +  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.      """ +    global distutils      try:          distutils = __import__('distutils.msvc9compiler')      except ImportError:          # The module isn't available to be patched          return -    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.'): +    if unpatched:          # Already patched          return -    def _find_vcvarsall(version): -        Reg = distutils.msvc9compiler.Reg +    unpatched.update(vars(distutils.msvc9compiler)) + +    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: -            # Per-user installs register the compiler path here -            productdir = Reg.get_value(VC_BASE % ('', version), "installdir") +            # All-user installs on a 64-bit system register here +            productdir = Reg.get_value(VC_BASE % ('Wow6432Node\\', 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 +            productdir = None -        if productdir: -            import os -            vcvarsall = os.path.join(productdir, "vcvarsall.bat") -            if os.path.isfile(vcvarsall): -                return vcvarsall +    if productdir: +        import os +        vcvarsall = os.path.join(productdir, "vcvarsall.bat") +        if os.path.isfile(vcvarsall): +            return vcvarsall -        return find_vcvarsall(version) +    return unpatched['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 +def query_vcvarsall(version, *args, **kwargs): +    try: +        return unpatched['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  | 
