From 4732c1eb7830b7970ad545f3a4630a824650331b Mon Sep 17 00:00:00 2001 From: "J. Goutin" Date: Tue, 2 Aug 2016 20:09:53 +0200 Subject: Fix #707 MSVC patch and Python 2 #707 Fix Python 2 Compatibility, and improve registry lookup (Key may not always be in 64bit registry node). --- setuptools/msvc.py | 67 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/setuptools/msvc.py b/setuptools/msvc.py index 6fb3300b..4616d4be 100644 --- a/setuptools/msvc.py +++ b/setuptools/msvc.py @@ -356,23 +356,12 @@ class RegistryInfo: def __init__(self, platform_info): self.pi = platform_info - @property - def microsoft(self): - """ - Microsoft software registry key. - """ - return os.path.join( - 'Software', - '' if self.pi.current_is_x86() else 'Wow6432Node', - 'Microsoft', - ) - @property def visualstudio(self): """ Microsoft Visual Studio root registry key. """ - return os.path.join(self.microsoft, 'VisualStudio') + return 'VisualStudio' @property def sxs(self): @@ -400,15 +389,14 @@ class RegistryInfo: """ Microsoft Visual C++ for Python registry key. """ - path = r'DevDiv\VCForPython' - return os.path.join(self.microsoft, path) + return r'DevDiv\VCForPython' @property def microsoft_sdk(self): """ Microsoft SDK registry key. """ - return os.path.join(self.microsoft, 'Microsoft SDKs') + return 'Microsoft SDKs' @property def windows_sdk(self): @@ -429,11 +417,29 @@ class RegistryInfo: """ Microsoft Windows Kits Roots registry key. """ - return os.path.join(self.microsoft, r'Windows Kits\Installed Roots') + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else r'\Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) def lookup(self, key, name): """ - Look for values in registry. + Look for values in registry in Microsoft software registry. Parameters ---------- @@ -446,18 +452,23 @@ class RegistryInfo: ------ str: value """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft for hkey in self.HKEYS: try: - bkey = winreg.OpenKey(hkey, key, 0, winreg.KEY_READ) - except OSError: - continue - except IOError: - continue + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue try: return winreg.QueryValueEx(bkey, name)[0] - except OSError: - pass - except IOError: + except (OSError, IOError): pass @@ -500,7 +511,7 @@ class SystemInfo: for key in vckeys: try: bkey = winreg.OpenKey(hkey, key, 0, winreg.KEY_READ) - except IOError: + except (OSError, IOError): continue subkeys, values, _ = winreg.QueryInfoKey(bkey) for i in range(values): @@ -813,7 +824,7 @@ class EnvironmentInfo: Microsoft Visual C++ & Microsoft Foundation Class Includes """ return [os.path.join(self.si.VCInstallDir, 'Include'), - os.path.join(self.si.VCInstallDir, 'ATLMFC\Include')] + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] @property def VCLibraries(self): @@ -1199,5 +1210,5 @@ class EnvironmentInfo: if name: return '%s\\' % name[0] return '' - except IOError: + except (OSError, IOError): return '' -- cgit v1.2.1 From 3ebd9363b715b4dd1a0aa1d89a596d08e4b41d84 Mon Sep 17 00:00:00 2001 From: "J. Goutin" Date: Tue, 2 Aug 2016 20:11:25 +0200 Subject: Update test_msvc.py --- setuptools/tests/test_msvc.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/setuptools/tests/test_msvc.py b/setuptools/tests/test_msvc.py index 8c7e17d3..14e0f208 100644 --- a/setuptools/tests/test_msvc.py +++ b/setuptools/tests/test_msvc.py @@ -73,8 +73,6 @@ class TestModulePatch: mod_name = distutils.msvc9compiler.find_vcvarsall.__module__ assert mod_name == "setuptools.msvc", "find_vcvarsall unpatched" - @pytest.mark.xfail(six.PY2, - reason="https://github.com/pypa/setuptools/issues/707") def test_no_registry_entries_means_nothing_found(self): """ No registry entries or environment variable should lead to an error -- cgit v1.2.1