Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions newsfragments/5276.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed setuptools.msvc.EnvironmentInfo MSBuild property with VS2017+ -- by :user:`swt2c`
41 changes: 37 additions & 4 deletions setuptools/msvc.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,14 +496,30 @@ def _as_float_version(version):

@property
def VSInstallDir(self) -> str:
"""
r"""
Microsoft Visual Studio directory.

Return
------
str
path

Known VS paths (VS2017+) take precedence over the registry,
which VS2017+ no longer populates.

>>> getfixture('windows_only')
>>> mp = getfixture('monkeypatch')
>>> ei = EnvironmentInfo(arch='irrelevant')
>>> mp.setitem(ei.si.known_vs_paths, ei.si.vs_ver, r'C:\VS\Fake')
>>> ei.si.VSInstallDir
'C:\\VS\\Fake'
"""
# First search in known VS paths (VS2017+)
try:
return self.known_vs_paths[self.vs_ver]
except KeyError:
pass

# Default path
default = os.path.join(
self.ProgramFilesx86, f'Microsoft Visual Studio {self.vs_ver:0.1f}'
Expand Down Expand Up @@ -1316,24 +1332,41 @@ def VsTDb(self):

@property
def MSBuild(self):
"""
r"""
Microsoft Build Engine.

Return
------
list of str
paths

VS2017 keeps a version-numbered folder; VS2019+ uses "Current".

>>> getfixture('windows_only')
>>> mp = getfixture('monkeypatch')
>>> ei = EnvironmentInfo(arch='irrelevant')
>>> mp.setitem(ei.si.known_vs_paths, 15.0, r'C:\VS\2017')
>>> mp.setattr(ei.si, 'vs_ver', 15.0)
>>> ei.MSBuild[0]
'C:\\VS\\2017\\MSBuild\\15.0\\bin'
>>> mp.setitem(ei.si.known_vs_paths, 16.0, r'C:\VS\2019')
>>> mp.setattr(ei.si, 'vs_ver', 16.0)
>>> ei.MSBuild[0]
'C:\\VS\\2019\\MSBuild\\Current\\bin'
"""
if self.vs_ver < 12.0:
return []
elif self.vs_ver < 15.0:
base_path = self.si.ProgramFilesx86
arch_subdir = self.pi.current_dir(hidex86=True)
msbuild_ver_dir = f'{self.vs_ver:0.1f}'
else:
base_path = self.si.VSInstallDir
arch_subdir = ''
# VS2019+ uses "Current", only VS2017 uses its version number
msbuild_ver_dir = 'Current' if self.vs_ver > 15.0 else f'{self.vs_ver:0.1f}'

path = rf'MSBuild\{self.vs_ver:0.1f}\bin{arch_subdir}'
path = rf'MSBuild\{msbuild_ver_dir}\bin{arch_subdir}'
build = [os.path.join(base_path, path)]

if self.vs_ver >= 15.0:
Expand Down Expand Up @@ -1511,8 +1544,8 @@ def return_env(self, exists: bool = True) -> _EnvironmentDict:
self.VsTDb,
self.SdkTools,
self.SdkSetup,
self.FxTools,
self.MSBuild,
self.FxTools,
self.HTMLHelpWorkshop,
self.FSharp,
],
Expand Down
Loading