Explorar o código

cmOutputConverter: Quote hyphens in response files

Fixes: #20070
Brendan O'Rourke %!s(int64=4) %!d(string=hai) anos
pai
achega
144e8dcf40
Modificáronse 2 ficheiros con 20 adicións e 5 borrados
  1. 16 4
      Source/cmOutputConverter.cxx
  2. 4 1
      Source/cmOutputConverter.h

+ 16 - 4
Source/cmOutputConverter.cxx

@@ -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)) {

+ 4 - 1
Source/cmOutputConverter.h

@@ -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
   {