summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2016-11-28 18:16:35 +0100
committerJani Heikkinen <jani.heikkinen@qt.io>2016-12-01 05:07:08 +0000
commitdcd2f8295179170d6459edcb06ff9bd339748de6 (patch)
tree67f3ff9f90b912dfac1b84eda9d6d5236cffd0ee
parent448790eaedff47c8a8df9da964b988e309c06182 (diff)
Fix circular dependencies in generated vcxproj files
For QMAKE_EXTRA_COMPILERS with inputs that are "buildable" (e.g. C++ sources) the custom build step is added to the output file. From Visual Studio's point of view this looks like a circular dependency (e.g. foo.moc generates foo.moc). Usually this just prints a warning that can be ignored. But this circular dependency also breaks dependencies between custom build steps. This became noticeable when the generation of moc_predefs.h was added. Generating moc_predefs.h must be done before any moc custom build step is executed. This patch fixes the issue by using fake files (output file plus suffix ".cbt" for "custom build tool") that act as dummy inputs for the custom build tools. Task-number: QTBUG-16904 Task-number: QTBUG-57196 Change-Id: I4711e44a0551046d215db151fa0312af8a9177a2 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp4
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp7
-rw-r--r--qmake/generators/win32/msvc_vcproj.h1
3 files changed, 11 insertions, 1 deletions
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index 98d60f4f04..70a722ba23 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -2264,6 +2264,10 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info)
bool hasBuiltIn = false;
if (!objectMappedFile.isEmpty()) {
hasBuiltIn = Project->hasBuiltinCompiler(objectMappedFile);
+
+ // Remove the fake file suffix we've added initially to generate correct command lines.
+ inFile.chop(Project->customBuildToolFilterFileSuffix.length());
+
// qDebug("*** Extra compiler file has object mapped file '%s' => '%s'", qPrintable(inFile), qPrintable(objectMappedFile.join(' ')));
}
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index 38e7e96b98..21bdad1bbf 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -198,7 +198,8 @@ const char _slnExtSections[] = "\n\tGlobalSection(ExtensibilityGlobals) = pos
VcprojGenerator::VcprojGenerator()
: Win32MakefileGenerator(),
is64Bit(false),
- projectWriter(0)
+ projectWriter(0),
+ customBuildToolFilterFileSuffix(QStringLiteral(".cbt"))
{
}
@@ -886,8 +887,12 @@ void VcprojGenerator::init()
if (!hasBuiltinCompiler(file)) {
extraCompilerSources[file] += quc.toQString();
} else {
+ // Use a fake file name foo.moc.cbt for the project view.
+ // This prevents VS from complaining about a circular
+ // dependency from foo.moc -> foo.moc.
QString out = Option::fixPathToTargetOS(replaceExtraCompilerVariables(
compiler_out, file, QString(), NoShell), false);
+ out += customBuildToolFilterFileSuffix;
extraCompilerSources[out] += quc.toQString();
extraCompilerOutputs[out] = file;
}
diff --git a/qmake/generators/win32/msvc_vcproj.h b/qmake/generators/win32/msvc_vcproj.h
index 39ba2f0900..e3e67d64b9 100644
--- a/qmake/generators/win32/msvc_vcproj.h
+++ b/qmake/generators/win32/msvc_vcproj.h
@@ -64,6 +64,7 @@ public:
QHash<QString, QStringList> extraCompilerSources;
QHash<QString, QString> extraCompilerOutputs;
+ const QString customBuildToolFilterFileSuffix;
bool usePCH;
VCProjectWriter *projectWriter;