diff options
Diffstat (limited to 'Source/cmVSSetupHelper.cxx')
-rw-r--r-- | Source/cmVSSetupHelper.cxx | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/Source/cmVSSetupHelper.cxx b/Source/cmVSSetupHelper.cxx index c414903..ea13649 100644 --- a/Source/cmVSSetupHelper.cxx +++ b/Source/cmVSSetupHelper.cxx @@ -4,6 +4,7 @@ #include "cmSystemTools.h" #include "cmsys/Encoding.hxx" +#include "cmsys/FStream.hxx" #ifndef VSSetupConstants #define VSSetupConstants @@ -43,8 +44,6 @@ const CLSID CLSID_SetupConfiguration = { /* clang-format on */ #endif -const WCHAR* VCToolsetComponent = - L"Microsoft.VisualStudio.Component.VC.Tools.x86.x64"; const WCHAR* Win10SDKComponent = L"Microsoft.VisualStudio.Component.Windows10SDK"; const WCHAR* Win81SDKComponent = @@ -99,11 +98,11 @@ bool cmVSSetupAPIHelper::IsWin81SDKInstalled() } bool cmVSSetupAPIHelper::CheckInstalledComponent( - SmartCOMPtr<ISetupPackageReference> package, bool& bVCToolset, - bool& bWin10SDK, bool& bWin81SDK) + SmartCOMPtr<ISetupPackageReference> package, bool& bWin10SDK, + bool& bWin81SDK) { bool ret = false; - bVCToolset = bWin10SDK = bWin81SDK = false; + bWin10SDK = bWin81SDK = false; SmartBSTR bstrId; if (FAILED(package->GetId(&bstrId))) { return ret; @@ -116,11 +115,6 @@ bool cmVSSetupAPIHelper::CheckInstalledComponent( std::wstring id = std::wstring(bstrId); std::wstring type = std::wstring(bstrType); - if (id.compare(VCToolsetComponent) == 0 && - type.compare(ComponentType) == 0) { - bVCToolset = true; - ret = true; - } // Checks for any version of Win10 SDK. The version is appended at the end of // the @@ -144,7 +138,6 @@ bool cmVSSetupAPIHelper::CheckInstalledComponent( bool cmVSSetupAPIHelper::GetVSInstanceInfo( SmartCOMPtr<ISetupInstance2> pInstance, VSInstanceInfo& vsInstanceInfo) { - bool isVCToolSetInstalled = false; if (pInstance == NULL) return false; @@ -183,6 +176,23 @@ bool cmVSSetupAPIHelper::GetVSInstanceInfo( } } + // Check if a compiler is installed with this instance. + { + std::string const vcRoot = vsInstanceInfo.GetInstallLocation(); + std::string const vcToolsVersionFile = + vcRoot + "/VC/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt"; + std::string vcToolsVersion; + cmsys::ifstream fin(vcToolsVersionFile.c_str()); + if (!fin || !cmSystemTools::GetLineFromStream(fin, vcToolsVersion)) { + return false; + } + vcToolsVersion = cmSystemTools::TrimWhitespace(vcToolsVersion); + std::string const vcToolsDir = vcRoot + "/VC/Tools/MSVC/" + vcToolsVersion; + if (!cmSystemTools::FileIsDirectory(vcToolsDir)) { + return false; + } + } + // Reboot may have been required before the product package was registered // (last). if ((eRegistered & state) == eRegistered) { @@ -208,12 +218,11 @@ bool cmVSSetupAPIHelper::GetVSInstanceInfo( package == NULL) continue; - bool vcToolsetInstalled = false, win10SDKInstalled = false, - win81SDkInstalled = false; - bool ret = CheckInstalledComponent(package, vcToolsetInstalled, - win10SDKInstalled, win81SDkInstalled); + bool win10SDKInstalled = false; + bool win81SDkInstalled = false; + bool ret = + CheckInstalledComponent(package, win10SDKInstalled, win81SDkInstalled); if (ret) { - isVCToolSetInstalled |= vcToolsetInstalled; vsInstanceInfo.IsWin10SDKInstalled |= win10SDKInstalled; vsInstanceInfo.IsWin81SDKInstalled |= win81SDkInstalled; } @@ -222,7 +231,7 @@ bool cmVSSetupAPIHelper::GetVSInstanceInfo( SafeArrayDestroy(lpsaPackages); } - return isVCToolSetInstalled; + return true; } bool cmVSSetupAPIHelper::GetVSInstanceInfo(std::string& vsInstallLocation) |