cmOutputConverter: Quote hyphens in response files

Fixes: #20070
This commit is contained in:
Brendan O'Rourke 2021-11-08 11:44:44 -06:00 committed by Brendan O'Rourke
parent 1fad699809
commit 144e8dcf40
2 changed files with 20 additions and 5 deletions

View File

@ -143,7 +143,7 @@ std::string cmOutputConverter::ConvertToOutputFormat(cm::string_view source,
result = this->EscapeForShell(result, true, false, output == WATCOMQUOTE,
output == NINJAMULTI);
} else if (output == RESPONSE) {
result = this->EscapeForShell(result, false, false, false);
result = this->EscapeForShell(result, false, false, false, false, true);
}
return result;
}
@ -175,9 +175,11 @@ static bool cmOutputConverterIsShellOperator(cm::string_view str)
return (shellOperators.count(str) != 0);
}
std::string cmOutputConverter::EscapeForShell(
cm::string_view str, bool makeVars, bool forEcho, bool useWatcomQuote,
bool unescapeNinjaConfiguration) const
std::string cmOutputConverter::EscapeForShell(cm::string_view str,
bool makeVars, bool forEcho,
bool useWatcomQuote,
bool unescapeNinjaConfiguration,
bool forResponse) const
{
// Do not escape shell operators.
if (cmOutputConverterIsShellOperator(str)) {
@ -203,6 +205,9 @@ std::string cmOutputConverter::EscapeForShell(
if (useWatcomQuote) {
flags |= Shell_Flag_WatcomQuote;
}
if (forResponse) {
flags |= Shell_Flag_IsResponse;
}
if (this->GetState()->UseWatcomWMake()) {
flags |= Shell_Flag_WatcomWMake;
}
@ -360,6 +365,13 @@ bool cmOutputConverter::Shell_CharNeedsQuotes(char c, int flags)
return true;
}
/* Quote hyphens in response files */
if (flags & Shell_Flag_IsResponse) {
if (c == '-') {
return true;
}
}
if (flags & Shell_Flag_IsUnix) {
/* On UNIX several special characters need quotes to preserve them. */
if (Shell_CharNeedsQuotesOnUnix(c)) {

View File

@ -88,11 +88,14 @@ public:
Shell_Flag_IsUnix = (1 << 8),
Shell_Flag_UnescapeNinjaConfiguration = (1 << 9),
Shell_Flag_IsResponse = (1 << 10)
};
std::string EscapeForShell(cm::string_view str, bool makeVars = false,
bool forEcho = false, bool useWatcomQuote = false,
bool unescapeNinjaConfiguration = false) const;
bool unescapeNinjaConfiguration = false,
bool forResponse = false) const;
enum class WrapQuotes
{