summaryrefslogtreecommitdiffstats
path: root/qmake/generators/win32/msbuild_objectmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/generators/win32/msbuild_objectmodel.cpp')
-rw-r--r--qmake/generators/win32/msbuild_objectmodel.cpp53
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);