mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-20 04:24:36 +08:00
Ninja: Wrap rules using '>' shell redirection with 'cmd /C' on Windows
This is needed for the clang-scan-deps rule added by commit 0e21e55fc5 (Clang: Record Clang 16.0 C++ modules flags only for GNU-like front-end, 2023-03-16). Fixes: #24611
This commit is contained in:
@@ -456,6 +456,22 @@ std::string cmLocalNinjaGenerator::WriteCommandScript(
|
|||||||
return scriptPath;
|
return scriptPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
namespace {
|
||||||
|
bool RuleNeedsCMD(std::string const& cmd)
|
||||||
|
{
|
||||||
|
std::vector<std::string> args;
|
||||||
|
cmSystemTools::ParseWindowsCommandLine(cmd.c_str(), args);
|
||||||
|
auto it = std::find_if(args.cbegin(), args.cend(),
|
||||||
|
[](std::string const& arg) -> bool {
|
||||||
|
// FIXME: Detect more windows shell operators.
|
||||||
|
return cmHasLiteralPrefix(arg, ">");
|
||||||
|
});
|
||||||
|
return it != args.cend();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
std::string cmLocalNinjaGenerator::BuildCommandLine(
|
std::string cmLocalNinjaGenerator::BuildCommandLine(
|
||||||
std::vector<std::string> const& cmdLines, std::string const& outputConfig,
|
std::vector<std::string> const& cmdLines, std::string const& outputConfig,
|
||||||
std::string const& commandConfig, std::string const& customStep,
|
std::string const& commandConfig, std::string const& customStep,
|
||||||
@@ -499,7 +515,8 @@ std::string cmLocalNinjaGenerator::BuildCommandLine(
|
|||||||
|
|
||||||
std::ostringstream cmd;
|
std::ostringstream cmd;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
bool const needCMD = cmdLines.size() > 1;
|
bool const needCMD =
|
||||||
|
cmdLines.size() > 1 || (customStep.empty() && RuleNeedsCMD(cmdLines[0]));
|
||||||
for (auto li = cmdLines.begin(); li != cmdLines.end(); ++li) {
|
for (auto li = cmdLines.begin(); li != cmdLines.end(); ++li) {
|
||||||
if (li != cmdLines.begin()) {
|
if (li != cmdLines.begin()) {
|
||||||
cmd << " && ";
|
cmd << " && ";
|
||||||
|
Reference in New Issue
Block a user