From d9cafeb0f1a097997a82aeb2e5cccac1d24750cc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Morten=20Johan=20S=C3=B8rvig?= 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=utf8 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 --- 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 c31bc7f..3e581a9 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; } -- 2.7.4