From f86c9b65726e879652561e6db04e6688bc48f48c Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Mon, 18 Apr 2011 14:13:18 +0200
Subject: [PATCH] QmlDump: Ensure that qmldump is found in QtSDK

We ship a precompiled qmldump in the Qt SDK because the Qt versions
don't have private headers. However, the logic in buildablehelperlibrary
by default rejects any build that is older than the latest changes to the
qmldump source code files; allow Qt Creator to pick up the (maybe
outdated) qmldump nevertheless if no private headers are installed.

Reviewed-by: ckamm
Task-number: QTCREATORBUG-4578
---
 src/libs/utils/buildablehelperlibrary.cpp     | 19 ++++++++++-------
 src/libs/utils/buildablehelperlibrary.h       |  3 ++-
 .../projectexplorer/debugginghelper.cpp       |  2 +-
 .../qt4projectmanager/qmldebugginglibrary.cpp |  2 +-
 src/plugins/qt4projectmanager/qmldumptool.cpp | 21 ++++++++++++-------
 src/plugins/qt4projectmanager/qmldumptool.h   |  3 ++-
 .../qt4projectmanager/qmlobservertool.cpp     |  2 +-
 .../qt4projectmanager/qtversionmanager.cpp    |  8 +++++--
 8 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp
index 672e83afc64..24e8f5e90b6 100644
--- a/src/libs/utils/buildablehelperlibrary.cpp
+++ b/src/libs/utils/buildablehelperlibrary.cpp
@@ -297,20 +297,24 @@ bool BuildableHelperLibrary::getHelperFileInfoFor(const QStringList &validBinary
 QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath,
                                                     const QStringList &sourceFileNames,
                                                     const QStringList &installDirectories,
-                                                    const QStringList &validBinaryFilenames)
+                                                    const QStringList &validBinaryFilenames,
+                                                    bool acceptOutdatedHelper)
 {
     // find the latest change to the sources
     QDateTime sourcesModified;
-    foreach (const QString &sourceFileName, sourceFileNames) {
-        const QDateTime fileModified = QFileInfo(sourcePath + sourceFileName).lastModified();
-        if (fileModified.isValid() && (!sourcesModified.isValid() || fileModified > sourcesModified))
-            sourcesModified = fileModified;
+    if (!acceptOutdatedHelper) {
+        foreach (const QString &sourceFileName, sourceFileNames) {
+            const QDateTime fileModified = QFileInfo(sourcePath + sourceFileName).lastModified();
+            if (fileModified.isValid() && (!sourcesModified.isValid() || fileModified > sourcesModified))
+                sourcesModified = fileModified;
+        }
     }
 
     // We pretend that the lastmodified of gdbmacros.cpp is 5 minutes before what the file system says
     // Because afer a installation from the package the modified dates of gdbmacros.cpp
     // and the actual library are close to each other, but not deterministic in one direction
-    sourcesModified = sourcesModified.addSecs(-300);
+    if (sourcesModified.isValid())
+        sourcesModified = sourcesModified.addSecs(-300);
 
     // look for the newest helper library in the different locations
     QString newestHelper;
@@ -318,7 +322,8 @@ QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath,
     QFileInfo fileInfo;
     foreach(const QString &installDirectory, installDirectories) {
         if (getHelperFileInfoFor(validBinaryFilenames, installDirectory, &fileInfo)) {
-            if (fileInfo.lastModified() > newestHelperModified) {
+            if (!newestHelperModified.isValid()
+                    || (fileInfo.lastModified() > newestHelperModified)) {
                 newestHelper = fileInfo.filePath();
                 newestHelperModified = fileInfo.lastModified();
             }
diff --git a/src/libs/utils/buildablehelperlibrary.h b/src/libs/utils/buildablehelperlibrary.h
index 13626da8ec7..ea4eefdcce9 100644
--- a/src/libs/utils/buildablehelperlibrary.h
+++ b/src/libs/utils/buildablehelperlibrary.h
@@ -61,7 +61,8 @@ public:
     static QString byInstallDataHelper(const QString &sourcePath,
                                        const QStringList &sourceFileNames,
                                        const QStringList &installDirectories,
-                                       const QStringList &validBinaryFilenames);
+                                       const QStringList &validBinaryFilenames,
+                                       bool acceptOutdatedHelper);
 
     static bool copyFiles(const QString &sourcePath, const QStringList &files,
                           const QString &targetDirectory, QString *errorMessage);
diff --git a/src/plugins/projectexplorer/debugginghelper.cpp b/src/plugins/projectexplorer/debugginghelper.cpp
index 2fd06bc58bc..57cf1add651 100644
--- a/src/plugins/projectexplorer/debugginghelper.cpp
+++ b/src/plugins/projectexplorer/debugginghelper.cpp
@@ -101,7 +101,7 @@ QString DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(const QStrin
     const QStringList directories = DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData);
     const QStringList binFilenames = validBinaryFilenames();
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
 }
 
 QString DebuggingHelperLibrary::copy(const QString &qtInstallData,
diff --git a/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp b/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
index f7d33b6ecf8..379275c73b5 100644
--- a/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
+++ b/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
@@ -62,7 +62,7 @@ QString QmlDebuggingLibrary::libraryByInstallData(const QString &qtInstallData,
     }
     binFilenames << QLatin1String("libQmlJSDebugger.a");
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
 }
 
 bool QmlDebuggingLibrary::canBuild(const QtVersion *qtVersion)
diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp
index 27b8450ee95..84dc13a48ab 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.cpp
+++ b/src/plugins/qt4projectmanager/qmldumptool.cpp
@@ -175,14 +175,20 @@ static inline QStringList validBinaryFilenames(bool debugBuild)
     return list;
 }
 
+static bool hasPrivateHeaders(const QString &qtInstallHeaders) {
+    const QString header = qtInstallHeaders
+            + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
+    return QFile::exists(header);
+}
+
 bool QmlDumpTool::canBuild(const QtVersion *qtVersion)
 {
     const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS");
-    const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
+
     return (qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID)
             || (qtVersion->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID)
                 && (qtVersion->qtVersion() > QtVersionNumber(4, 7, 1))))
-            && QFile::exists(header);
+            && hasPrivateHeaders(installHeaders);
 }
 
 static QtVersion *qtVersionForProject(ProjectExplorer::Project *project)
