diff options
author | scivision <scivision@users.noreply.github.com> | 2023-08-21 04:40:34 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-09-11 12:47:09 (GMT) |
commit | 6ebf0e1a46ddc3a93421b33af7ffc99f2c89c282 (patch) | |
tree | 2350e45854e10583f1ee2947bee8f4da4718e56d | |
parent | 1345928f9693a038153c43f09128bac0419d91ed (diff) | |
download | CMake-6ebf0e1a46ddc3a93421b33af7ffc99f2c89c282.zip CMake-6ebf0e1a46ddc3a93421b33af7ffc99f2c89c282.tar.gz CMake-6ebf0e1a46ddc3a93421b33af7ffc99f2c89c282.tar.bz2 |
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
-rw-r--r-- | Source/cmGlobalNinjaGenerator.cxx | 9 | ||||
-rw-r--r-- | Source/cmGlobalNinjaGenerator.h | 9 | ||||
-rw-r--r-- | Source/cmLocalNinjaGenerator.cxx | 3 |
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 |