diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 035da5059f6ccf40bc05180c8f450517fe1220e4..64a927fb772a46e042f5584512175ec0084f162a 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -1845,13 +1845,36 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml { // 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 fileAdded = false; + 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(filtername); + if (!data[i].filter.Config) // only if the filter is not empty + continue; + VCFilter &filter = data[i].filter; + + // Clearing each filter tool + filter.useCustomBuildTool = false; + filter.useCompilerTool = false; + filter.CustomBuildTool = VCCustomBuildTool(); + filter.CustomBuildTool.config = filter.Config; + filter.CompilerTool = VCCLCompilerTool(); + filter.CompilerTool.config = filter.Config; + + VCFilterFile fileInFilter = filter.findFile(info.file, &data[i].inBuild); + data[i].inBuild &= !fileInFilter.excludeFromBuild; + if (data[i].inBuild && filter.addExtraCompiler(fileInFilter)) + hasCustomBuildStep = true; + } + bool fileAdded = false; for (int i = 0; i < project.SingleProjects.count(); ++i) { const VCFilter &filter = project.SingleProjects.at(i).filterByName(filtername); - if (filter.Config) // only if the filter is not empty - if (outputFileConfig(filter, xml, xmlFilter, info.file, fileAdded)) // only add it once. - fileAdded = true; + if (!filter.Config) // only if the filter is not empty + continue; + if (outputFileConfig(&data[i], xml, xmlFilter, info.file, fileAdded, + hasCustomBuildStep)) + fileAdded = true; } if ( !fileAdded ) @@ -1861,36 +1884,25 @@ void VCXProjectWriter::outputFileConfigs(VCProject &project, XmlOutput &xml, Xml xmlFilter << closetag(); } -bool VCXProjectWriter::outputFileConfig(VCFilter filter, XmlOutput &xml, XmlOutput &xmlFilter, - const QString &filename, bool fileAdded) +bool VCXProjectWriter::outputFileConfig(OutputFilterData *d, XmlOutput &xml, XmlOutput &xmlFilter, + const QString &filename, bool fileAdded, + bool hasCustomBuildStep) { - // Clearing each filter tool - filter.useCustomBuildTool = false; - filter.useCompilerTool = false; - filter.CustomBuildTool = VCCustomBuildTool(); - filter.CustomBuildTool.config = filter.Config; - filter.CompilerTool = VCCLCompilerTool(); - filter.CompilerTool.config = filter.Config; - - bool inBuild; - VCFilterFile info = filter.findFile(filename, &inBuild); - inBuild &= !info.excludeFromBuild; - - if (inBuild) { - filter.addExtraCompiler(info); + VCFilter &filter = d->filter; + if (d->inBuild) { if (filter.Project->usePCH) - filter.modifyPCHstage(info.file); + filter.modifyPCHstage(filename); } else { // Excluded files uses an empty compiler stage - if(info.excludeFromBuild) + if (d->info.excludeFromBuild) filter.useCompilerTool = true; } // Actual XML output ---------------------------------- - if (filter.useCustomBuildTool || filter.useCompilerTool - || !inBuild || filter.Name.startsWith("Deployment Files")) { + if (hasCustomBuildStep || filter.useCompilerTool + || !d->inBuild || filter.Name.startsWith("Deployment Files")) { - if (filter.useCustomBuildTool) + if (hasCustomBuildStep) { if (!fileAdded) { fileAdded = true; @@ -1919,13 +1931,13 @@ bool VCXProjectWriter::outputFileConfig(VCFilter filter, XmlOutput &xml, XmlOutp } const QString condition = generateCondition(*filter.Config); - if(!inBuild) { + if (!d->inBuild) { xml << tag("ExcludedFromBuild") << attrTag("Condition", condition) << valueTag("true"); } - if (filter.Name.startsWith("Deployment Files") && inBuild) { + if (filter.Name.startsWith("Deployment Files") && d->inBuild) { xml << tag("DeploymentContent") << attrTag("Condition", condition) << valueTag("true"); diff --git a/qmake/generators/win32/msbuild_objectmodel.h b/qmake/generators/win32/msbuild_objectmodel.h index c44897c96af5dd9c422f79f6e2c5ecd51601bc24..6ed82233a35a66471232db97018b6e5795842346 100644 --- a/qmake/generators/win32/msbuild_objectmodel.h +++ b/qmake/generators/win32/msbuild_objectmodel.h @@ -171,10 +171,17 @@ public: void write(XmlOutput &, VCFilter &); private: + struct OutputFilterData + { + VCFilter filter; + VCFilterFile info; + bool inBuild; + }; + static void addFilters(VCProject &project, 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 bool outputFileConfig(VCFilter filter, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filename, bool fileAdded); + 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 QString generateCondition(const VCConfiguration &config);