probonopd
8 years ago
9 changed files with 2161 additions and 0 deletions
@ -0,0 +1,4 @@ |
|||
SOURCES += main.cpp ../shared/shared.cpp |
|||
LIBS += -framework CoreFoundation |
|||
|
|||
load(qt_app) |
@ -0,0 +1,63 @@ |
|||
/****************************************************************************
|
|||
** |
|||
** Copyright (C) 2016 The Qt Company Ltd. |
|||
** Contact: https://www.qt.io/licensing/
|
|||
** |
|||
** This file is part of the tools applications of the Qt Toolkit. |
|||
** |
|||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
|||
** Commercial License Usage |
|||
** Licensees holding valid commercial Qt licenses may use this file in |
|||
** accordance with the commercial license agreement provided with the |
|||
** Software or, alternatively, in accordance with the terms contained in |
|||
** a written agreement between you and The Qt Company. For licensing terms |
|||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|||
** information use the contact form at https://www.qt.io/contact-us.
|
|||
** |
|||
** GNU General Public License Usage |
|||
** Alternatively, this file may be used under the terms of the GNU |
|||
** General Public License version 3 as published by the Free Software |
|||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
|||
** included in the packaging of this file. Please review the following |
|||
** information to ensure the GNU General Public License requirements will |
|||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|||
** |
|||
** $QT_END_LICENSE$ |
|||
** |
|||
****************************************************************************/ |
|||
#include "../shared/shared.h" |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
// useDebugLibs should always be false because even if set all Qt
|
|||
// libraries inside a binary to point to debug versions, as soon as
|
|||
// one of them loads a Qt plugin, the plugin itself will load the
|
|||
// release version of Qt, and as such, the app will crash.
|
|||
bool useDebugLibs = false; |
|||
|
|||
int optionsSpecified = 0; |
|||
for (int i = 2; i < argc; ++i) { |
|||
QByteArray argument = QByteArray(argv[i]); |
|||
if (argument.startsWith(QByteArray("-verbose="))) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
optionsSpecified++; |
|||
int index = argument.indexOf("="); |
|||
bool ok = false; |
|||
int number = argument.mid(index+1).toInt(&ok); |
|||
if (!ok) |
|||
LogError() << "Could not parse verbose level"; |
|||
else |
|||
logLevel = number; |
|||
} |
|||
} |
|||
|
|||
if (argc != (3 + optionsSpecified)) { |
|||
qDebug() << "Changeqt: changes which Qt frameworks an application links against."; |
|||
qDebug() << "Usage: changeqt app-bundle qt-dir <-verbose=[0-3]>"; |
|||
return 0; |
|||
} |
|||
|
|||
const QString appPath = QString::fromLocal8Bit(argv[1]); |
|||
const QString qtPath = QString::fromLocal8Bit(argv[2]); |
|||
changeQtFrameworks(appPath, qtPath, useDebugLibs); |
|||
} |
@ -0,0 +1,2 @@ |
|||
TEMPLATE = subdirs |
|||
SUBDIRS = macdeployqt macchangeqt |
@ -0,0 +1,4 @@ |
|||
SOURCES += main.cpp ../shared/shared.cpp |
|||
LIBS += -framework CoreFoundation |
|||
|
|||
load(qt_app) |
@ -0,0 +1,215 @@ |
|||
/****************************************************************************
|
|||
** |
|||
** Copyright (C) 2016 The Qt Company Ltd. |
|||
** Contact: https://www.qt.io/licensing/
|
|||
** |
|||
** This file is part of the tools applications of the Qt Toolkit. |
|||
** |
|||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
|||
** Commercial License Usage |
|||
** Licensees holding valid commercial Qt licenses may use this file in |
|||
** accordance with the commercial license agreement provided with the |
|||
** Software or, alternatively, in accordance with the terms contained in |
|||
** a written agreement between you and The Qt Company. For licensing terms |
|||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|||
** information use the contact form at https://www.qt.io/contact-us.
|
|||
** |
|||
** GNU General Public License Usage |
|||
** Alternatively, this file may be used under the terms of the GNU |
|||
** General Public License version 3 as published by the Free Software |
|||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
|||
** included in the packaging of this file. Please review the following |
|||
** information to ensure the GNU General Public License requirements will |
|||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|||
** |
|||
** $QT_END_LICENSE$ |
|||
** |
|||
****************************************************************************/ |
|||
#include <QCoreApplication> |
|||
#include <QDir> |
|||
|
|||
#include "../shared/shared.h" |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
QCoreApplication app(argc, argv); |
|||
|
|||
QString appBundlePath; |
|||
if (argc > 1) |
|||
appBundlePath = QString::fromLocal8Bit(argv[1]); |
|||
|
|||
if (argc < 2 || appBundlePath.startsWith("-")) { |
|||
qDebug() << "Usage: macdeployqt app-bundle [options]"; |
|||
qDebug() << ""; |
|||
qDebug() << "Options:"; |
|||
qDebug() << " -verbose=<0-3> : 0 = no output, 1 = error/warning (default), 2 = normal, 3 = debug"; |
|||
qDebug() << " -no-plugins : Skip plugin deployment"; |
|||
qDebug() << " -dmg : Create a .dmg disk image"; |
|||
qDebug() << " -no-strip : Don't run 'strip' on the binaries"; |
|||
qDebug() << " -use-debug-libs : Deploy with debug versions of frameworks and plugins (implies -no-strip)"; |
|||
qDebug() << " -executable=<path> : Let the given executable use the deployed frameworks too"; |
|||
qDebug() << " -qmldir=<path> : Scan for QML imports in the given path"; |
|||
qDebug() << " -always-overwrite : Copy files even if the target file exists"; |
|||
qDebug() << " -codesign=<ident> : Run codesign with the given identity on all executables"; |
|||
qDebug() << " -appstore-compliant: Skip deployment of components that use private API"; |
|||
qDebug() << " -libpath=<path> : Add the given path to the library search path"; |
|||
qDebug() << ""; |
|||
qDebug() << "macdeployqt takes an application bundle as input and makes it"; |
|||
qDebug() << "self-contained by copying in the Qt frameworks and plugins that"; |
|||
qDebug() << "the application uses."; |
|||
qDebug() << ""; |
|||
qDebug() << "Plugins related to a framework are copied in with the"; |
|||
qDebug() << "framework. The accessibility, image formats, and text codec"; |
|||
qDebug() << "plugins are always copied, unless \"-no-plugins\" is specified."; |
|||
qDebug() << ""; |
|||
qDebug() << "Qt plugins may use private API and will cause the app to be"; |
|||
qDebug() << "rejected from the Mac App store. MacDeployQt will print a warning"; |
|||
qDebug() << "when known incompatible plugins are deployed. Use -appstore-compliant "; |
|||
qDebug() << "to skip these plugins. Currently two SQL plugins are known to"; |
|||
qDebug() << "be incompatible: qsqlodbc and qsqlpsql."; |
|||
qDebug() << ""; |
|||
qDebug() << "See the \"Deploying Applications on OS X\" topic in the"; |
|||
qDebug() << "documentation for more information about deployment on OS X."; |
|||
|
|||
return 1; |
|||
} |
|||
|
|||
appBundlePath = QDir::cleanPath(appBundlePath); |
|||
|
|||
if (QDir().exists(appBundlePath) == false) { |
|||
qDebug() << "Error: Could not find app bundle" << appBundlePath; |
|||
return 1; |
|||
} |
|||
|
|||
bool plugins = true; |
|||
bool dmg = false; |
|||
bool useDebugLibs = false; |
|||
extern bool runStripEnabled; |
|||
extern bool alwaysOwerwriteEnabled; |
|||
extern QStringList librarySearchPath; |
|||
QStringList additionalExecutables; |
|||
bool qmldirArgumentUsed = false; |
|||
QStringList qmlDirs; |
|||
extern bool runCodesign; |
|||
extern QString codesignIdentiy; |
|||
extern bool appstoreCompliant; |
|||
extern bool deployFramework; |
|||
|
|||
for (int i = 2; i < argc; ++i) { |
|||
QByteArray argument = QByteArray(argv[i]); |
|||
if (argument == QByteArray("-no-plugins")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
plugins = false; |
|||
} else if (argument == QByteArray("-dmg")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
dmg = true; |
|||
} else if (argument == QByteArray("-no-strip")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
runStripEnabled = false; |
|||
} else if (argument == QByteArray("-use-debug-libs")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
useDebugLibs = true; |
|||
runStripEnabled = false; |
|||
} else if (argument.startsWith(QByteArray("-verbose"))) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
int index = argument.indexOf("="); |
|||
bool ok = false; |
|||
int number = argument.mid(index+1).toInt(&ok); |
|||
if (!ok) |
|||
LogError() << "Could not parse verbose level"; |
|||
else |
|||
logLevel = number; |
|||
} else if (argument.startsWith(QByteArray("-executable"))) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
int index = argument.indexOf('='); |
|||
if (index == -1) |
|||
LogError() << "Missing executable path"; |
|||
else |
|||
additionalExecutables << argument.mid(index+1); |
|||
} else if (argument.startsWith(QByteArray("-qmldir"))) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
qmldirArgumentUsed = true; |
|||
int index = argument.indexOf('='); |
|||
if (index == -1) |
|||
LogError() << "Missing qml directory path"; |
|||
else |
|||
qmlDirs << argument.mid(index+1); |
|||
} else if (argument.startsWith(QByteArray("-libpath"))) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
int index = argument.indexOf('='); |
|||
if (index == -1) |
|||
LogError() << "Missing library search path"; |
|||
else |
|||
librarySearchPath << argument.mid(index+1); |
|||
} else if (argument == QByteArray("-always-overwrite")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
alwaysOwerwriteEnabled = true; |
|||
} else if (argument.startsWith(QByteArray("-codesign"))) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
int index = argument.indexOf("="); |
|||
if (index < 0 || index >= argument.size()) { |
|||
LogError() << "Missing code signing identity"; |
|||
} else { |
|||
runCodesign = true; |
|||
codesignIdentiy = argument.mid(index+1); |
|||
} |
|||
} else if (argument == QByteArray("-appstore-compliant")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
appstoreCompliant = true; |
|||
|
|||
// Undocumented option, may not work as intented
|
|||
} else if (argument == QByteArray("-deploy-framework")) { |
|||
LogDebug() << "Argument found:" << argument; |
|||
deployFramework = true; |
|||
|
|||
} else if (argument.startsWith("-")) { |
|||
LogError() << "Unknown argument" << argument << "\n"; |
|||
return 1; |
|||
} |
|||
} |
|||
|
|||
DeploymentInfo deploymentInfo = deployQtFrameworks(appBundlePath, additionalExecutables, useDebugLibs); |
|||
|
|||
if (deployFramework && deploymentInfo.isFramework) |
|||
fixupFramework(appBundlePath); |
|||
|
|||
// Convenience: Look for .qml files in the current directoty if no -qmldir specified.
|
|||
if (qmlDirs.isEmpty()) { |
|||
QDir dir; |
|||
if (!dir.entryList(QStringList() << QStringLiteral("*.qml")).isEmpty()) { |
|||
qmlDirs += QStringLiteral("."); |
|||
} |
|||
} |
|||
|
|||
if (!qmlDirs.isEmpty()) { |
|||
bool ok = deployQmlImports(appBundlePath, deploymentInfo, qmlDirs); |
|||
if (!ok && qmldirArgumentUsed) |
|||
return 1; // exit if the user explicitly asked for qml import deployment
|
|||
|
|||
// Update deploymentInfo.deployedFrameworks - the QML imports
|
|||
// may have brought in extra frameworks as dependencies.
|
|||
deploymentInfo.deployedFrameworks += findAppFrameworkNames(appBundlePath); |
|||
deploymentInfo.deployedFrameworks = deploymentInfo.deployedFrameworks.toSet().toList(); |
|||
} |
|||
|
|||
if (plugins && !deploymentInfo.qtPath.isEmpty()) { |
|||
deploymentInfo.pluginPath = deploymentInfo.qtPath + "/plugins"; |
|||
LogNormal(); |
|||
deployPlugins(appBundlePath, deploymentInfo, useDebugLibs); |
|||
createQtConf(appBundlePath); |
|||
} |
|||
|
|||
if (runStripEnabled) |
|||
stripAppBinary(appBundlePath); |
|||
|
|||
if (runCodesign) |
|||
codesign(codesignIdentiy, appBundlePath); |
|||
|
|||
if (dmg) { |
|||
LogNormal(); |
|||
createDiskImage(appBundlePath); |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
File diff suppressed because it is too large
@ -0,0 +1,136 @@ |
|||
/****************************************************************************
|
|||
** |
|||
** Copyright (C) 2016 The Qt Company Ltd. |
|||
** Contact: https://www.qt.io/licensing/
|
|||
** |
|||
** This file is part of the tools applications of the Qt Toolkit. |
|||
** |
|||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
|||
** Commercial License Usage |
|||
** Licensees holding valid commercial Qt licenses may use this file in |
|||
** accordance with the commercial license agreement provided with the |
|||
** Software or, alternatively, in accordance with the terms contained in |
|||
** a written agreement between you and The Qt Company. For licensing terms |
|||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|||
** information use the contact form at https://www.qt.io/contact-us.
|
|||
** |
|||
** GNU General Public License Usage |
|||
** Alternatively, this file may be used under the terms of the GNU |
|||
** General Public License version 3 as published by the Free Software |
|||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
|||
** included in the packaging of this file. Please review the following |
|||
** information to ensure the GNU General Public License requirements will |
|||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|||
** |
|||
** $QT_END_LICENSE$ |
|||
** |
|||
****************************************************************************/ |
|||
#ifndef MAC_DEPLOMYMENT_SHARED_H |
|||
#define MAC_DEPLOMYMENT_SHARED_H |
|||
|
|||
#include <QString> |
|||
#include <QStringList> |
|||
#include <QDebug> |
|||
#include <QSet> |
|||
#include <QVersionNumber> |
|||
|
|||
extern int logLevel; |
|||
#define LogError() if (logLevel < 0) {} else qDebug() << "ERROR:" |
|||
#define LogWarning() if (logLevel < 1) {} else qDebug() << "WARNING:" |
|||
#define LogNormal() if (logLevel < 2) {} else qDebug() << "Log:" |
|||
#define LogDebug() if (logLevel < 3) {} else qDebug() << "Log:" |
|||
|
|||
extern bool runStripEnabled; |
|||
|
|||
class FrameworkInfo |
|||
{ |
|||
public: |
|||
bool isDylib; |
|||
QString frameworkDirectory; |
|||
QString frameworkName; |
|||
QString frameworkPath; |
|||
QString binaryDirectory; |
|||
QString binaryName; |
|||
QString binaryPath; |
|||
QString rpathUsed; |
|||
QString version; |
|||
QString installName; |
|||
QString deployedInstallName; |
|||
QString sourceFilePath; |
|||
QString frameworkDestinationDirectory; |
|||
QString binaryDestinationDirectory; |
|||
}; |
|||
|
|||
class DylibInfo |
|||
{ |
|||
public: |
|||
QString binaryPath; |
|||
QVersionNumber currentVersion; |
|||
QVersionNumber compatibilityVersion; |
|||
}; |
|||
|
|||
class OtoolInfo |
|||
{ |
|||
public: |
|||
QString installName; |
|||
QString binaryPath; |
|||
QVersionNumber currentVersion; |
|||
QVersionNumber compatibilityVersion; |
|||
QList<DylibInfo> dependencies; |
|||
}; |
|||
|
|||
bool operator==(const FrameworkInfo &a, const FrameworkInfo &b); |
|||
QDebug operator<<(QDebug debug, const FrameworkInfo &info); |
|||
|
|||
class ApplicationBundleInfo |
|||
{ |
|||
public: |
|||
QString path; |
|||
QString binaryPath; |
|||
QStringList libraryPaths; |
|||
}; |
|||
|
|||
class DeploymentInfo |
|||
{ |
|||
public: |
|||
QString qtPath; |
|||
QString pluginPath; |
|||
QStringList deployedFrameworks; |
|||
QSet<QString> rpathsUsed; |
|||
bool useLoaderPath; |
|||
bool isFramework; |
|||
}; |
|||
|
|||
inline QDebug operator<<(QDebug debug, const ApplicationBundleInfo &info); |
|||
|
|||
void changeQtFrameworks(const QString appPath, const QString &qtPath, bool useDebugLibs); |
|||
void changeQtFrameworks(const QList<FrameworkInfo> frameworks, const QStringList &binaryPaths, const QString &qtPath); |
|||
|
|||
OtoolInfo findDependencyInfo(const QString &binaryPath); |
|||
FrameworkInfo parseOtoolLibraryLine(const QString &line, const QString &appBundlePath, const QSet<QString> &rpaths, bool useDebugLibs); |
|||
QString findAppBinary(const QString &appBundlePath); |
|||
QList<FrameworkInfo> getQtFrameworks(const QString &path, const QString &appBundlePath, const QSet<QString> &rpaths, bool useDebugLibs); |
|||
QList<FrameworkInfo> getQtFrameworks(const QStringList &otoolLines, const QString &appBundlePath, const QSet<QString> &rpaths, bool useDebugLibs); |
|||
QString copyFramework(const FrameworkInfo &framework, const QString path); |
|||
DeploymentInfo deployQtFrameworks(const QString &appBundlePath, const QStringList &additionalExecutables, bool useDebugLibs); |
|||
DeploymentInfo deployQtFrameworks(QList<FrameworkInfo> frameworks,const QString &bundlePath, const QStringList &binaryPaths, bool useDebugLibs, bool useLoaderPath); |
|||
void createQtConf(const QString &appBundlePath); |
|||
void deployPlugins(const QString &appBundlePath, DeploymentInfo deploymentInfo, bool useDebugLibs); |
|||
bool deployQmlImports(const QString &appBundlePath, DeploymentInfo deploymentInfo, QStringList &qmlDirs); |
|||
void changeIdentification(const QString &id, const QString &binaryPath); |
|||
void changeInstallName(const QString &oldName, const QString &newName, const QString &binaryPath); |
|||
void runStrip(const QString &binaryPath); |
|||
void stripAppBinary(const QString &bundlePath); |
|||
QString findAppBinary(const QString &appBundlePath); |
|||
QStringList findAppFrameworkNames(const QString &appBundlePath); |
|||
QStringList findAppFrameworkPaths(const QString &appBundlePath); |
|||
void codesignFile(const QString &identity, const QString &filePath); |
|||
QSet<QString> codesignBundle(const QString &identity, |
|||
const QString &appBundlePath, |
|||
QList<QString> additionalBinariesContainingRpaths); |
|||
void codesign(const QString &identity, const QString &appBundlePath); |
|||
void createDiskImage(const QString &appBundlePath); |
|||
void fixupFramework(const QString &appBundlePath); |
|||
|
|||
|
|||
#endif |
@ -0,0 +1,7 @@ |
|||
TEMPLATE = app |
|||
INCLUDEPATH += . ../shared/ |
|||
TARGET=tst_deployment_mac |
|||
CONFIG += qtestlib |
|||
|
|||
SOURCES += tst_deployment_mac.cpp ../shared/shared.cpp |
|||
HEADERS += ../shared/shared.h |
@ -0,0 +1,220 @@ |
|||
/****************************************************************************
|
|||
** |
|||
** Copyright (C) 2016 The Qt Company Ltd. |
|||
** Contact: https://www.qt.io/licensing/
|
|||
** |
|||
** This file is part of the tools applications of the Qt Toolkit. |
|||
** |
|||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
|||
** Commercial License Usage |
|||
** Licensees holding valid commercial Qt licenses may use this file in |
|||
** accordance with the commercial license agreement provided with the |
|||
** Software or, alternatively, in accordance with the terms contained in |
|||
** a written agreement between you and The Qt Company. For licensing terms |
|||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|||
** information use the contact form at https://www.qt.io/contact-us.
|
|||
** |
|||
** GNU General Public License Usage |
|||
** Alternatively, this file may be used under the terms of the GNU |
|||
** General Public License version 3 as published by the Free Software |
|||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
|||
** included in the packaging of this file. Please review the following |
|||
** information to ensure the GNU General Public License requirements will |
|||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|||
** |
|||
** $QT_END_LICENSE$ |
|||
** |
|||
****************************************************************************/ |
|||
#include <QtCore> |
|||
#include <QtTest/QTest> |
|||
#include <shared.h> |
|||
|
|||
class tst_deployment_mac : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
private slots: |
|||
void testParseOtoolLibraryLine(); |
|||
void testgetQtFrameworks(); |
|||
void testFindAppBinarty(); |
|||
}; |
|||
|
|||
void tst_deployment_mac::testParseOtoolLibraryLine() |
|||
{ |
|||
{ |
|||
QString line = " /Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.4.0, current version 4.4.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/Users/foo/build/qt-4.4/lib/")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("QtGui.framework")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/Users/foo/build/qt-4.4/lib/QtGui.framework")); |
|||
QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4")); |
|||
QCOMPARE(info.binaryName, QLatin1String("QtGui")); |
|||
QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/QtGui")); |
|||
QCOMPARE(info.version, QLatin1String("4")); |
|||
QCOMPARE(info.installName, QLatin1String("/Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/QtGui.framework/Versions/4")); |
|||
} |
|||
{ |
|||
QString line = " /Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon (compatibility version 4.1.0, current version 4.1.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/Users/foo/build/qt-4.4/lib/")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("phonon.framework")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/Users/foo/build/qt-4.4/lib/phonon.framework")); |
|||
QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4")); |
|||
QCOMPARE(info.binaryName, QLatin1String("phonon")); |
|||
QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/phonon")); |
|||
QCOMPARE(info.version, QLatin1String("4")); |
|||
QCOMPARE(info.installName, QLatin1String("/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/phonon.framework/Versions/4")); |
|||
} |
|||
|
|||
{ |
|||
QString line = " /usr/local/Qt-4.4.0/lib/phonon.framework/Versions/4/phonon (compatibility version 4.1.0, current version 4.1.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/usr/local/Qt-4.4.0/lib/")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("phonon.framework")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/usr/local/Qt-4.4.0/lib/phonon.framework")); |
|||
QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4")); |
|||
QCOMPARE(info.binaryName, QLatin1String("phonon")); |
|||
QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/phonon")); |
|||
QCOMPARE(info.version, QLatin1String("4")); |
|||
QCOMPARE(info.installName, QLatin1String("/usr/local/Qt-4.4.0/lib/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/usr/local/Qt-4.4.0/lib/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/phonon.framework/Versions/4")); |
|||
} |
|||
|
|||
{ |
|||
QString line = " QtGui.framework/Versions/4/QtGui (compatibility version 4.1.0, current version 4.1.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/Library/Frameworks/")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("QtGui.framework")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/Library/Frameworks/QtGui.framework")); |
|||
QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4")); |
|||
QCOMPARE(info.binaryName, QLatin1String("QtGui")); |
|||
QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/QtGui")); |
|||
QCOMPARE(info.version, QLatin1String("4")); |
|||
QCOMPARE(info.installName, QLatin1String("QtGui.framework/Versions/4/QtGui")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/Library/Frameworks/QtGui.framework/Versions/4/QtGui")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/QtGui.framework/Versions/4")); |
|||
} |
|||
|
|||
{ |
|||
QString line = " phonon.framework/Versions/4/QtGui (compatibility version 4.1.0, current version 4.1.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/Library/Frameworks/")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("phonon.framework")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/Library/Frameworks/phonon.framework")); |
|||
QCOMPARE(info.binaryDirectory, QLatin1String("Versions/4")); |
|||
QCOMPARE(info.binaryName, QLatin1String("phonon")); |
|||
QCOMPARE(info.binaryPath, QLatin1String("/Versions/4/phonon")); |
|||
QCOMPARE(info.version, QLatin1String("4")); |
|||
QCOMPARE(info.installName, QLatin1String("phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/Library/Frameworks/phonon.framework/Versions/4/phonon")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/phonon.framework/Versions/4")); |
|||
} |
|||
|
|||
{ |
|||
QString line = " /Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib (compatibility version 4.4.0, current version 4.4.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/Users/foo/build/qt-4.4/lib/")); |
|||
QCOMPARE(info.binaryName, QLatin1String("libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.installName, QLatin1String("/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/Users/foo/build/qt-4.4/lib/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/")); |
|||
} |
|||
{ |
|||
QString line = "libQtCLucene.4.dylib (compatibility version 4.4.0, current version 4.4.0)"; |
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
// qDebug() << info;
|
|||
QCOMPARE(info.frameworkDirectory, QLatin1String("/usr/lib/")); |
|||
QCOMPARE(info.binaryName, QLatin1String("libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.frameworkName, QLatin1String("libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.frameworkPath, QLatin1String("/usr/lib/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.installName, QLatin1String("libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.deployedInstallName, QLatin1String("@executable_path/../Frameworks/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.sourceFilePath, QLatin1String("/usr/lib/libQtCLucene.4.dylib")); |
|||
QCOMPARE(info.destinationDirectory, QLatin1String("Contents/Frameworks/")); |
|||
} |
|||
{ |
|||
QString line = "/foo"; //invalid
|
|||
FrameworkInfo info = parseOtoolLibraryLine(line, false); |
|||
QCOMPARE(info.frameworkName, QString()); |
|||
} |
|||
|
|||
} |
|||
|
|||
void tst_deployment_mac::testgetQtFrameworks() |
|||
{ |
|||
{ |
|||
QStringList otool = QStringList() |
|||
<< "/Users/foo/build/qt-4.4/lib/phonon.framework/Versions/4/phonon (compatibility version 4.1.0, current version 4.1.0)" |
|||
<< "/Users/foo/build/qt-4.4/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)" |
|||
<< "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.27.0)" |
|||
<< "/Users/foo/build/qt-4.4/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)" |
|||
<< "/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)" |
|||
<< "/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)" |
|||
<< "/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)" |
|||
<< " " |
|||
; |
|||
|
|||
QList<FrameworkInfo> frameworks = getQtFrameworks(otool, false); |
|||
QCOMPARE(frameworks.count(), 3); |
|||
QCOMPARE(frameworks.at(0).binaryName, QLatin1String("phonon")); |
|||
QCOMPARE(frameworks.at(1).binaryName, QLatin1String("QtGui")); |
|||
QCOMPARE(frameworks.at(2).binaryName, QLatin1String("QtCore")); |
|||
} |
|||
{ |
|||
QStringList otool = QStringList() |
|||
<< "QtHelp.framework/Versions/4/QtHelp (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "libQtCLucene.4.dylib (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "QtSql.framework/Versions/4/QtSql (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "QtXml.framework/Versions/4/QtXml (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "QtGui.framework/Versions/4/QtGui (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 128.0.0)" |
|||
<< "/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 824.42.0)" |
|||
<< "QtNetwork.framework/Versions/4/QtNetwork (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "QtCore.framework/Versions/4/QtCore (compatibility version 4.4.0, current version 4.4.0)" |
|||
<< "/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)" |
|||
<< "/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.6)" |
|||
<< "/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)" |
|||
<< "/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)" |
|||
; |
|||
|
|||
QList<FrameworkInfo> frameworks = getQtFrameworks(otool, false); |
|||
QCOMPARE(frameworks.count(), 7); |
|||
QCOMPARE(frameworks.at(0).binaryName, QLatin1String("QtHelp")); |
|||
QCOMPARE(frameworks.at(1).binaryName, QLatin1String("libQtCLucene.4.dylib")); |
|||
QCOMPARE(frameworks.at(2).binaryName, QLatin1String("QtSql")); |
|||
QCOMPARE(frameworks.at(3).binaryName, QLatin1String("QtXml")); |
|||
QCOMPARE(frameworks.at(4).binaryName, QLatin1String("QtGui")); |
|||
QCOMPARE(frameworks.at(5).binaryName, QLatin1String("QtNetwork")); |
|||
QCOMPARE(frameworks.at(6).binaryName, QLatin1String("QtCore")); |
|||
} |
|||
|
|||
} |
|||
|
|||
void tst_deployment_mac::testFindAppBinarty() |
|||
{ |
|||
QCOMPARE(findAppBinary("tst_deployment_mac.app"), QLatin1String("tst_deployment_mac.app/Contents/MacOS/tst_deployment_mac")); |
|||
} |
|||
|
|||
QTEST_MAIN(tst_deployment_mac) |
|||
|
|||
#include "tst_deployment_mac.moc" |
Loading…
Reference in new issue