From 04d3a89e20d49a3b5015b071bfdedc81973b090c Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Tue, 23 Sep 2014 18:44:12 +0200 Subject: vcxproj: fix custom build steps in different build variants There's a comment in VCXProjectWriter::outputFileConfigs that states: "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'". This patch adds the code to the comment... Task-number: QTBUG-30373 Change-Id: Ibfef3c80630e08c743bfadce299a8b6a0c58411f Reviewed-by: Oswald Buddenhagen Reviewed-by: Joerg Bornemann --- qmake/generators/win32/msbuild_objectmodel.cpp | 66 +++++++++++++++----------- qmake/generators/win32/msbuild_objectmodel.h | 9 +++- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 035da5059f..64a927fb77 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 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 c44897c96a..6ed82233a3 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); -- cgit v1.2.3