From 6ebf0e1a46ddc3a93421b33af7ffc99f2c89c282 Mon Sep 17 00:00:00 2001 From: scivision Date: Mon, 21 Aug 2023 00:40:34 -0400 Subject: Ninja: Use absolute path to COMSPEC if possible If the COMSPEC is set to an absolute path, use it instead of just `cmd.exe`. This avoids searching for the tool in the current working directory and the `PATH`. If COMSPEC is not set to an absolute path, fall back to the existing behavior. Issue: #18350 --- Source/cmGlobalNinjaGenerator.cxx | 9 +++++++++ Source/cmGlobalNinjaGenerator.h | 9 +++++++++ Source/cmLocalNinjaGenerator.cxx | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) 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 -- cgit v0.12