diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-06-15 11:39:06 +0200 |
---|---|---|
committer | Jani Heikkinen <jani.heikkinen@theqtcompany.com> | 2015-06-15 10:34:01 +0000 |
commit | d7f40baf8866eeb9840608b43bd84e27818824af (patch) | |
tree | ea83455cdb40f68ccc569fd4d3efdc8524764b43 | |
parent | 6c8954b07807e31dbc8967ba6d92d4d022073087 (diff) |
macdeployqt: Fix rpath setting for additional executables
Additional executables can lie anywhere within the app bundle, so we
have to individually calculate the corresponding rpath instead of hard
coding to @loader_path/../Frameworks.
Task-number: QTBUG-46660
Change-Id: If213ad002b38a6690a30e7aeae47e201fdc4800c
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
-rw-r--r-- | src/macdeployqt/shared/shared.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/macdeployqt/shared/shared.cpp b/src/macdeployqt/shared/shared.cpp index 647b09f3a..e2c4a19bc 100644 --- a/src/macdeployqt/shared/shared.cpp +++ b/src/macdeployqt/shared/shared.cpp @@ -739,13 +739,17 @@ void changeInstallName(const QString &bundlePath, const FrameworkInfo &framework } } -void deployRPaths(const QSet<QString> &rpaths, const QString &binaryPath, bool useLoaderPath) +void deployRPaths(const QString &bundlePath, const QSet<QString> &rpaths, const QString &binaryPath, bool useLoaderPath) { + const QString absFrameworksPath = QFileInfo(bundlePath).absoluteFilePath() + + QLatin1String("/Contents/Frameworks"); + const QString relativeFrameworkPath = QFileInfo(binaryPath).absoluteDir().relativeFilePath(absFrameworksPath); + const QString loaderPathToFrameworks = QLatin1String("@loader_path/") + relativeFrameworkPath; bool rpathToFrameworksFound = false; QStringList args; foreach (const QString &rpath, getBinaryRPaths(binaryPath, false)) { if (rpath == "@executable_path/../Frameworks" || - rpath == "@loader_path/../Frameworks") { + rpath == loaderPathToFrameworks) { rpathToFrameworksFound = true; continue; } @@ -760,7 +764,7 @@ void deployRPaths(const QSet<QString> &rpaths, const QString &binaryPath, bool u if (!useLoaderPath) { args << "-add_rpath" << "@executable_path/../Frameworks"; } else { - args << "-add_rpath" << "@loader_path/../Frameworks"; + args << "-add_rpath" << loaderPathToFrameworks; } } LogDebug() << "Using install_name_tool:"; @@ -769,10 +773,10 @@ void deployRPaths(const QSet<QString> &rpaths, const QString &binaryPath, bool u runInstallNameTool(QStringList() << args << binaryPath); } -void deployRPaths(const QSet<QString> &rpaths, const QStringList &binaryPaths, bool useLoaderPath) +void deployRPaths(const QString &bundlePath, const QSet<QString> &rpaths, const QStringList &binaryPaths, bool useLoaderPath) { foreach (const QString &binary, binaryPaths) { - deployRPaths(rpaths, binary, useLoaderPath); + deployRPaths(bundlePath, rpaths, binary, useLoaderPath); } } @@ -874,7 +878,7 @@ DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks, } } deploymentInfo.deployedFrameworks = copiedFrameworks; - deployRPaths(rpathsUsed, binaryPaths, useLoaderPath); + deployRPaths(bundlePath, rpathsUsed, binaryPaths, useLoaderPath); deploymentInfo.rpathsUsed += rpathsUsed; return deploymentInfo; } |