diff options
Diffstat (limited to 'src/tools/macdeployqt')
-rw-r--r-- | src/tools/macdeployqt/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/tools/macdeployqt/macdeployqt/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/tools/macdeployqt/shared/shared.cpp | 43 | ||||
-rw-r--r-- | src/tools/macdeployqt/shared/shared.h | 5 |
4 files changed, 34 insertions, 18 deletions
diff --git a/src/tools/macdeployqt/CMakeLists.txt b/src/tools/macdeployqt/CMakeLists.txt index 3054926cd3..2e01ec90b4 100644 --- a/src/tools/macdeployqt/CMakeLists.txt +++ b/src/tools/macdeployqt/CMakeLists.txt @@ -1,8 +1,6 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -# Generated from macdeployqt.pro. - if(NOT QT_FEATURE_macdeployqt) return() endif() diff --git a/src/tools/macdeployqt/macdeployqt/CMakeLists.txt b/src/tools/macdeployqt/macdeployqt/CMakeLists.txt index 5c50fe7de0..6cd66adaa7 100644 --- a/src/tools/macdeployqt/macdeployqt/CMakeLists.txt +++ b/src/tools/macdeployqt/macdeployqt/CMakeLists.txt @@ -14,6 +14,8 @@ qt_internal_add_tool(${target_name} SOURCES ../shared/shared.cpp main.cpp + DEFINES + QT_NO_FOREACH LIBRARIES ${FWCoreFoundation} ) diff --git a/src/tools/macdeployqt/shared/shared.cpp b/src/tools/macdeployqt/shared/shared.cpp index 5aad17f9e9..6ff269b36d 100644 --- a/src/tools/macdeployqt/shared/shared.cpp +++ b/src/tools/macdeployqt/shared/shared.cpp @@ -152,7 +152,7 @@ OtoolInfo findDependencyInfo(const QString &binaryPath) LogDebug() << " inspecting" << binaryPath; QProcess otool; otool.start("otool", QStringList() << "-L" << binaryPath); - otool.waitForFinished(); + otool.waitForFinished(-1); if (otool.exitStatus() != QProcess::NormalExit || otool.exitCode() != 0) { LogError() << otool.readAllStandardError(); @@ -172,7 +172,7 @@ OtoolInfo findDependencyInfo(const QString &binaryPath) outputLines.removeFirst(); // remove line containing the binary path if (binaryPath.contains(".framework/") || binaryPath.endsWith(".dylib")) { - const auto match = regexp.match(outputLines.first()); + const auto match = regexp.match(outputLines.constFirst()); if (match.hasMatch()) { QString installname = match.captured(1); if (QFileInfo(binaryPath).fileName() == QFileInfo(installname).fileName()) { @@ -184,7 +184,7 @@ OtoolInfo findDependencyInfo(const QString &binaryPath) info.installName = binaryPath; } } else { - LogDebug() << "Could not parse otool output line:" << outputLines.first(); + LogDebug() << "Could not parse otool output line:" << outputLines.constFirst(); outputLines.removeFirst(); } } @@ -435,7 +435,7 @@ QStringList findAppLibraries(const QString &appBundlePath) { QStringList result; // dylibs - QDirIterator iter(appBundlePath, QStringList() << QString::fromLatin1("*.dylib"), + QDirIterator iter(appBundlePath, QStringList() << QString::fromLatin1("*.dylib") << QString::fromLatin1("*.so"), QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories); while (iter.hasNext()) { iter.next(); @@ -598,10 +598,14 @@ QStringList getBinaryDependencies(const QString executablePath, QString binary = QDir::cleanPath(executablePath + trimmedLine.mid(QStringLiteral("@executable_path/").length())); if (binary != path) binaries.append(binary); + } else if (trimmedLine.startsWith("@loader_path/")) { + QString binary = QDir::cleanPath(QFileInfo(path).path() + "/" + trimmedLine.mid(QStringLiteral("@loader_path/").length())); + if (binary != path) + binaries.append(binary); } else if (trimmedLine.startsWith("@rpath/")) { if (!rpathsLoaded) { rpaths = getBinaryRPaths(path, true, executablePath); - foreach (const QString &binaryPath, additionalBinariesContainingRpaths) + for (const QString &binaryPath : additionalBinariesContainingRpaths) rpaths += getBinaryRPaths(binaryPath, true); rpaths.removeDuplicates(); rpathsLoaded = true; @@ -630,15 +634,16 @@ QStringList getBinaryDependencies(const QString executablePath, bool recursiveCopy(const QString &sourcePath, const QString &destinationPath, const QRegularExpression &ignoreRegExp = QRegularExpression()) { - if (!QDir(sourcePath).exists()) + const QDir sourceDir(sourcePath); + if (!sourceDir.exists()) return false; QDir().mkpath(destinationPath); LogNormal() << "copy:" << sourcePath << destinationPath; - QStringList files = QDir(sourcePath).entryList(QStringList() << "*", QDir::Files | QDir::NoDotAndDotDot); + const QStringList files = sourceDir.entryList(QStringList() << "*", QDir::Files | QDir::NoDotAndDotDot); const bool hasValidRegExp = ignoreRegExp.isValid() && ignoreRegExp.pattern().length() > 0; - foreach (QString file, files) { + for (const QString &file : files) { if (hasValidRegExp && ignoreRegExp.match(file).hasMatch()) continue; const QString fileSourcePath = sourcePath + "/" + file; @@ -646,7 +651,7 @@ bool recursiveCopy(const QString &sourcePath, const QString &destinationPath, copyFilePrintStatus(fileSourcePath, fileDestinationPath); } - QStringList subdirs = QDir(sourcePath).entryList(QStringList() << "*", QDir::Dirs | QDir::NoDotAndDotDot); + const QStringList subdirs = sourceDir.entryList(QStringList() << "*", QDir::Dirs | QDir::NoDotAndDotDot); for (const QString &dir : subdirs) { recursiveCopy(sourcePath + "/" + dir, destinationPath + "/" + dir); } @@ -660,7 +665,9 @@ void recursiveCopyAndDeploy(const QString &appBundlePath, const QList<QString> & LogNormal() << "copy:" << sourcePath << destinationPath; const bool isDwarfPath = sourcePath.endsWith("DWARF"); - QStringList files = QDir(sourcePath).entryList(QStringList() << QStringLiteral("*"), QDir::Files | QDir::NoDotAndDotDot); + const QDir sourceDir(sourcePath); + + const QStringList files = sourceDir.entryList(QStringList() << QStringLiteral("*"), QDir::Files | QDir::NoDotAndDotDot); for (const QString &file : files) { const QString fileSourcePath = sourcePath + u'/' + file; @@ -706,7 +713,7 @@ void recursiveCopyAndDeploy(const QString &appBundlePath, const QList<QString> & } } - QStringList subdirs = QDir(sourcePath).entryList(QStringList() << QStringLiteral("*"), QDir::Dirs | QDir::NoDotAndDotDot); + const QStringList subdirs = sourceDir.entryList(QStringList() << QStringLiteral("*"), QDir::Dirs | QDir::NoDotAndDotDot); for (const QString &dir : subdirs) { recursiveCopyAndDeploy(appBundlePath, rpaths, sourcePath + u'/' + dir, destinationPath + u'/' + dir); } @@ -874,7 +881,8 @@ void deployRPaths(const QString &bundlePath, const QList<QString> &rpaths, const continue; } if (rpaths.contains(resolveDyldPrefix(rpath, binaryPath, binaryPath))) { - args << "-delete_rpath" << rpath; + if (!args.contains(rpath)) + args << "-delete_rpath" << rpath; } } if (!args.length()) { @@ -936,12 +944,15 @@ bool DeploymentInfo::containsModule(const QString &module, const QString &libInF if (deployedFrameworks.contains("Qt"_L1 + module + libInFix + ".framework"_L1)) return true; // Check for dylib - const QRegularExpression dylibRegExp("libQt[0-9]+"_L1 + module + libInFix + ".[0-9]+.dylib"_L1); + const QRegularExpression dylibRegExp("libQt[0-9]+"_L1 + + module + libInFix + + (isDebug ? "_debug" : "") + + ".[0-9]+.dylib"_L1); return deployedFrameworks.filter(dylibRegExp).size() > 0; } /* - Deploys the the listed frameworks listed into an app bundle. + Deploys the listed frameworks into an app bundle. The frameworks are searched for dependencies, which are also deployed. (deploying Qt3Support will also deploy QtNetwork and QtSql for example.) Returns a DeploymentInfo structure containing the Qt path used and a @@ -1106,8 +1117,10 @@ void deployPlugins(const ApplicationBundleInfo &appBundleInfo, const QString &pl const QString libInfix = getLibInfix(deploymentInfo.deployedFrameworks); // Network - if (deploymentInfo.containsModule("Network", libInfix)) + if (deploymentInfo.containsModule("Network", libInfix)) { addPlugins(QStringLiteral("tls")); + addPlugins(QStringLiteral("networkinformation")); + } // All image formats (svg if QtSvg is used) const bool usesSvg = deploymentInfo.containsModule("Svg", libInfix); diff --git a/src/tools/macdeployqt/shared/shared.h b/src/tools/macdeployqt/shared/shared.h index 66c935539c..33384e868a 100644 --- a/src/tools/macdeployqt/shared/shared.h +++ b/src/tools/macdeployqt/shared/shared.h @@ -37,7 +37,10 @@ public: bool isDebugLibrary() const { - return binaryName.endsWith(QStringLiteral("_debug")); + if (isDylib) + return binaryName.contains(QStringLiteral("_debug.")); + else + return binaryName.endsWith(QStringLiteral("_debug")); } }; |