summaryrefslogtreecommitdiffstats
path: root/Source/cmVSSetupHelper.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2022-10-26 15:10:40 (GMT)
committerBrad King <brad.king@kitware.com>2022-10-26 15:12:46 (GMT)
commit6eee8c9000cff8d5a5051b1bad28e611bc93db2d (patch)
tree1682d8a4ff0020f49b3cfa25fec9463be46928bd /Source/cmVSSetupHelper.cxx
parent85191f65d26a6973f16db0e6dbcb91b23cfa6fcc (diff)
downloadCMake-6eee8c9000cff8d5a5051b1bad28e611bc93db2d.zip
CMake-6eee8c9000cff8d5a5051b1bad28e611bc93db2d.tar.gz
CMake-6eee8c9000cff8d5a5051b1bad28e611bc93db2d.tar.bz2
VS: Fix crash finding vswhere on 32-bit Windows
Since commit f85913fa08 (VS: Add support for enumerating VS instances with vswhere, 2022-04-11, v3.24.0-rc1~282^2), if the COM lookup does not report any VS instances, we fall back to finding vswhere. However, the `getenv` call returns nullptr if the `ProgramFiles(x86)` environment variable is not set. Update the logic to tolerate not-set environment variables. Also check the plain `ProgramFiles` environment variable. Fixes: #24090
Diffstat (limited to 'Source/cmVSSetupHelper.cxx')
-rw-r--r--Source/cmVSSetupHelper.cxx23
1 files changed, 21 insertions, 2 deletions
diff --git a/Source/cmVSSetupHelper.cxx b/Source/cmVSSetupHelper.cxx
index 1a3e72e..8764f21 100644
--- a/Source/cmVSSetupHelper.cxx
+++ b/Source/cmVSSetupHelper.cxx
@@ -300,13 +300,32 @@ bool cmVSSetupAPIHelper::IsEWDKEnabled()
return false;
}
+#if !defined(CMAKE_BOOTSTRAP)
+namespace {
+std::string FindVsWhereCommand()
+{
+ std::string vswhere;
+ static const char* programFiles[] = { "ProgramFiles(x86)", "ProgramFiles" };
+ for (const char* pf : programFiles) {
+ if (cmSystemTools::GetEnv(pf, vswhere)) {
+ vswhere += "/Microsoft Visual Studio/Installer/vswhere.exe";
+ if (cmSystemTools::FileExists(vswhere)) {
+ return vswhere;
+ }
+ }
+ }
+ vswhere = "vswhere.exe";
+ return vswhere;
+}
+}
+#endif
+
bool cmVSSetupAPIHelper::EnumerateVSInstancesWithVswhere(
std::vector<VSInstanceInfo>& VSInstances)
{
#if !defined(CMAKE_BOOTSTRAP)
// Construct vswhere command to get installed VS instances in JSON format
- std::string vswhereExe = getenv("ProgramFiles(x86)") +
- std::string(R"(\Microsoft Visual Studio\Installer\vswhere.exe)");
+ std::string vswhereExe = FindVsWhereCommand();
std::vector<std::string> vswhereCmd = { vswhereExe, "-format", "json" };
// Execute vswhere command and capture JSON output