cmSystemTools: Add GetComspec method to get cmd on Windows

The function attempts to read the path to cmd executable from the
COMSPEC environment variable. Falls back to cmd.exe if the respective
environment variable is not set or path doesn't exist.
This commit is contained in:
Alexey Edelev
2024-08-19 21:10:18 +02:00
parent b2b3c5825f
commit 9ab270f47d
3 changed files with 15 additions and 7 deletions

View File

@@ -573,13 +573,7 @@ cmGlobalNinjaGenerator::cmGlobalNinjaGenerator(cmake* cm)
cm->GetState()->SetWindowsShell(true);
// Attempt to use full path to COMSPEC, default "cmd.exe"
std::string comspec;
if (cmSystemTools::GetEnv("COMSPEC", comspec) &&
cmSystemTools::FileIsFullPath(comspec)) {
this->Comspec = comspec;
} else {
this->Comspec = "cmd.exe";
}
this->Comspec = cmSystemTools::GetComspec();
#endif
cm->GetState()->SetNinja(true);
this->FindMakeProgramFile = "CMakeNinjaFindMake.cmake";

View File

@@ -970,6 +970,17 @@ cmSystemTools::WindowsVersion cmSystemTools::GetWindowsVersion()
result.dwBuildNumber = osviex.dwBuildNumber;
return result;
}
std::string cmSystemTools::GetComspec()
{
std::string comspec;
if (!cmSystemTools::GetEnv("COMSPEC", comspec) ||
!cmSystemTools::FileIsFullPath(comspec)) {
comspec = "cmd.exe";
}
return comspec;
}
#endif
std::string cmSystemTools::GetRealPathResolvingWindowsSubst(

View File

@@ -585,6 +585,9 @@ public:
unsigned int dwBuildNumber;
};
static WindowsVersion GetWindowsVersion();
/** Attempt to get full path to COMSPEC, default "cmd.exe" */
static std::string GetComspec();
#endif
/** Get the real path for a given path, removing all symlinks.