From c5b5127be23e0b5aaaed19f86aea16e5bcd5f4bb Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@nokia.com>
Date: Wed, 10 Mar 2010 16:13:53 +0100
Subject: [PATCH] Disable shadow building when appropriate

Reviewed-by: dt
---
 .../qt4buildconfiguration.cpp                 | 16 +++++++++-----
 .../qt4projectmanager/qtversionmanager.cpp    | 22 +++++++++++++++++++
 .../qt4projectmanager/qtversionmanager.h      |  3 +++
 3 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 3dc6cf025fb..a6c3083501c 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -136,11 +136,14 @@ bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
             m_qtVersionId = versions.at(0)->uniqueId();
     }
 
-    if (!qtVersion()->isValid() || !qtVersion()->supportedTargetIds().contains(target()->id())) {
-        qWarning() << "Buildconfiguration" << displayName() << ": Qt" << qtVersion()->displayName() << "not supported by target" << target()->id();
+    QtVersion *version = qtVersion();
+    if (!version->isValid() || !version->supportedTargetIds().contains(target()->id())) {
+        qWarning() << "Buildconfiguration" << displayName() << ": Qt" << version->displayName() << "not supported by target" << target()->id();
         return false;
     }
 
+    m_shadowBuild = (m_shadowBuild && version->isValid() && version->supportsShadowBuilds());
+
     QList<ToolChain::ToolChainType> possibleTcs(qt4Target()->filterToolChainTypes(qtVersion()->possibleToolChainTypes()));
     if (!possibleTcs.contains(toolChainType()))
         setToolChainType(qt4Target()->preferredToolChainType(possibleTcs));
@@ -235,11 +238,14 @@ QString Qt4BuildConfiguration::shadowBuildDirectory() const
 
 void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory)
 {
-    if (m_shadowBuild == shadowBuild && m_buildDirectory == buildDirectory)
+    QtVersion *version = qtVersion();
+    QString directoryToSet = QDir::fromNativeSeparators(buildDirectory);
+    bool toSet = (shadowBuild && version->isValid() && version->supportsShadowBuilds());
+    if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet)
         return;
 
-    m_shadowBuild = shadowBuild;
-    m_buildDirectory = buildDirectory;
+    m_shadowBuild = toSet;
+    m_buildDirectory = directoryToSet;
     emit buildDirectoryChanged();
     emit proFileEvaluateNeeded(this);
 }
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 1c21a56b788..003809aea44 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -613,6 +613,28 @@ QString QtVersion::toHtml() const
     return rc;
 }
 
+bool QtVersion::supportsShadowBuilds() const
+{
+    QSet<QString> targets = supportedTargetIds();
+    // Symbian does not support shadow building
+    if (targets.contains(Constants::S60_DEVICE_TARGET_ID) ||
+        targets.contains(Constants::S60_EMULATOR_TARGET_ID)) {
+	// We can not support shadow building with the ABLD system
+        return false;
+    }
+    if (targets.contains(Constants::MAEMO_DEVICE_TARGET_ID)) {
+#if defined(Q_OS_WIN)
+        // qmake -unix fails with shadow building on windows
+        return false;
+#else
+        // ... but works fine anywhere else
+        return true;
+#endif
+    }
+
+    return true;
+}
+
 QString QtVersion::displayName() const
 {
     return m_displayName;
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index 0c71d1649a8..02d2d5bcea5 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -136,6 +136,9 @@ public:
 
     QmakeBuildConfigs defaultBuildConfig() const;
     QString toHtml() const;
+
+    bool supportsShadowBuilds() const;
+
 private:
     QList<QSharedPointer<ProjectExplorer::ToolChain> > toolChains() const;
     static int getUniqueId();
-- 
GitLab