Browse Source

Autogen: Add Quote function and use it for logging

Sebastian Holtermann 8 years ago
parent
commit
e98465cfed
1 changed files with 73 additions and 51 deletions
  1. 73 51
      Source/cmQtAutoGenerators.cxx

+ 73 - 51
Source/cmQtAutoGenerators.cxx

@@ -36,6 +36,25 @@ static const char* SettingsKeyRcc = "AM_RCC_OLD_SETTINGS";
 
 
 // -- Static functions
 // -- Static functions
 
 
+/**
+ * @brief Returns a the string escaped and enclosed in quotes
+ */
+static std::string Quoted(const std::string& text)
+{
+  static const char* rep[18] = { "\\", "\\\\", "\"", "\\\"", "\a", "\\a",
+                                 "\b", "\\b",  "\f", "\\f",  "\n", "\\n",
+                                 "\r", "\\r",  "\t", "\\t",  "\v", "\\v" };
+
+  std::string res = text;
+  for (const char* const* it = cmArrayBegin(rep); it != cmArrayEnd(rep);
+       it += 2) {
+    cmSystemTools::ReplaceString(res, *it, *(it + 1));
+  }
+  res = '"' + res;
+  res += '"';
+  return res;
+}
+
 static std::string GetConfigDefinition(cmMakefile* makefile,
 static std::string GetConfigDefinition(cmMakefile* makefile,
                                        const std::string& key,
                                        const std::string& key,
                                        const std::string& config)
                                        const std::string& config)
@@ -273,8 +292,8 @@ bool cmQtAutoGenerators::MocDependFilterPush(const std::string& key,
         success = true;
         success = true;
       } else {
       } else {
         this->LogError("AutoMoc: Error in AUTOMOC_DEPEND_FILTERS: Compiling "
         this->LogError("AutoMoc: Error in AUTOMOC_DEPEND_FILTERS: Compiling "
-                       "regular expression failed.\nKey: \"" +
-                       key + "\"\nReg. exp.: \"" + regExp + "\"");
+                       "regular expression failed.\nKey:  " +
+                       Quoted(key) + "\nExp.: " + Quoted(regExp));
       }
       }
     } else {
     } else {
       this->LogError("AutoMoc: Error in AUTOMOC_DEPEND_FILTERS: Regular "
       this->LogError("AutoMoc: Error in AUTOMOC_DEPEND_FILTERS: Regular "
@@ -320,8 +339,8 @@ bool cmQtAutoGenerators::ReadAutogenInfoFile(
   }
   }
   // Check Qt version
   // Check Qt version
   if ((this->QtMajorVersion != "4") && (this->QtMajorVersion != "5")) {
   if ((this->QtMajorVersion != "4") && (this->QtMajorVersion != "5")) {
-    this->LogError("AutoGen: Error: Unsupported Qt version: \"" +
-                   this->QtMajorVersion + "\"");
+    this->LogError("AutoGen: Error: Unsupported Qt version: " +
+                   Quoted(this->QtMajorVersion));
     return false;
     return false;
   }
   }
 
 
@@ -719,13 +738,13 @@ void cmQtAutoGenerators::MocFindDepends(
           if (!incFile.empty()) {
           if (!incFile.empty()) {
             mocDepends[absFilename].insert(incFile);
             mocDepends[absFilename].insert(incFile);
             if (this->Verbose) {
             if (this->Verbose) {
-              this->LogInfo("AutoMoc: Found dependency:\n  \"" + absFilename +
-                            "\"\n  \"" + incFile + "\"");
+              this->LogInfo("AutoMoc: Found dependency:\n  " +
+                            Quoted(absFilename) + "\n  " + Quoted(incFile));
             }
             }
           } else {
           } else {
-            this->LogWarning("AutoMoc: Warning: \"" + absFilename + "\"\n" +
-                             "Could not find dependency file \"" + match +
-                             "\"");
+            this->LogWarning("AutoMoc: Warning: " + Quoted(absFilename) +
+                             "\n" + "Could not find dependency file " +
+                             Quoted(match));
           }
           }
         }
         }
         contentChars += filter.regExp.end();
         contentChars += filter.regExp.end();
@@ -878,9 +897,11 @@ bool cmQtAutoGenerators::MocParseSourceContent(
         } else {
         } else {
           std::ostringstream ost;
           std::ostringstream ost;
           ost << "AutoMoc: Error: " << absFilename << "\n"
           ost << "AutoMoc: Error: " << absFilename << "\n"
-              << "The file includes the moc file \"" << incString
-              << "\", but could not find header \"" << incRealBasename << '{'
-              << JoinExts(this->HeaderExtensions) << "}\"\n";
+              << "The file includes the moc file " << Quoted(incString)
+              << ", but could not find header "
+              << Quoted(incRealBasename + "{" +
+                        JoinExts(this->HeaderExtensions) + "}");
+          ;
           this->LogError(ost.str());
           this->LogError(ost.str());
           return false;
           return false;
         }
         }
