androiddeployqt: Fix dependency order for XML dependencies
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Mon, 27 Oct 2014 14:54:42 +0000 (15:54 +0100)
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Tue, 28 Oct 2014 14:46:24 +0000 (15:46 +0100)
Although this bug was there in Qt 5.3 as well, something has changed
in our build system that causes readelf to return libraries in a
different order than before. In particular, the QtMultimedia dependency
is now listed before QtQuick if it's listed first in the QT variable in
the .pro file. This caused the following bug:

When we read the manual dependencies from the XML specification,
then we assume the dependencies of these are already met (otherwise
they should not be added). Therefore, we need to load these
dependencies last, not intermingled with the actual direct
dependencies of the application.

What would happen is that Qt5Multimedia came before Qt5Quick, and
triggered adding Qt5MultimediaQuick_p before Qt5Quick. This of course
depends on Qt5Quick so it needs to be added after it (which is why
it is only added if the application itself depends on Qt Quick).

Change-Id: Ifa97d85645cff49ebf65d4ce3fc2101506346695
Task-number: QTBUG-42012
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Reviewed-by: BogDan Vatra <bogdan@kde.org>
src/androiddeployqt/main.cpp

index 3696038..30dc89a 100644 (file)
@@ -1603,6 +1603,7 @@ bool readDependenciesFromElf(Options *options,
             fprintf(stdout, "      %s\n", qPrintable(dep));
     }
     // Recursively add dependencies from ELF and supplementary XML information
+    QList<QString> dependenciesToCheck;
     foreach (QString dependency, dependencies) {
         if (usedDependencies->contains(dependency))
             continue;
@@ -1619,12 +1620,17 @@ bool readDependenciesFromElf(Options *options,
         options->qtDependencies.append(QtDependency(dependency, absoluteDependencyPath));
         if (options->verbose)
             fprintf(stdout, "Appending dependency: %s\n", qPrintable(dependency));
+        dependenciesToCheck.append(dependency);
+    }
+
+    foreach (QString dependency, dependenciesToCheck) {
         QString qtBaseName = dependency.mid(sizeof("lib/lib") - 1);
         qtBaseName = qtBaseName.left(qtBaseName.size() - (sizeof(".so") - 1));
         if (!readAndroidDependencyXml(options, qtBaseName, usedDependencies, remainingDependencies)) {
             return false;
         }
     }
+
     return true;
 }