fix vcxproj generation for CONFIG-=flat

Commit 4f21eb03 broke the generation of non-flat vcxprojs.
XTreeNode passes filter names to outputFileConfigs that have
the source subdirectory suffixed (e.g. "Generated Files\subdir").
That's why the original code tested the filter names with
QString::startsWith.
I've changed the signature of outputFileConfigs to take a filterId
parameter which contains the unaltered filter name (e.g.
"Generated Files") that will determine the correct filter.

Task-number: QTBUG-41746
Change-Id: If33428526a098f433cd6ceb8ab6608bd9f94ef17
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
This commit is contained in:
Joerg Bornemann 2014-10-07 16:20:58 +02:00 committed by Jani Heikkinen
parent 9b80ed9d56
commit e5a8134765
2 changed files with 23 additions and 16 deletions

View File

@ -341,7 +341,8 @@ static QStringList unquote(const QStringList &values)
} }
// Tree file generation --------------------------------------------- // Tree file generation ---------------------------------------------
void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool, const QString &filter) { void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName,
VCProject &tool, const QString &filter, const QString &filterId) {
if (children.size()) { if (children.size()) {
// Filter // Filter
@ -362,38 +363,39 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString
if ((*it)->children.size()) if ((*it)->children.size())
{ {
if ( !tempFilterName.isEmpty() ) if ( !tempFilterName.isEmpty() )
(*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName); (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName, filterId);
else else
(*it)->generateXML(xml, xmlFilter, it.key(), tool, filter); (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter, filterId);
} }
// Second round, do leafs // Second round, do leafs
for (it = children.constBegin(); it != end; ++it) for (it = children.constBegin(); it != end; ++it)
if (!(*it)->children.size()) if (!(*it)->children.size())
{ {
if ( !tempFilterName.isEmpty() ) if ( !tempFilterName.isEmpty() )
(*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName); (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName, filterId);
else else
(*it)->generateXML(xml, xmlFilter, it.key(), tool, filter); (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter, filterId);
} }
} else { } else {
// Leaf // Leaf
xml << tag(_ItemGroup); xml << tag(_ItemGroup);
xmlFilter << tag(_ItemGroup); xmlFilter << tag(_ItemGroup);
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter); VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter, filterId);
xmlFilter << closetag(); xmlFilter << closetag();
xml << closetag(); xml << closetag();
} }
} }
// Flat file generation --------------------------------------------- // Flat file generation ---------------------------------------------
void XFlatNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &/*tagName*/, VCProject &tool, const QString &filter) { void XFlatNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &/*tagName*/,
VCProject &tool, const QString &filter, const QString &filterId) {
if (children.size()) { if (children.size()) {
ChildrenMapFlat::ConstIterator it = children.constBegin(); ChildrenMapFlat::ConstIterator it = children.constBegin();
ChildrenMapFlat::ConstIterator end = children.constEnd(); ChildrenMapFlat::ConstIterator end = children.constEnd();
xml << tag(_ItemGroup); xml << tag(_ItemGroup);
xmlFilter << tag(_ItemGroup); xmlFilter << tag(_ItemGroup);
for (; it != end; ++it) { for (; it != end; ++it) {
VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, (*it), filter); VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, (*it), filter, filterId);
} }
xml << closetag(); xml << closetag();
xmlFilter << closetag(); xmlFilter << closetag();
@ -1836,19 +1838,21 @@ void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutpu
if (!root->hasElements()) if (!root->hasElements())
return; return;
root->generateXML(xml, xmlFilter, "", project, filtername); // output root tree root->generateXML(xml, xmlFilter, "", project, filtername, filtername); // output root tree
} }
// Output all configurations (by filtername) for a file (by info) // Output all configurations (by filtername) for a file (by info)
// A filters config output is in VCFilter.outputFileConfig() // A filters config output is in VCFilter.outputFileConfig()
void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const VCFilterFile &info, const QString &filtername) void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter,
const VCFilterFile &info, const QString &filtername,
const QString &filterId)
{ {
// We need to check if the file has any custom build step. // We need to check if the file has any custom build step.
// If there is one then it has to be included with "CustomBuild Include" // If there is one then it has to be included with "CustomBuild Include"
bool hasCustomBuildStep = false; bool hasCustomBuildStep = false;
QVarLengthArray<OutputFilterData> data(project.SingleProjects.count()); QVarLengthArray<OutputFilterData> data(project.SingleProjects.count());
for (int i = 0; i < project.SingleProjects.count(); ++i) { for (int i = 0; i < project.SingleProjects.count(); ++i) {
data[i].filter = project.SingleProjects.at(i).filterByName(filtername); data[i].filter = project.SingleProjects.at(i).filterByName(filterId);
if (!data[i].filter.Config) // only if the filter is not empty if (!data[i].filter.Config) // only if the filter is not empty
continue; continue;
VCFilter &filter = data[i].filter; VCFilter &filter = data[i].filter;
@ -1869,7 +1873,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml
bool fileAdded = false; bool fileAdded = false;
for (int i = 0; i < project.SingleProjects.count(); ++i) { for (int i = 0; i < project.SingleProjects.count(); ++i) {
const VCFilter &filter = project.SingleProjects.at(i).filterByName(filtername); const VCFilter &filter = project.SingleProjects.at(i).filterByName(filterId);
if (!filter.Config) // only if the filter is not empty if (!filter.Config) // only if the filter is not empty
continue; continue;
if (outputFileConfig(&data[i], xml, xmlFilter, info.file, fileAdded, if (outputFileConfig(&data[i], xml, xmlFilter, info.file, fileAdded,

View File

@ -56,7 +56,8 @@ public:
} }
virtual void addElement(const QString &filepath, const VCFilterFile &allInfo) = 0; virtual void addElement(const QString &filepath, const VCFilterFile &allInfo) = 0;
virtual void removeElements()= 0; virtual void removeElements()= 0;
virtual void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool, const QString &filter) = 0; virtual void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName,
VCProject &tool, const QString &filter, const QString &filterId) = 0;
virtual bool hasElements() = 0; virtual bool hasElements() = 0;
}; };
@ -106,7 +107,8 @@ public:
children.clear(); children.clear();
} }
void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool, const QString &filter); void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool,
const QString &filter, const QString &filterId);
bool hasElements() { bool hasElements() {
return children.size() != 0; return children.size() != 0;
} }
@ -146,7 +148,8 @@ public:
children.clear(); children.clear();
} }
void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &proj, const QString &filter); void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &proj,
const QString &filter, const QString &filterId);
bool hasElements() { bool hasElements() {
return children.size() != 0; return children.size() != 0;
} }
@ -180,7 +183,7 @@ private:
static void addFilters(VCProject &project, XmlOutput &xmlFilter, const QString &filterName); static void addFilters(VCProject &project, XmlOutput &xmlFilter, const QString &filterName);
static void outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername); static void outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername);
static void outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const VCFilterFile &info, const QString &filtername); static void outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const VCFilterFile &info, const QString &filtername, const QString &filterId);
static bool outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filename, bool fileAdded, bool hasCustomBuildStep); static bool outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filename, bool fileAdded, bool hasCustomBuildStep);
static void outputFileConfig(XmlOutput &xml, XmlOutput &xmlFilter, const QString &fileName, const QString &filterName); static void outputFileConfig(XmlOutput &xml, XmlOutput &xmlFilter, const QString &fileName, const QString &filterName);
static QString generateCondition(const VCConfiguration &config); static QString generateCondition(const VCConfiguration &config);