From ea673893dbfe3c4b9ea17839786105cc80980fb8 Mon Sep 17 00:00:00 2001 From: probonopd Date: Thu, 6 Apr 2017 22:12:08 +0200 Subject: [PATCH] Stop on ldd not found errors; use qmake-qt5 if needed Closes #101 --- shared/shared.cpp | 92 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 24 deletions(-) diff --git a/shared/shared.cpp b/shared/shared.cpp index e1d6480..c4e1e8f 100644 --- a/shared/shared.cpp +++ b/shared/shared.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include "shared.h" QString appBinaryPath; @@ -181,7 +182,9 @@ LddInfo findDependencyInfo(const QString &binaryPath) foreach (QString outputLine, outputLines) { // LogDebug() << "ldd outputLine:" << outputLine; if (outputLine.contains("not found")){ - LogError() << "ldd outputLine:" << outputLine; + LogError() << "ldd outputLine:" << outputLine.replace("\t", ""); + LogError() << "Please ensure that all libraries can be found by ldd. Aborting."; + exit(1); } } @@ -885,33 +888,74 @@ DeploymentInfo deployQtLibraries(const QString &appDirPath, const QStringList &a applicationBundle.binaryPath = appBinaryPath; LogDebug() << "applicationBundle.binaryPath:" << applicationBundle.binaryPath; - // Determine the location of the Qt to be bundled - LogDebug() << "Using qmake to determine the location of the Qt to be bundled"; - QString output = captureOutput("qmake -query"); - QStringList outputLines = output.split("\n", QString::SkipEmptyParts); - foreach (const QString &outputLine, outputLines) { - int colonIndex = outputLine.indexOf(QLatin1Char(':')); - if (colonIndex != -1) { - QString name = outputLine.left(colonIndex); - QString value = outputLine.mid(colonIndex + 1); - qtToBeBundledInfo.insert(name, value); + // Find out whether Qt is a dependency of the application to be bundled + int qtDetected = 0; + LddInfo lddInfo = findDependencyInfo(appBinaryPath); + foreach (const DylibInfo dep, lddInfo.dependencies) { + LogDebug() << "dep.binaryPath" << dep.binaryPath; + if(dep.binaryPath.contains("libQt5")){ + qtDetected = 5; + } + if(dep.binaryPath.contains("libQtCore.so.4")){ + qtDetected = 4; } } - QString qtLibsPath = qtToBeBundledInfo.value("QT_INSTALL_LIBS"); + if(qtDetected != 0){ - if (qtLibsPath.isEmpty() || !QFile::exists(qtLibsPath)) { - LogError() << "Qt path could not be determined from qmake on the $PATH"; - LogError() << "Make sure you have the correct Qt on your $PATH"; - LogError() << "You can check this with qmake -v"; - } else { - LogDebug() << "Qt libs path determined from qmake:" << qtLibsPath; - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - QString oldPath = env.value("LD_LIBRARY_PATH"); - QString newPath = qtLibsPath + ":" + oldPath; // FIXME: If we use a ldd replacement, we still need to observe this path - // FIXME: Directory layout might be different for system Qt; cannot assume lib/ to always be inside the Qt directory - LogDebug() << "Changed LD_LIBRARY_PATH:" << newPath; - setenv("LD_LIBRARY_PATH",newPath.toUtf8().constData(),1); + // Determine the location of the Qt to be bundled + LogDebug() << "Using qmake to determine the location of the Qt to be bundled"; + + QString qmakePath = ""; + + // The upstream name of the binary is "qmake", for Qt 4 and Qt 5 + qmakePath = QStandardPaths::findExecutable("qmake"); + + // But openSUSE has qmake for Qt 4 and qmake-qt5 for Qt 5 + // Qt 4 on Fedora comes with suffix -qt4 + // http://www.geopsy.org/wiki/index.php/Installing_Qt_binary_packages + if(qmakePath == ""){ + if(qtDetected == 5){ + qmakePath = QStandardPaths::findExecutable("qmake-qt5"); + } + if(qtDetected == 4){ + qmakePath = QStandardPaths::findExecutable("qmake-qt4"); + } + } + + if(qmakePath == ""){ + LogError() << "qmake not found on the $PATH"; + exit(1); + } + + QString output = captureOutput(qmakePath + " -query"); + + QStringList outputLines = output.split("\n", QString::SkipEmptyParts); + foreach (const QString &outputLine, outputLines) { + int colonIndex = outputLine.indexOf(QLatin1Char(':')); + if (colonIndex != -1) { + QString name = outputLine.left(colonIndex); + QString value = outputLine.mid(colonIndex + 1); + qtToBeBundledInfo.insert(name, value); + } + } + + QString qtLibsPath = qtToBeBundledInfo.value("QT_INSTALL_LIBS"); + + if (qtLibsPath.isEmpty() || !QFile::exists(qtLibsPath)) { + LogError() << "Qt path could not be determined from qmake on the $PATH"; + LogError() << "Make sure you have the correct Qt on your $PATH"; + LogError() << "You can check this with qmake -v"; + exit(1); + } else { + LogDebug() << "Qt libs path determined from qmake:" << qtLibsPath; + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + QString oldPath = env.value("LD_LIBRARY_PATH"); + QString newPath = qtLibsPath + ":" + oldPath; // FIXME: If we use a ldd replacement, we still need to observe this path + // FIXME: Directory layout might be different for system Qt; cannot assume lib/ to always be inside the Qt directory + LogDebug() << "Changed LD_LIBRARY_PATH:" << newPath; + setenv("LD_LIBRARY_PATH",newPath.toUtf8().constData(),1); + } } if(fhsLikeMode == false){