From 88a36fe34c49ebcaddb701ae890014276ac4bb8f Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Wed, 29 Sep 2010 16:40:13 +0200
Subject: [PATCH] DebuggingHelpers: Check for Qt version instead checking
 private files

The location private includes might still change with 4.7.1 . Better
check the qt version string.

Reviewed-by: Lasse Holmstedt
---
 src/libs/utils/buildablehelperlibrary.cpp     | 27 +++++++++++++++++++
 src/libs/utils/buildablehelperlibrary.h       |  1 +
 src/plugins/qt4projectmanager/qmldumptool.cpp |  5 ++--
 src/plugins/qt4projectmanager/qmldumptool.h   |  3 ++-
 .../qt4projectmanager/qmlobservertool.cpp     |  6 ++---
 .../qt4projectmanager/qmlobservertool.h       |  4 ++-
 .../qt4projectmanager/qtversionmanager.cpp    |  4 +--
 7 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp
index c23853d2272..e9fcdbce71d 100644
--- a/src/libs/utils/buildablehelperlibrary.cpp
+++ b/src/libs/utils/buildablehelperlibrary.cpp
@@ -101,6 +101,33 @@ QString BuildableHelperLibrary::qtVersionForQMake(const QString &qmakePath)
     return QString();
 }
 
+bool BuildableHelperLibrary::checkMinimumQtVersion(const QString &qtVersionString, int majorVersion, int minorVersion, int patchVersion)
+{
+    int major = -1;
+    int minor = -1;
+    int patch = -1;
+
+    // check format
+    QRegExp qtVersionRegex(QLatin1String("^\\d+\\.\\d+\\.\\d+$"));
+    if (!qtVersionRegex.exactMatch(qtVersionString))
+        return false;
+
+    QStringList parts = qtVersionString.split(QLatin1Char('.'));
+    major = parts.at(0).toInt();
+    minor = parts.at(1).toInt();
+    patch = parts.at(2).toInt();
+
+    if (major == majorVersion) {
+        if (minor == minorVersion) {
+            if (patch >= patchVersion)
+                return true;
+        } else if (minor > minorVersion)
+            return true;
+    }
+
+    return false;
+}
+
 QStringList BuildableHelperLibrary::possibleQMakeCommands()
 {
     // On windows no one has renamed qmake, right?
diff --git a/src/libs/utils/buildablehelperlibrary.h b/src/libs/utils/buildablehelperlibrary.h
index e4d9eadbc68..fa8a85648c6 100644
--- a/src/libs/utils/buildablehelperlibrary.h
+++ b/src/libs/utils/buildablehelperlibrary.h
@@ -19,6 +19,7 @@ public:
     static QString findSystemQt(const Utils::Environment &env);
     // return true if the qmake at qmakePath is qt4 (used by QtVersion)
     static QString qtVersionForQMake(const QString &qmakePath);
+    static bool checkMinimumQtVersion(const QString &qtversionString, int majorVersion, int minorVersion, int patchVersion);
     // returns something like qmake4, qmake, qmake-qt4 or whatever distributions have chosen (used by QtVersion)
     static QStringList possibleQMakeCommands();
 
diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp
index 210c0182fda..5d11f0dec9b 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.cpp
+++ b/src/plugins/qt4projectmanager/qmldumptool.cpp
@@ -50,10 +50,9 @@ static inline QStringList validBinaryFilenames()
             << QLatin1String("qmldump.app/Contents/MacOS/qmldump");
 }
 
-bool QmlDumpTool::canBuild(const QString &installHeadersDir)
+bool QmlDumpTool::canBuild(QtVersion *qtVersion)
 {
-    QString qDeclHeader = installHeadersDir + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
-    return QFile::exists(qDeclHeader);
+    return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 0);
 }
 
 QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project)
diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h
index 4c54838b6f1..dc991478077 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.h
+++ b/src/plugins/qt4projectmanager/qmldumptool.h
@@ -42,11 +42,12 @@ namespace ProjectExplorer {
 }
 
 namespace Qt4ProjectManager {
+class QtVersion;
 
 class QT4PROJECTMANAGER_EXPORT QmlDumpTool : public Utils::BuildableHelperLibrary
 {
 public:
-    static bool canBuild(const QString &installHeadersDir);
+    static bool canBuild(QtVersion *qtVersion);
     static QString toolForProject(ProjectExplorer::Project *project);
     static QString toolByInstallData(const QString &qtInstallData);
     static QStringList locationsByInstallData(const QString &qtInstallData);
diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp
index 3a64da2ed7a..7b556f2a313 100644
--- a/src/plugins/qt4projectmanager/qmlobservertool.cpp
+++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp
@@ -32,6 +32,7 @@
 #include "qt4project.h"
 #include "qt4projectmanagerconstants.h"
 #include <coreplugin/icore.h>
+#include <utils/qtcassert.h>
 
 #include <projectexplorer/project.h>
 #include <QDesktopServices>
@@ -50,10 +51,9 @@ static inline QStringList validBinaryFilenames()
             << QLatin1String("QMLObserver.app/Contents/MacOS/QMLObserver");
 }
 
-bool QmlObserverTool::canBuild(const QString &installHeadersDir)
+bool QmlObserverTool::canBuild(QtVersion *qtVersion)
 {
-    QString qDeclHeader = installHeadersDir + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
-    return QFile::exists(qDeclHeader);
+    return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1);
 }
 
 QString QmlObserverTool::toolForProject(ProjectExplorer::Project *project)
diff --git a/src/plugins/qt4projectmanager/qmlobservertool.h b/src/plugins/qt4projectmanager/qmlobservertool.h
index 625e625c760..89cbca67460 100644
--- a/src/plugins/qt4projectmanager/qmlobservertool.h
+++ b/src/plugins/qt4projectmanager/qmlobservertool.h
@@ -43,10 +43,12 @@ namespace ProjectExplorer {
 
 namespace Qt4ProjectManager {
 
+class QtVersion;
+
 class QT4PROJECTMANAGER_EXPORT QmlObserverTool : public Utils::BuildableHelperLibrary
 {
 public:
-    static bool canBuild(const QString &installHeadersDir);
+    static bool canBuild(QtVersion *qtVersion);
     static QString toolForProject(ProjectExplorer::Project *project);
     static QString toolByInstallData(const QString &qtInstallData);
     static QStringList locationsByInstallData(const QString &qtInstallData);
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index b6edfbfb149..283f52ba44e 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -1770,7 +1770,7 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface<void> &future)
     }
     future.setProgressValue(2);
 
-    if (QmlDumpTool::canBuild(qtInstallHeaders)) {
+    if (QmlDumpTool::canBuild(this)) {
         QString toolDirectory = QmlDumpTool::copy(qtInstallData, &output);
         if (!toolDirectory.isEmpty()) {
             output += QmlDumpTool::build(toolDirectory, tc->makeCommand(),
@@ -1782,7 +1782,7 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface<void> &future)
     }
     future.setProgressValue(3);
 
-    if (QmlObserverTool::canBuild(qtInstallHeaders)) {
+    if (QmlObserverTool::canBuild(this)) {
         QString toolDirectory = QmlObserverTool::copy(qtInstallData, &output);
         if (!toolDirectory.isEmpty()) {
             output += QmlObserverTool::build(toolDirectory, tc->makeCommand(),
-- 
GitLab