OSDN Git Service

Qt project file parsing: Take target options into account.
authorChristian Kandeler <christian.kandeler@nokia.com>
Wed, 17 Nov 2010 16:22:11 +0000 (17:22 +0100)
committerChristian Kandeler <christian.kandeler@nokia.com>
Wed, 17 Nov 2010 16:36:05 +0000 (17:36 +0100)
Reviewed-by: Oswald Buddenhagen
Reviewed-by: kh1
Reviewed-by: dt
src/plugins/qt4projectmanager/qmakestep.cpp
src/shared/proparser/profileevaluator.cpp
src/shared/proparser/profileevaluator.h

index d67e3bd..dfc101c 100644 (file)
@@ -30,6 +30,7 @@
 #include "qmakestep.h"
 
 #include "projectexplorer/projectexplorerconstants.h"
+#include <proparser/profileevaluator.h>
 #include "qmakeparser.h"
 #include "qt4buildconfiguration.h"
 #include "qt4project.h"
@@ -309,9 +310,19 @@ void QMakeStep::setUserArguments(const QString &arguments)
 QStringList QMakeStep::parserArguments()
 {
     QStringList result;
-    for (Utils::QtcProcess::ConstArgIterator ait(allArguments()); ait.next(); )
-        if (ait.value().contains(QLatin1Char('=')))
-            result << ait.value();
+    for (Utils::QtcProcess::ConstArgIterator ait(allArguments()); ait.next(); ) {
+        const QString &arg = ait.value();
+        if (arg.contains(QLatin1Char('='))) {
+            result << arg;
+        } else {
+            for (int i = 0; i < ProFileOption::modeMapSize; ++i) {
+                if (QLatin1String(ProFileOption::modeMap[i].qmakeOption) == arg) {
+                    result << arg;
+                    break;
+                }
+            }
+        }
+    }
     return result;
 }
 
index e4371a1..3b22a0a 100644 (file)
@@ -90,6 +90,18 @@ ProFileOption::ProFileOption()
 #endif
     qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").data());
 
+    setHostTargetMode();
+#ifdef PROEVALUATOR_THREAD_SAFE
+    base_inProgress = false;
+#endif
+}
+
+ProFileOption::~ProFileOption()
+{
+}
+
+void ProFileOption::setHostTargetMode()
+{
 #if defined(Q_OS_WIN32)
     target_mode = TARG_WIN_MODE;
 #elif defined(Q_OS_MAC)
@@ -99,15 +111,15 @@ ProFileOption::ProFileOption()
 #else
     target_mode = TARG_UNIX_MODE;
 #endif
-
-#ifdef PROEVALUATOR_THREAD_SAFE
-    base_inProgress = false;
-#endif
 }
 
-ProFileOption::~ProFileOption()
-{
-}
+const struct ProFileOption::TargetModeMapElement ProFileOption::modeMap[] = {
+    { "-unix", TARG_UNIX_MODE },
+    { "-macx", TARG_MACX_MODE },
+    { "-win32", TARG_WIN_MODE }
+};
+const int ProFileOption::modeMapSize
+    = sizeof ProFileOption::modeMap / sizeof ProFileOption::modeMap[0];
 
 ///////////////////////////////////////////////////////////////////////
 //
@@ -3224,6 +3236,19 @@ void ProFileEvaluator::setOutputDir(const QString &dir)
 void ProFileEvaluator::setCommandLineArguments(const QStringList &args)
 {
     d->m_cmdArgs = args;
+
+    d->m_option->setHostTargetMode();
+    bool targetModeSet = false;
+    for (int i = args.count() - 1; !targetModeSet && i >= 0; --i) {
+        for (int j = 0; j < ProFileOption::modeMapSize; ++j) {
+            const ProFileOption::TargetModeMapElement &mapElem = ProFileOption::modeMap[j];
+            if (args.at(i) == QLatin1String(mapElem.qmakeOption)) {
+                d->m_option->target_mode = mapElem.targetMode;
+                targetModeSet = true;
+                break;
+            }
+        }
+    }
 }
 
 QT_END_NAMESPACE
index 0442e2e..d02928d 100644 (file)
@@ -175,7 +175,15 @@ struct ProFileOption
     //QString pro_ext;
     //QString res_ext;
 
+    static const struct TargetModeMapElement {
+        const char * const qmakeOption;
+        const TARG_MODE targetMode;
+    } modeMap[];
+    static const int modeMapSize;
+
   private:
+    void setHostTargetMode();
+
     friend class ProFileEvaluator;
     friend class ProFileEvaluator::Private;
     QHash<ProString, ProStringList> base_valuemap; // Cached results of qmake.conf, .qmake.cache & default_pre.prf