cmOutputConverter: Quote hyphens in response files

Fixes: #20070
diff --git a/Source/cmOutputConverter.cxx b/Source/cmOutputConverter.cxx
index 02b4821..4503038 100644
--- a/Source/cmOutputConverter.cxx
+++ b/Source/cmOutputConverter.cxx
@@ -143,7 +143,7 @@
     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 @@
   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 @@
   if (useWatcomQuote) {
     flags |= Shell_Flag_WatcomQuote;
   }
+  if (forResponse) {
+    flags |= Shell_Flag_IsResponse;
+  }
   if (this->GetState()->UseWatcomWMake()) {
     flags |= Shell_Flag_WatcomWMake;
   }
@@ -360,6 +365,13 @@
     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)) {
diff --git a/Source/cmOutputConverter.h b/Source/cmOutputConverter.h
index 53ec247..335442d 100644
--- a/Source/cmOutputConverter.h
+++ b/Source/cmOutputConverter.h
@@ -88,11 +88,14 @@
     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
   {