macdeployqt: Fix rpath setting for additional executables
authorEike Ziller <eike.ziller@theqtcompany.com>
Mon, 15 Jun 2015 09:39:06 +0000 (11:39 +0200)
committerJani Heikkinen <jani.heikkinen@theqtcompany.com>
Mon, 15 Jun 2015 10:34:01 +0000 (10:34 +0000)
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>
src/macdeployqt/shared/shared.cpp

index 647b09f..e2c4a19 100644 (file)
@@ -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;
 }