diff options
Diffstat (limited to 'qmake/generators/win32/msbuild_objectmodel.cpp')
-rw-r--r-- | qmake/generators/win32/msbuild_objectmodel.cpp | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 3bb70c5c19..3d1b05c9b3 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -343,8 +343,8 @@ static QStringList unquote(const QStringList &values) // Tree file generation --------------------------------------------- void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, - VCProject &tool, const QString &filter, const QString &filterId) { - + VCProject &tool, const QString &filter) +{ if (children.size()) { // Filter QString tempFilterName; @@ -364,24 +364,24 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString if ((*it)->children.size()) { if ( !tempFilterName.isEmpty() ) - (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName, filterId); + (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName); else - (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter, filterId); + (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter); } // Second round, do leafs for (it = children.constBegin(); it != end; ++it) if (!(*it)->children.size()) { if ( !tempFilterName.isEmpty() ) - (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName, filterId); + (*it)->generateXML(xml, xmlFilter, it.key(), tool, tempFilterName); else - (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter, filterId); + (*it)->generateXML(xml, xmlFilter, it.key(), tool, filter); } } else { // Leaf xml << tag(_ItemGroup); xmlFilter << tag(_ItemGroup); - VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter, filterId); + VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, info, filter); xmlFilter << closetag(); xml << closetag(); } @@ -389,14 +389,15 @@ void XTreeNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString // Flat file generation --------------------------------------------- void XFlatNode::generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &/*tagName*/, - VCProject &tool, const QString &filter, const QString &filterId) { + VCProject &tool, const QString &filter) +{ if (children.size()) { ChildrenMapFlat::ConstIterator it = children.constBegin(); ChildrenMapFlat::ConstIterator end = children.constEnd(); xml << tag(_ItemGroup); xmlFilter << tag(_ItemGroup); for (; it != end; ++it) { - VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, (*it), filter, filterId); + VCXProjectWriter::outputFileConfigs(tool, xml, xmlFilter, (*it), filter); } xml << closetag(); xmlFilter << closetag(); @@ -1826,21 +1827,29 @@ void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutpu if (!root->hasElements()) return; - root->generateXML(xml, xmlFilter, "", project, filtername, filtername); // output root tree + root->generateXML(xml, xmlFilter, "", project, filtername); // output root tree +} + +static QString stringBeforeFirstBackslash(const QString &str) +{ + int idx = str.indexOf(QLatin1Char('\\')); + return idx == -1 ? str : str.left(idx); } // Output all configurations (by filtername) for a file (by info) // A filters config output is in VCFilter.outputFileConfig() void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, - const VCFilterFile &info, const QString &filtername, - const QString &filterId) + const VCFilterFile &info, const QString &filtername) { + // In non-flat mode the filter names have directory suffixes, e.g. "Generated Files\subdir". + const QString cleanFilterName = stringBeforeFirstBackslash(filtername); + // 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" bool hasCustomBuildStep = false; QVarLengthArray<OutputFilterData> data(project.SingleProjects.count()); for (int i = 0; i < project.SingleProjects.count(); ++i) { - data[i].filter = project.SingleProjects.at(i).filterByName(filterId); + data[i].filter = project.SingleProjects.at(i).filterByName(cleanFilterName); if (!data[i].filter.Config) // only if the filter is not empty continue; VCFilter &filter = data[i].filter; @@ -1854,6 +1863,7 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml filter.CompilerTool.config = filter.Config; VCFilterFile fileInFilter = filter.findFile(info.file, &data[i].inBuild); + data[i].info = fileInFilter; data[i].inBuild &= !fileInFilter.excludeFromBuild; if (data[i].inBuild && filter.addExtraCompiler(fileInFilter)) hasCustomBuildStep = true; @@ -1861,12 +1871,13 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml bool fileAdded = false; for (int i = 0; i < project.SingleProjects.count(); ++i) { - const VCFilter &filter = project.SingleProjects.at(i).filterByName(filterId); - if (!filter.Config) // only if the filter is not empty + OutputFilterData *d = &data[i]; + if (!d->filter.Config) // only if the filter is not empty continue; - if (outputFileConfig(&data[i], xml, xmlFilter, info.file, fileAdded, - hasCustomBuildStep)) + if (outputFileConfig(d, xml, xmlFilter, info.file, filtername, fileAdded, + hasCustomBuildStep)) { fileAdded = true; + } } if ( !fileAdded ) @@ -1877,8 +1888,8 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml } bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter, - const QString &filename, bool fileAdded, - bool hasCustomBuildStep) + const QString &filename, const QString &fullFilterName, + bool fileAdded, bool hasCustomBuildStep) { VCFilter &filter = d->filter; if (d->inBuild) { @@ -1901,7 +1912,7 @@ bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, Xml xmlFilter << tag("CustomBuild") << attrTag("Include", Option::fixPathToTargetOS(filename)) - << attrTagS("Filter", filter.Name); + << attrTagS("Filter", fullFilterName); xml << tag("CustomBuild") << attrTag("Include", Option::fixPathToTargetOS(filename)); @@ -1919,7 +1930,7 @@ bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, Xml if (!fileAdded) { fileAdded = true; - outputFileConfig(xml, xmlFilter, filename, filter.Name); + outputFileConfig(xml, xmlFilter, filename, fullFilterName); } const QString condition = generateCondition(*filter.Config); |