diff --git a/tools/linuxdeployqt/main.cpp b/tools/linuxdeployqt/main.cpp index 0d535e5..1ed71c6 100644 --- a/tools/linuxdeployqt/main.cpp +++ b/tools/linuxdeployqt/main.cpp @@ -82,6 +82,8 @@ int main(int argc, char **argv) qInfo() << " -no-copy-copyright-files : Skip deployment of copyright files."; qInfo() << " -extra-plugins= : List of extra plugins which should be deployed,"; qInfo() << " separated by comma."; + qInfo() << " -exclude-libs= : List of libraries which should be excluded,"; + qInfo() << " separated by comma."; qInfo() << " -version : Print version statement and exit."; qInfo() << ""; qInfo() << "linuxdeployqt takes an application as input and makes it"; @@ -207,6 +209,7 @@ int main(int argc, char **argv) QStringList qmlDirs; QString qmakeExecutable; extern QStringList extraQtPlugins; + extern QStringList excludeLibs; extern bool copyCopyrightFiles; /* FHS-like mode is for an application that has been installed to a $PREFIX which is otherwise empty, e.g., /path/to/usr. @@ -416,6 +419,10 @@ int main(int argc, char **argv) LogDebug() << "Argument found:" << argument; int index = argument.indexOf("="); extraQtPlugins = QString(argument.mid(index + 1)).split(","); + } else if (argument.startsWith("-exclude-libs=")) { + LogDebug() << "Argument found:" << argument; + int index = argument.indexOf("="); + excludeLibs = QString(argument.mid(index + 1)).split(","); } else if (argument.startsWith("--")) { LogError() << "Error: arguments must not start with --, only -:" << argument << "\n"; return 1; @@ -432,6 +439,11 @@ int main(int argc, char **argv) } } + if (!excludeLibs.isEmpty()) + { + qWarning() << "WARNING: Excluding the following libraries might break the AppImage. Please double-check the list:" << excludeLibs; + } + DeploymentInfo deploymentInfo = deployQtLibraries(appDirPath, additionalExecutables, qmakeExecutable); diff --git a/tools/linuxdeployqt/shared.cpp b/tools/linuxdeployqt/shared.cpp index a358927..1c68b47 100644 --- a/tools/linuxdeployqt/shared.cpp +++ b/tools/linuxdeployqt/shared.cpp @@ -58,6 +58,7 @@ int qtDetected = 0; bool qtDetectionComplete = 0; // As long as Qt is not detected yet, ldd may encounter "not found" messages, continue anyway bool deployLibrary = false; QStringList extraQtPlugins; +QStringList excludeLibs; bool copyCopyrightFiles = true; using std::cout; @@ -478,6 +479,7 @@ LibraryInfo parseLddLibraryLine(const QString &line, const QString &appDirPath, #else excludelist << EXCLUDELIST; #endif + excludelist += excludeLibs; LogDebug() << "excludelist:" << excludelist; if (! trimmed.contains("libicu")) { @@ -671,10 +673,13 @@ QList getQtLibrariesForPaths(const QStringList &paths, const QStrin QSet existing; foreach (const QString &path, paths) { - foreach (const LibraryInfo &info, getQtLibraries(path, appDirPath, rpaths)) { - if (!existing.contains(info.libraryPath)) { // avoid duplicates - existing.insert(info.libraryPath); - result << info; + if (!excludeLibs.contains(QFileInfo(path).baseName())) + { + foreach (const LibraryInfo &info, getQtLibraries(path, appDirPath, rpaths)) { + if (!existing.contains(info.libraryPath)) { // avoid duplicates + existing.insert(info.libraryPath); + result << info; + } } } } @@ -1022,7 +1027,7 @@ DeploymentInfo deployQtLibraries(QList libraries, deploymentInfo.qtPath = library.libraryDirectory; } - if(library.libraryName.contains("libQt") and library.libraryName.contains("Widgets.so")) { + if(library.libraryName.contains("libQt") and library.libraryName.contains("Widgets.so")) { deploymentInfo.requiresQtWidgetsLibrary = true; } @@ -1399,23 +1404,26 @@ void deployPlugins(const AppDirInfo &appDirInfo, const QString &pluginSourcePath foreach (const QString &plugin, pluginList) { sourcePath = pluginSourcePath + "/" + plugin; destinationPath = pluginDestinationPath + "/" + plugin; - QDir dir; - dir.mkpath(QFileInfo(destinationPath).path()); - QList libraries = getQtLibraries(sourcePath, appDirInfo.path, deploymentInfo.rpathsUsed); - LogDebug() << "Deploying plugin" << sourcePath; - if (copyFilePrintStatus(sourcePath, destinationPath)) { - runStrip(destinationPath); - deployQtLibraries(libraries, appDirInfo.path, QStringList() << destinationPath, deploymentInfo.useLoaderPath); - /* See whether this makes any difference */ - // Find out the relative path to the lib/ directory and set it as the rpath - QDir dir(destinationPath); - QString relativePath = dir.relativeFilePath(appDirInfo.path + "/" + libraries[0].libraryDestinationDirectory); - relativePath.remove(0, 3); // remove initial '../' - changeIdentification("$ORIGIN/" + relativePath, QFileInfo(destinationPath).canonicalFilePath()); + if(!excludeLibs.contains(QFileInfo(sourcePath).baseName())) + { + QDir dir; + dir.mkpath(QFileInfo(destinationPath).path()); + QList libraries = getQtLibraries(sourcePath, appDirInfo.path, deploymentInfo.rpathsUsed); + LogDebug() << "Deploying plugin" << sourcePath; + if (copyFilePrintStatus(sourcePath, destinationPath)) { + runStrip(destinationPath); + deployQtLibraries(libraries, appDirInfo.path, QStringList() << destinationPath, deploymentInfo.useLoaderPath); + /* See whether this makes any difference */ + // Find out the relative path to the lib/ directory and set it as the rpath + QDir dir(destinationPath); + QString relativePath = dir.relativeFilePath(appDirInfo.path + "/" + libraries[0].libraryDestinationDirectory); + relativePath.remove(0, 3); // remove initial '../' + changeIdentification("$ORIGIN/" + relativePath, QFileInfo(destinationPath).canonicalFilePath()); + } + LogDebug() << "copyCopyrightFile:" << sourcePath; + copyCopyrightFile(sourcePath); } - LogDebug() << "copyCopyrightFile:" << sourcePath; - copyCopyrightFile(sourcePath); } } diff --git a/tools/linuxdeployqt/shared.h b/tools/linuxdeployqt/shared.h index 3317521..5c07bcb 100644 --- a/tools/linuxdeployqt/shared.h +++ b/tools/linuxdeployqt/shared.h @@ -46,6 +46,7 @@ extern bool bundleAllButCoreLibs; extern bool fhsLikeMode; extern QString fhsPrefix; extern QStringList extraQtPlugins; +extern QStringList excludeLibs; class LibraryInfo {