From d9cafeb0f1a097997a82aeb2e5cccac1d24750cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@digia.com>
Date: Wed, 24 Sep 2014 23:12:45 +0200
Subject: [PATCH] Work around legacy framework structures.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Existing versions of qmake produce application bundles
which are incompatible with OS X code signing.

Deploy framework Info.plist files to the correct
location. Patch them to remove any "_debug" suffix
on the value for CFBundleExecutable.

Task-number: QTBUG-32896
Change-Id: Id657e394f3bf919713a43e395e716bf46488c644
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
---
 src/macdeployqt/shared/shared.cpp | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/macdeployqt/shared/shared.cpp b/src/macdeployqt/shared/shared.cpp
index c31bc7fe3..3e581a9db 100644
--- a/src/macdeployqt/shared/shared.cpp
+++ b/src/macdeployqt/shared/shared.cpp
@@ -154,6 +154,19 @@ bool linkFilePrintStatus(const QString &file, const QString &link)
     }
 }
 
+void patch_debugInInfoPlist(const QString &infoPlistPath)
+{
+    // Older versions of qmake may have the "_debug" binary as
+    // the value for CFBundleExecutable. Remove it.
+    QFile infoPlist(infoPlistPath);
+    infoPlist.open(QIODevice::ReadOnly);
+    QByteArray contents = infoPlist.readAll();
+    infoPlist.close();
+    infoPlist.open(QIODevice::WriteOnly | QIODevice::Truncate);
+    contents.replace("_debug", ""); // surely there are no legit uses of "_debug" in an Info.plist
+    infoPlist.write(contents);
+}
+
 FrameworkInfo parseOtoolLibraryLine(const QString &line, bool useDebugLibs)
 {
     FrameworkInfo info;
@@ -525,6 +538,14 @@ QString copyFramework(const FrameworkInfo &framework, const QString path)
     linkFilePrintStatus("Versions/Current/Resources", frameworkDestinationDirectory + "/Resources");
     linkFilePrintStatus(framework.version, frameworkDestinationDirectory + "/Versions/Current");
 
+    // Correct Info.plist location for frameworks produced by older versions of qmake
+    // Contents/Info.plist should be Versions/5/Resources/Info.plist
+    const QString legacyInfoPlistPath = framework.frameworkPath + "/Contents/Info.plist";
+    const QString correctInfoPlistPath = frameworkDestinationDirectory + "/Resources/Info.plist";
+    if (QFile(legacyInfoPlistPath).exists()) {
+        copyFilePrintStatus(legacyInfoPlistPath, correctInfoPlistPath);
+        patch_debugInInfoPlist(correctInfoPlistPath);
+    }
     return frameworkDestinationBinaryPath;
 }
 
-- 
GitLab