Browse Source

Merge topic 'autogen-no-rcc-stderr'

258ba828 QtAutogen: Process 'rcc --list' stdout and stderr separately (#15523)
acd4f01f cmQtAutoGenerators: Split CR stripping out to helper function
Brad King 10 years ago
parent
commit
df302bcc55

+ 37 - 24
Source/cmQtAutoGenerators.cxx

@@ -170,6 +170,17 @@ static std::string getAutogenTargetDir(cmTarget const* target)
   return targetDir;
 }
 
+static std::string cmQtAutoGeneratorsStripCR(std::string const& line)
+{
+  // Strip CR characters rcc may have printed (possibly more than one!).
+  std::string::size_type cr = line.find('\r');
+  if (cr != line.npos)
+    {
+    return line.substr(0, cr);
+    }
+  return line;
+}
+
 std::string cmQtAutoGenerators::ListQt5RccInputs(cmSourceFile* sf,
                                             cmTarget const* target,
                                             std::vector<std::string>& depends)
@@ -186,54 +197,56 @@ std::string cmQtAutoGenerators::ListQt5RccInputs(cmSourceFile* sf,
 
   command.push_back(absFile);
 
-  std::string output;
+  std::string rccStdOut;
+  std::string rccStdErr;
   int retVal = 0;
-  bool result = cmSystemTools::RunSingleCommand(command, &output, &output,
-                                            &retVal, 0,
-                                            cmSystemTools::OUTPUT_NONE);
+  bool result = cmSystemTools::RunSingleCommand(
+    command, &rccStdOut, &rccStdErr,
+    &retVal, 0, cmSystemTools::OUTPUT_NONE);
   if (!result || retVal)
     {
     std::cerr << "AUTOGEN: error: Rcc list process for " << sf->GetFullPath()
-              << " failed:\n" << output << std::endl;
+              << " failed:\n" << rccStdOut << "\n" << rccStdErr << std::endl;
     return std::string();
     }
 
-  std::istringstream ostr(output);
+  {
+  std::istringstream ostr(rccStdOut);
   std::string oline;
   while(std::getline(ostr, oline))
     {
-    // Strip CR characters rcc may have printed (possibly more than one!).
-    std::string::size_type cr = oline.find('\r');
-    if (cr != oline.npos)
+    oline = cmQtAutoGeneratorsStripCR(oline);
+    if(!oline.empty())
       {
-      oline = oline.substr(0, cr);
+      qrcEntries.push_back(oline);
       }
+    }
+  }
 
-    if (oline.empty())
-      {
-      // The output of rcc --list contains many empty lines.
-      continue;
-      }
-    if (cmHasLiteralPrefix(oline, "RCC: Error in"))
+  {
+  std::istringstream estr(rccStdErr);
+  std::string eline;
+  while(std::getline(estr, eline))
+    {
+    eline = cmQtAutoGeneratorsStripCR(eline);
+    if (cmHasLiteralPrefix(eline, "RCC: Error in"))
       {
       static std::string searchString = "Cannot find file '";
 
-      std::string::size_type pos = oline.find(searchString);
+      std::string::size_type pos = eline.find(searchString);
       if (pos == std::string::npos)
         {
         std::cerr << "AUTOGEN: error: Rcc lists unparsable output "
-                  << oline << std::endl;
+                  << eline << std::endl;
         return std::string();
         }
       pos += searchString.length();
-      std::string::size_type sz = oline.size() - pos - 1;
-      qrcEntries.push_back(oline.substr(pos, sz));
-      }
-    else
-      {
-      qrcEntries.push_back(oline);
+      std::string::size_type sz = eline.size() - pos - 1;
+      qrcEntries.push_back(eline.substr(pos, sz));
       }
     }
+  }
+
   depends.insert(depends.end(), qrcEntries.begin(), qrcEntries.end());
   return cmJoin(qrcEntries, "@list_sep@");
 }

+ 9 - 0
Tests/QtAutogen/CMakeLists.txt

@@ -63,7 +63,15 @@ add_library(codeeditorLib STATIC codeeditor.cpp)
 
 add_library(privateSlot OBJECT private_slot.cpp)
 
+configure_file(generated_resource.qrc.in generated_resource.qrc @ONLY)
+add_custom_command(
+  OUTPUT generated.txt
+  COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/generated.txt.in" "${CMAKE_CURRENT_BINARY_DIR}/generated.txt"
+  DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generated.txt.in"
+  )
+
 add_custom_target(generate_moc_input
+  DEPENDS generated.txt
   COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/myinterface.h.in" "${CMAKE_CURRENT_BINARY_DIR}"
   COMMAND ${CMAKE_COMMAND} -E rename "${CMAKE_CURRENT_BINARY_DIR}/myinterface.h.in" "${CMAKE_CURRENT_BINARY_DIR}/myinterface.h"
 )
@@ -89,6 +97,7 @@ add_executable(QtAutogen main.cpp calwidget.cpp second_widget.cpp foo.cpp blub.c
                multiplewidgets.cpp
                xyz.cpp yaf.cpp gadget.cpp $<TARGET_OBJECTS:privateSlot>
                test.qrc second_resource.qrc resourcetester.cpp generated.cpp ${debug_srcs}
+               ${CMAKE_CURRENT_BINARY_DIR}/generated_resource.qrc
 )
 set_property(TARGET QtAutogen APPEND PROPERTY AUTOGEN_TARGET_DEPENDS generate_moc_input "${CMAKE_CURRENT_BINARY_DIR}/myotherinterface.h")
 

+ 1 - 0
Tests/QtAutogen/generated.txt.in

@@ -0,0 +1 @@
+Some generated text file.

+ 5 - 0
Tests/QtAutogen/generated_resource.qrc.in

@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+    <file>generated.txt</file>
+</qresource>
+</RCC>