From 9f68456b6513dbb31aad7211c48a85637b1c97cd Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Wed, 1 Sep 2010 12:33:53 +0200
Subject: [PATCH] Give our Profile parser more information from the qmakestep

e.g. DEFINES+=bla on the qmakestep command line now work

Task-Nr: QTCREATORBUG-2091
---
 src/plugins/qt4projectmanager/qmakestep.cpp   | 24 ++++++-------
 src/plugins/qt4projectmanager/qmakestep.h     |  1 +
 .../qt4buildconfiguration.cpp                 | 34 +++++++++++--------
 .../qt4projectmanager/qt4buildconfiguration.h |  5 ++-
 src/plugins/qt4projectmanager/qt4nodes.cpp    | 14 ++++----
 src/shared/proparser/profileevaluator.cpp     | 20 +++++------
 src/shared/proparser/profileevaluator.h       |  2 +-
 7 files changed, 55 insertions(+), 45 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index a27fa68b20d..0d78fb428d7 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -115,18 +115,7 @@ QStringList QMakeStep::allArguments()
         arguments << "-spec" << bc->qtVersion()->mkspec();
 
     // Find out what flags we pass on to qmake
-    QStringList addedUserConfigArguments;
-    QStringList removedUserConfigArguments;
-    bc->getConfigCommandLineArguments(&addedUserConfigArguments, &removedUserConfigArguments);
-    if (!removedUserConfigArguments.isEmpty()) {
-        foreach (const QString &removedConfig, removedUserConfigArguments)
-            arguments.append("CONFIG-=" + removedConfig);
-    }
-    if (!addedUserConfigArguments.isEmpty()) {
-        foreach (const QString &addedConfig, addedUserConfigArguments)
-            arguments.append("CONFIG+=" + addedConfig);
-    }
-
+    arguments << bc->configCommandLineArguments();
     arguments << moreArguments();
 
     if (!additonalArguments.isEmpty())
@@ -286,6 +275,17 @@ void QMakeStep::setUserArguments(const QStringList &arguments)
     emit userArgumentsChanged();
 
     qt4BuildConfiguration()->emitQMakeBuildConfigurationChanged();
+    qt4BuildConfiguration()->emitProFileEvaluteNeeded();
+}
+
+QStringList QMakeStep::parserArguments()
+{
+    QStringList result;
+    foreach (const QString &str, allArguments()) {
+        if (str.contains("="))
+            result << str;
+    }
+    return result;
 }
 
 QStringList QMakeStep::userArguments()
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index daa25f204e4..4a5936dde0a 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -88,6 +88,7 @@ public:
     // TODO clean up those functions
     QStringList allArguments();
     QStringList moreArguments();
+    QStringList parserArguments();
     QStringList userArguments();
     void setUserArguments(const QStringList &arguments);
 
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index eb42cd9bc42..5696ccef07b 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -363,6 +363,11 @@ void Qt4BuildConfiguration::setQMakeBuildConfiguration(QtVersion::QmakeBuildConf
     emit qmakeBuildConfigurationChanged();
 }
 
+void Qt4BuildConfiguration::emitProFileEvaluteNeeded()
+{
+    emit proFileEvaluateNeeded(this);
+}
+
 void Qt4BuildConfiguration::emitQMakeBuildConfigurationChanged()
 {
     emit qmakeBuildConfigurationChanged();
@@ -379,26 +384,25 @@ void Qt4BuildConfiguration::emitS60CreatesSmartInstallerChanged()
 }
 
 
-void Qt4BuildConfiguration::getConfigCommandLineArguments(QStringList *addedUserConfigs, QStringList *removedUserConfigs) const
+QStringList Qt4BuildConfiguration::configCommandLineArguments() const
 {
+    QStringList result;
     QtVersion::QmakeBuildConfigs defaultBuildConfiguration = qtVersion()->defaultBuildConfig();
     QtVersion::QmakeBuildConfigs userBuildConfiguration = m_qmakeBuildConfiguration;
-    if (removedUserConfigs) {
-        if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(userBuildConfiguration & QtVersion::BuildAll))
-            (*removedUserConfigs) << "debug_and_release";
-    }
-    if (addedUserConfigs) {
-        if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (userBuildConfiguration & QtVersion::BuildAll))
-            (*addedUserConfigs) << "debug_and_release";
-        if ((defaultBuildConfiguration & QtVersion::DebugBuild)
-             && !(userBuildConfiguration & QtVersion::DebugBuild)
-             && !(userBuildConfiguration & QtVersion::BuildAll))
-            (*addedUserConfigs) << "release";
-        if (!(defaultBuildConfiguration & QtVersion::DebugBuild)
+    if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(userBuildConfiguration & QtVersion::BuildAll))
+        result << "CONFIG-=debug_and_release";
+
+    if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (userBuildConfiguration & QtVersion::BuildAll))
+        result << "CONFIG+=debug_and_release";
+    if ((defaultBuildConfiguration & QtVersion::DebugBuild)
+            && !(userBuildConfiguration & QtVersion::DebugBuild)
+            && !(userBuildConfiguration & QtVersion::BuildAll))
+        result << "CONFIG+=release";
+    if (!(defaultBuildConfiguration & QtVersion::DebugBuild)
             && (userBuildConfiguration & QtVersion::DebugBuild)
             && !(userBuildConfiguration & QtVersion::BuildAll))