@@ -902,32 +923,33 @@ bool cmQtAutoGenerators::MocParseSourceContent(
               fileToMoc = headerToMoc;
               fileToMoc = headerToMoc;
               if (!requiresMoc && (incBasename == scannedFileBasename)) {
               if (!requiresMoc && (incBasename == scannedFileBasename)) {
                 std::ostringstream ost;
                 std::ostringstream ost;
-                ost << "AutoMoc: Warning: " << absFilename << "\n"
-                    << "The file includes the moc file \"" << incString << "\""
+                ost << "AutoMoc: Warning: " << Quoted(absFilename) << "\n"
+                    << "The file includes the moc file " << Quoted(incString)
                     << ", but does not contain a Q_OBJECT or Q_GADGET macro.\n"
                     << ", but does not contain a Q_OBJECT or Q_GADGET macro.\n"
-                    << "Running moc on \"" << headerToMoc << "\"!\n"
-                    << "Include \"moc_" << incBasename
-                    << ".cpp\" for a compatibility with "
-                       "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n";
+                    << "Running moc on " << Quoted(headerToMoc) << "!\n"
+                    << "Include " << Quoted("moc_" + incBasename + ".cpp")
+                    << " for a compatibility with strict mode (see "
+                       "CMAKE_AUTOMOC_RELAXED_MODE).\n";
                 this->LogWarning(ost.str());
                 this->LogWarning(ost.str());
               } else {
               } else {
                 std::ostringstream ost;
                 std::ostringstream ost;
-                ost << "AutoMoc: Warning: " << absFilename << "\n"
-                    << "The file includes the moc file \"" << incString
-                    << "\" instead of \"moc_" << incBasename << ".cpp\".\n"
-                    << "Running moc on \"" << headerToMoc << "\"!\n"
-                    << "Include \"moc_" << incBasename
-                    << ".cpp\" for compatibility with "
-                       "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n";
+                ost << "AutoMoc: Warning: " << Quoted(absFilename) << "\n"
+                    << "The file includes the moc file " << Quoted(incString)
+                    << " instead of " << Quoted("moc_" + incBasename + ".cpp")
+                    << ".\n"
+                    << "Running moc on " << Quoted(headerToMoc) << "!\n"
+                    << "Include " << Quoted("moc_" + incBasename + ".cpp")
+                    << " for compatibility with strict mode (see "
+                       "CMAKE_AUTOMOC_RELAXED_MODE).\n";
                 this->LogWarning(ost.str());
                 this->LogWarning(ost.str());
               }
               }
             } else {
             } else {
               std::ostringstream ost;
               std::ostringstream ost;
-              ost << "AutoMoc: Error: " << absFilename << "\n"
-                  << "The file includes the moc file \"" << incString
-                  << "\", which seems to be the moc file from a different "
+              ost << "AutoMoc: Error: " << Quoted(absFilename) << "\n"
+                  << "The file includes the moc file " << Quoted(incString)
+                  << ". which seems to be the moc file from a different "
                      "source file. CMake also could not find a matching "
                      "source file. CMake also could not find a matching "
-                     "header.\n";
+                     "header.";
               this->LogError(ost.str());
               this->LogError(ost.str());
               return false;
               return false;
             }
             }
@@ -941,21 +963,21 @@ bool cmQtAutoGenerators::MocParseSourceContent(
             // Accept but issue a warning if moc isn't required
             // Accept but issue a warning if moc isn't required
             if (!requiresMoc) {
             if (!requiresMoc) {
               std::ostringstream ost;
               std::ostringstream ost;
-              ost << "AutoMoc: Error: " << absFilename << "\n"
-                  << "The file includes the moc file \"" << incString << "\""
+              ost << "AutoMoc: Error: " << Quoted(absFilename) << "\n"
+                  << "The file includes the moc file " << Quoted(incString)
                   << ", but does not contain a Q_OBJECT or Q_GADGET "
                   << ", but does not contain a Q_OBJECT or Q_GADGET "
-                     "macro.\n";
+                     "macro.";
               this->LogWarning(ost.str());
               this->LogWarning(ost.str());
             }
             }
           } else {
           } else {
             // Don't allow FOO.moc include other than self in strict mode
             // Don't allow FOO.moc include other than self in strict mode
             std::ostringstream ost;
             std::ostringstream ost;
-            ost << "AutoMoc: Error: " << absFilename << "\n"
-                << "The file includes the moc file \"" << incString
-                << "\", which seems to be the moc file from a different "
-                   "source file. This is not supported. Include \""
-                << scannedFileBasename
-                << ".moc\" to run moc on this source file.\n";
+            ost << "AutoMoc: Error: " << Quoted(absFilename) << "\n"
+                << "The file includes the moc file " << Quoted(incString)
+                << ", which seems to be the moc file from a different "
+                   "source file. This is not supported. Include "
+                << Quoted(scannedFileBasename + ".moc")
+                << " to run moc on this source file.";
             this->LogError(ost.str());
             this->LogError(ost.str());
             return false;
             return false;
           }
           }
