From 258ba82882545d70162c865e56fc024ccd9cd164 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 20 Apr 2015 16:42:19 -0400 Subject: [PATCH] QtAutogen: Process 'rcc --list' stdout and stderr separately (#15523) The stderr may have warning messages. We should not treat these lines as resource files. However, we must still recognize error message lines for missing resource files that may be generated. Extend the QtAutogen test to cover a generated resource as the only one listed in a .qrc file. This causes 'rcc --list' to print a warning to stderr that we now intend to ignore. --- Source/cmQtAutoGenerators.cxx | 62 +++++++++++++---------- Tests/QtAutogen/CMakeLists.txt | 9 ++++ Tests/QtAutogen/generated.txt.in | 1 + Tests/QtAutogen/generated_resource.qrc.in | 5 ++ 4 files changed, 50 insertions(+), 27 deletions(-) create mode 100644 Tests/QtAutogen/generated.txt.in create mode 100644 Tests/QtAutogen/generated_resource.qrc.in diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx index 547be6e1a..644c528c8 100644 --- a/Source/cmQtAutoGenerators.cxx +++ b/Source/cmQtAutoGenerators.cxx @@ -197,48 +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)) { oline = cmQtAutoGeneratorsStripCR(oline); - if (oline.empty()) - { - // The output of rcc --list contains many empty lines. - continue; - } - if (cmHasLiteralPrefix(oline, "RCC: Error in")) - { - static std::string searchString = "Cannot find file '"; - - std::string::size_type pos = oline.find(searchString); - if (pos == std::string::npos) - { - std::cerr << "AUTOGEN: error: Rcc lists unparsable output " - << oline << 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 + if(!oline.empty()) { qrcEntries.push_back(oline); } } + } + + { + 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 = eline.find(searchString); + if (pos == std::string::npos) + { + std::cerr << "AUTOGEN: error: Rcc lists unparsable output " + << eline << std::endl; + return std::string(); + } + pos += searchString.length(); + 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@"); } diff --git a/Tests/QtAutogen/CMakeLists.txt b/Tests/QtAutogen/CMakeLists.txt index f76d11e0a..60b44fd96 100644 --- a/Tests/QtAutogen/CMakeLists.txt +++ b/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 $ 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") diff --git a/Tests/QtAutogen/generated.txt.in b/Tests/QtAutogen/generated.txt.in new file mode 100644 index 000000000..77507bb8e --- /dev/null +++ b/Tests/QtAutogen/generated.txt.in @@ -0,0 +1 @@ +Some generated text file. diff --git a/Tests/QtAutogen/generated_resource.qrc.in b/Tests/QtAutogen/generated_resource.qrc.in new file mode 100644 index 000000000..da5fa6289 --- /dev/null +++ b/Tests/QtAutogen/generated_resource.qrc.in @@ -0,0 +1,5 @@ + + + generated.txt + +