-            (*addedUserConfigs) << "debug";
-    }
+        result << "CONFIG+=debug";
+    return result;
 }
 
 QMakeStep *Qt4BuildConfiguration::qmakeStep() const
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 2b2ac67fc37..849e0852eee 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -76,6 +76,9 @@ public:
 
     QtVersion::QmakeBuildConfigs qmakeBuildConfiguration() const;
     void setQMakeBuildConfiguration(QtVersion::QmakeBuildConfigs config);
+
+    /// \internal for qmakestep
+    void emitProFileEvaluteNeeded();
     // used by qmake step to notify that the qmake args have changed
     // not really nice, the build configuration should save the arguments
     // since they are needed for reevaluation
@@ -87,7 +90,7 @@ public:
     // not really nice
     void emitS60CreatesSmartInstallerChanged();
 
-    void getConfigCommandLineArguments(QStringList *addedUserConfigs, QStringList *removedUserConfigs) const;
+    QStringList configCommandLineArguments() const;
 
     // Those functions are used in a few places.
     // The drawback is that we shouldn't actually depend on them being always there
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index d6d2f769650..a2f5f951edc 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -35,6 +35,7 @@
 #include "qt4projectmanagerconstants.h"
 #include "qtuicodemodelsupport.h"
 #include "qt4buildconfiguration.h"
+#include "qmakestep.h"
 
 #include <projectexplorer/nodesvisitor.h>
 
@@ -1311,12 +1312,13 @@ void Qt4ProFileNode::setupReader()
     m_readerCumulative = m_project->createProFileReader(this);
 
     // Find out what flags we pass on to qmake
-    QStringList addedUserConfigArguments;
-    QStringList removedUserConfigArguments;
-    m_project->activeTarget()->activeBuildConfiguration()->getConfigCommandLineArguments(&addedUserConfigArguments, &removedUserConfigArguments);
-
-    m_readerExact->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
-    m_readerCumulative->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
+    QStringList args;
+    if (QMakeStep *qs = m_project->activeTarget()->activeBuildConfiguration()->qmakeStep())
+        args = qs->parserArguments();
+    else
+        args = m_project->activeTarget()->activeBuildConfiguration()->configCommandLineArguments();
+    m_readerExact->setCommandLineArguments(args);
+    m_readerCumulative->setCommandLineArguments(args);
 }
 
 bool Qt4ProFileNode::evaluate()
diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index a319edb438d..bed1b6a5866 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -224,8 +224,7 @@ public:
     QHash<const ProFile*, QHash<ProString, ProStringList> > m_filevaluemap; // Variables per include file
     QString m_tmp1, m_tmp2, m_tmp3, m_tmp[2]; // Temporaries for efficient toQString
 
-    QStringList m_addUserConfigCmdArgs;
-    QStringList m_removeUserConfigCmdArgs;
+    QStringList m_cmdArgs;
 
     ProFileOption *m_option;
     ProFileParser *m_parser;
@@ -1274,11 +1273,13 @@ ProFileEvaluator::Private::VisitReturn ProFileEvaluator::Private::visitProFile(
             if (tgt.isEmpty())
                 tgt.append(ProString(QFileInfo(pro->fileName()).baseName(), NoHash));
 
-            ProStringList &tmp = m_valuemapStack.top()[ProString("CONFIG")];
-            foreach (const QString &add, m_addUserConfigCmdArgs)
-                tmp.append(ProString(add, NoHash));
-            foreach (const QString &remove, m_removeUserConfigCmdArgs)
-                removeAll(&tmp, ProString(remove, NoHash));
+            if (ProFile *pro = m_parser->parsedProFile(
+                    fL1S("(command line)"), false, m_cmdArgs.join(fL1S("\n")))) {
+                m_locationStack.push(m_current);
+                visitProBlock(pro, pro->tokPtr());
+                m_current = m_locationStack.pop();
+                pro->deref();
+            }
     }
 
     visitProBlock(pro, pro->tokPtr());
@@ -3217,10 +3218,9 @@ void ProFileEvaluator::setOutputDir(const QString &dir)
     d->m_outputDir = dir;
 }
 
-void ProFileEvaluator::setConfigCommandLineArguments(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs)
+void ProFileEvaluator::setCommandLineArguments(const QStringList &args)
 {
-    d->m_addUserConfigCmdArgs = addUserConfigCmdArgs;
-    d->m_removeUserConfigCmdArgs = removeUserConfigCmdArgs;
+    d->m_cmdArgs = args;
 }
 
 QT_END_NAMESPACE
diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h
index a011780e5b9..0442e2e72a5 100644
--- a/src/shared/proparser/profileevaluator.h
+++ b/src/shared/proparser/profileevaluator.h
@@ -112,7 +112,7 @@ public:
 
     // -nocache, -cache, -spec, QMAKESPEC
     // -set persistent value
-    void setConfigCommandLineArguments(const QStringList &addUserConfigCmdArgs, const QStringList &removeUserConfigCmdArgs);
+    void setCommandLineArguments(const QStringList &args);
 
     enum LoadFlag {
         LoadProOnly = 0,
-- 
GitLab