@@ -978,15 +1000,15 @@ bool cmQtAutoGenerators::MocParseSourceContent(
     if (relaxed && !ownMocUnderscoreInclude.empty()) {
     if (relaxed && !ownMocUnderscoreInclude.empty()) {
       // This is for KDE4 compatibility:
       // This is for KDE4 compatibility:
       std::ostringstream ost;
       std::ostringstream ost;
-      ost << "AutoMoc: Warning: " << absFilename << "\n"
+      ost << "AutoMoc: Warning: " << Quoted(absFilename) << "\n"
           << "The file contains a " << macroName
           << "The file contains a " << macroName
           << " macro, but does not include "
           << " macro, but does not include "
-          << "\"" << scannedFileBasename << ".moc\", but instead includes "
-          << "\"" << ownMocUnderscoreInclude << "\".\n"
-          << "Running moc on \"" << absFilename << "\"!\n"
-          << "Better include \"" << scannedFileBasename
-          << ".moc\" for compatibility with "
-             "strict mode (see CMAKE_AUTOMOC_RELAXED_MODE).\n";
+          << Quoted(scannedFileBasename + ".moc") << ", but instead includes "
+          << Quoted(ownMocUnderscoreInclude) << ".\n"
+          << "Running moc on " << Quoted(absFilename) << "!\n"
+          << "Better include " << Quoted(scannedFileBasename + ".moc")
+          << " for compatibility with strict mode (see "
+             "CMAKE_AUTOMOC_RELAXED_MODE).";
       this->LogWarning(ost.str());
       this->LogWarning(ost.str());
 
 
       // Use scanned source file instead of scanned header file as moc source
       // Use scanned source file instead of scanned header file as moc source
@@ -997,10 +1019,10 @@ bool cmQtAutoGenerators::MocParseSourceContent(
     } else {
     } else {
       // Otherwise always error out since it will not compile:
       // Otherwise always error out since it will not compile:
       std::ostringstream ost;
       std::ostringstream ost;
-      ost << "AutoMoc: Error: " << absFilename << "\n"
+      ost << "AutoMoc: Error: " << Quoted(absFilename) << "\n"
           << "The file contains a " << macroName
           << "The file contains a " << macroName
           << " macro, but does not include "
           << " macro, but does not include "
-          << "\"" << scannedFileBasename << ".moc\"!\n";
+          << Quoted(scannedFileBasename + ".moc") << "!";
       this->LogError(ost.str());
       this->LogError(ost.str());
       return false;
       return false;
     }
     }
@@ -1280,7 +1302,7 @@ bool cmQtAutoGenerators::MocGenerateFile(
         {
         {
           std::ostringstream ost;
           std::ostringstream ost;
           ost << "AutoMoc: Error: moc process failed for\n";
           ost << "AutoMoc: Error: moc process failed for\n";
-          ost << "\"" << mocFileRel << "\"\n";
+          ost << Quoted(mocFileRel) << "\n";
           ost << "AutoMoc: Command:\n" << cmJoin(cmd, " ") << "\n";
           ost << "AutoMoc: Command:\n" << cmJoin(cmd, " ") << "\n";
           ost << "AutoMoc: Command output:\n" << output << "\n";
           ost << "AutoMoc: Command output:\n" << output << "\n";
           this->LogError(ost.str());
           this->LogError(ost.str());
@@ -1419,8 +1441,8 @@ bool cmQtAutoGenerators::UicGenerateFile(const std::string& realName,
         {
         {
           std::ostringstream ost;
           std::ostringstream ost;
           ost << "AutoUic: Error: uic process failed for\n";
           ost << "AutoUic: Error: uic process failed for\n";
-          ost << "\"" << uicFileRel << "\" needed by\n";
-          ost << "\"" << realName << "\"\n";
+          ost << Quoted(uicFileRel) << " needed by\n";
+          ost << Quoted(realName) << "\n";
           ost << "AutoUic: Command:\n" << cmJoin(cmd, " ") << "\n";
           ost << "AutoUic: Command:\n" << cmJoin(cmd, " ") << "\n";
           ost << "AutoUic: Command output:\n" << output << "\n";
           ost << "AutoUic: Command output:\n" << output << "\n";
           this->LogError(ost.str());
           this->LogError(ost.str());
@@ -1558,7 +1580,7 @@ bool cmQtAutoGenerators::RccGenerateFile(const std::string& rccInputFile,
         {
         {
           std::ostringstream ost;
           std::ostringstream ost;
           ost << "AutoRcc: Error: rcc process failed for\n";
           ost << "AutoRcc: Error: rcc process failed for\n";
-          ost << "\"" << rccOutputFile << "\"\n";
+          ost << Quoted(rccOutputFile) << "\n";
           ost << "AutoRcc: Command:\n" << cmJoin(cmd, " ") << "\n";
           ost << "AutoRcc: Command:\n" << cmJoin(cmd, " ") << "\n";
           ost << "AutoRcc: Command output:\n" << output << "\n";
           ost << "AutoRcc: Command output:\n" << output << "\n";
           this->LogError(ost.str());
           this->LogError(ost.str());