summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx9
-rw-r--r--Source/cmGlobalNinjaGenerator.h9
-rw-r--r--Source/cmLocalNinjaGenerator.cxx3
3 files changed, 20 insertions, 1 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index 54c3737..30305a1 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -554,6 +554,15 @@ cmGlobalNinjaGenerator::cmGlobalNinjaGenerator(cmake* cm)
{
#ifdef _WIN32
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";
+ }
#endif
this->FindMakeProgramFile = "CMakeNinjaFindMake.cmake";
}
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index 4b026eb..c43e27c 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -282,6 +282,10 @@ public:
};
MapToNinjaPathImpl MapToNinjaPath() { return { this }; }
+#ifdef _WIN32
+ std::string const& GetComspec() const { return this->Comspec; }
+#endif
+
// -- Additional clean files
void AddAdditionalCleanFile(std::string fileName, const std::string& config);
const char* GetAdditionalCleanTargetName() const
@@ -592,6 +596,11 @@ private:
codecvt_Encoding NinjaExpectedEncoding = codecvt_Encoding::None;
+#ifdef _WIN32
+ // Windows Command shell.
+ std::string Comspec;
+#endif
+
bool DiagnosedCxxModuleNinjaSupport = false;
void InitOutputPathPrefix();
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index 2316fb3..bc3da6e 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -538,13 +538,14 @@ std::string cmLocalNinjaGenerator::BuildCommandLine(
std::ostringstream cmd;
#ifdef _WIN32
+ cmGlobalNinjaGenerator const* gg = this->GetGlobalNinjaGenerator();
bool const needCMD =
cmdLines.size() > 1 || (customStep.empty() && RuleNeedsCMD(cmdLines[0]));
for (auto li = cmdLines.begin(); li != cmdLines.end(); ++li) {
if (li != cmdLines.begin()) {
cmd << " && ";
} else if (needCMD) {
- cmd << "cmd.exe /C \"";
+ cmd << gg->GetComspec() << " /C \"";
}
// Put current cmdLine in brackets if it contains "||" because it has
// higher precedence than "&&" in cmd.exe