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.
This commit is contained in:
parent
acd4f01fd8
commit
258ba82882
|
@ -197,48 +197,56 @@ std::string cmQtAutoGenerators::ListQt5RccInputs(cmSourceFile* sf,
|
||||||
|
|
||||||
command.push_back(absFile);
|
command.push_back(absFile);
|
||||||
|
|
||||||
std::string output;
|
std::string rccStdOut;
|
||||||
|
std::string rccStdErr;
|
||||||
int retVal = 0;
|
int retVal = 0;
|
||||||
bool result = cmSystemTools::RunSingleCommand(command, &output, &output,
|
bool result = cmSystemTools::RunSingleCommand(
|
||||||
&retVal, 0,
|
command, &rccStdOut, &rccStdErr,
|
||||||
cmSystemTools::OUTPUT_NONE);
|
&retVal, 0, cmSystemTools::OUTPUT_NONE);
|
||||||
if (!result || retVal)
|
if (!result || retVal)
|
||||||
{
|
{
|
||||||
std::cerr << "AUTOGEN: error: Rcc list process for " << sf->GetFullPath()
|
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();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::istringstream ostr(output);
|
{
|
||||||
|
std::istringstream ostr(rccStdOut);
|
||||||
std::string oline;
|
std::string oline;
|
||||||
while(std::getline(ostr, oline))
|
while(std::getline(ostr, oline))
|
||||||
{
|
{
|
||||||
oline = cmQtAutoGeneratorsStripCR(oline);
|
oline = cmQtAutoGeneratorsStripCR(oline);
|
||||||
if (oline.empty())
|
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
|
|
||||||
{
|
{
|
||||||
qrcEntries.push_back(oline);
|
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());
|
depends.insert(depends.end(), qrcEntries.begin(), qrcEntries.end());
|
||||||
return cmJoin(qrcEntries, "@list_sep@");
|
return cmJoin(qrcEntries, "@list_sep@");
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,15 @@ add_library(codeeditorLib STATIC codeeditor.cpp)
|
||||||
|
|
||||||
add_library(privateSlot OBJECT private_slot.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
|
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 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"
|
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
|
multiplewidgets.cpp
|
||||||
xyz.cpp yaf.cpp gadget.cpp $<TARGET_OBJECTS:privateSlot>
|
xyz.cpp yaf.cpp gadget.cpp $<TARGET_OBJECTS:privateSlot>
|
||||||
test.qrc second_resource.qrc resourcetester.cpp generated.cpp ${debug_srcs}
|
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")
|
set_property(TARGET QtAutogen APPEND PROPERTY AUTOGEN_TARGET_DEPENDS generate_moc_input "${CMAKE_CURRENT_BINARY_DIR}/myotherinterface.h")
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Some generated text file.
|
|
@ -0,0 +1,5 @@
|
||||||
|
<!DOCTYPE RCC><RCC version="1.0">
|
||||||
|
<qresource>
|
||||||
|
<file>generated.txt</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
Loading…
Reference in New Issue