@@ -234,7 +240,8 @@ QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project, bool debu
     QtVersion *version = qtVersionForProject(project);
     if (version) {
         QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA");
-        QString toolPath = toolByInstallData(qtInstallData, debugDump);
+        QString qtInstallHeaders = version->versionInfo().value("QT_INSTALL_HEADERS");
+        QString toolPath = toolByInstallData(qtInstallData, qtInstallHeaders, debugDump);
         return toolPath;
     }
 
@@ -258,17 +265,17 @@ static QStringList sourceFileNames()
     return files;
 }
 
-QString QmlDumpTool::toolByInstallData(const QString &qtInstallData, bool debugDump)
+QString QmlDumpTool::toolByInstallData(const QString &qtInstallData, const QString &qtInstallHeaders,
+                                       bool debugDump)
 {
     if (!Core::ICore::instance())
         return QString();
 
-    const QString mainFilename = Core::ICore::instance()->resourcePath()
-            + QLatin1String("/qml/qmldump/main.cpp");
     const QStringList directories = installDirectories(qtInstallData);
     const QStringList binFilenames = validBinaryFilenames(debugDump);
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames,
+                               !hasPrivateHeaders(qtInstallHeaders));
 }
 
 QStringList QmlDumpTool::locationsByInstallData(const QString &qtInstallData, bool debugDump)
diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h
index eca3a7a5f56..c60c2bc4f99 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.h
+++ b/src/plugins/qt4projectmanager/qmldumptool.h
@@ -53,7 +53,8 @@ class QT4PROJECTMANAGER_EXPORT QmlDumpTool : public Utils::BuildableHelperLibrar
 public:
     static bool canBuild(const QtVersion *qtVersion);
     static QString toolForProject(ProjectExplorer::Project *project, bool debugDump);
-    static QString toolByInstallData(const QString &qtInstallData, bool debugDump);
+    static QString toolByInstallData(const QString &qtInstallData, const QString &qtInstallHeaders,
+                                     bool debugDump);
     static QStringList locationsByInstallData(const QString &qtInstallData, bool debugDump);
 
     // Build the helpers and return the output log/errormessage.
diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp
index d9db94f41a2..42295a4a559 100644
--- a/src/plugins/qt4projectmanager/qmlobservertool.cpp
+++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp
@@ -86,7 +86,7 @@ QString QmlObserverTool::toolByInstallData(const QString &qtInstallData)
     const QStringList directories = installDirectories(qtInstallData);
     const QStringList binFilenames = validBinaryFilenames();
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
 }
 
 QStringList QmlObserverTool::locationsByInstallData(const QString &qtInstallData)
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 8c5c1345fe9..6bfb61d952f 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -1271,11 +1271,14 @@ void QtVersion::updateVersionInfo() const
 
     if (m_versionInfo.contains("QT_INSTALL_DATA")) {
         QString qtInstallData = m_versionInfo.value("QT_INSTALL_DATA");
+        QString qtHeaderData = m_versionInfo.value("QT_INSTALL_HEADERS");
         m_versionInfo.insert("QMAKE_MKSPECS", QDir::cleanPath(qtInstallData+"/mkspecs"));
 
         if (!qtInstallData.isEmpty()) {
             m_hasDebuggingHelper = !DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(qtInstallData).isEmpty();
-            m_hasQmlDump = !QmlDumpTool::toolByInstallData(qtInstallData, false).isEmpty() || !QmlDumpTool::toolByInstallData(qtInstallData, true).isEmpty();
+            m_hasQmlDump
+                    = !QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, false).isEmpty()
+                    || !QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, true).isEmpty();
             m_hasQmlDebuggingLibrary
                     = !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, false).isEmpty()
                 || !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, true).isEmpty();
@@ -1975,9 +1978,10 @@ QString QtVersion::gdbDebuggingHelperLibrary() const
 QString QtVersion::qmlDumpTool(bool debugVersion) const
 {
     QString qtInstallData = versionInfo().value("QT_INSTALL_DATA");
+    QString qtHeaderData = versionInfo().value("QT_INSTALL_HEADERS");
     if (qtInstallData.isEmpty())
         return QString();
-    return QmlDumpTool::toolByInstallData(qtInstallData, debugVersion);
+    return QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, debugVersion);
 }
 
 QString QtVersion::qmlDebuggingHelperLibrary(bool debugVersion) const
-- 
GitLab