diff options
author | Morten Johan Sorvig <morten.sorvig@digia.com> | 2012-12-10 11:29:54 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-12-12 01:26:23 +0100 |
commit | 968b11737564572ef5939400ed70f281556d167b (patch) | |
tree | d2ae300d1c8eb008481e82ca2f934a3b4f7ef564 | |
parent | 4955cd8539dd23ad568daa1dad004677078d15c9 (diff) |
Improve Cocoa platform plugin loading.
Loading both the debug and release version of the cocoa
plugins causes the objective-c runtime to print "duplicate
class definitions" warnings.
Fix this by directing the plugin loader to only load
one of the cocoa plugins if both are available. Implement
this as a special case directly in QFactoryLoader.
Define QT_NO_DEBUG_PLUGIN_CHECK to allow mixing
debug and release builds.
Task-number: QTBUG-28155
Change-Id: Ie1927b219cc501a821f91b7e4b56f0589e0acbf5
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/corelib.pro | 1 | ||||
-rw-r--r-- | src/corelib/plugin/qfactoryloader.cpp | 21 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 2 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/cocoa.pro | 7 |
4 files changed, 22 insertions, 9 deletions
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 1059d0defe..f95ee545c0 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -41,7 +41,6 @@ mac|darwin { } LIBS_PRIVATE += -framework CoreFoundation } -mac:lib_bundle:DEFINES += QT_NO_DEBUG_PLUGIN_CHECK win32:DEFINES-=QT_NO_CAST_TO_ASCII DEFINES += $$MODULE_DEFINES diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index 75652b0902..aeb78e88b4 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -126,9 +126,30 @@ void QFactoryLoader::update() QStringList plugins = QDir(path).entryList(QDir::Files); QLibraryPrivate *library = 0; + +#ifdef Q_OS_MAC + // Loading both the debug and release version of the cocoa plugins causes the objective-c runtime + // to print "duplicate class definitions" warnings. Detect if QFactoryLoader is about to load both, + // skip one of them (below). + // + // ### FIXME find a proper solution + // + const bool isLoadingDebugAndReleaseCocoa = plugins.contains("libqcocoa_debug.dylib") && plugins.contains("libqcocoa.dylib"); +#endif for (int j = 0; j < plugins.count(); ++j) { QString fileName = QDir::cleanPath(path + QLatin1Char('/') + plugins.at(j)); +#ifdef Q_OS_MAC + if (isLoadingDebugAndReleaseCocoa) { +#ifdef QT_DEBUG + if (fileName.contains(QStringLiteral("libqcocoa.dylib"))) + continue; // Skip release plugin in debug mode +#else + if (fileName.contains(QStringLiteral("libqcocoa_debug.dylib"))) + continue; // Skip debug plugin in release mode +#endif + } +#endif if (qt_debug_component()) { qDebug() << "QFactoryLoader::QFactoryLoader() looking at" << fileName; } diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 26692ca3d4..8d2e890d87 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -73,7 +73,7 @@ QT_BEGIN_NAMESPACE # define QLIBRARY_AS_DEBUG true #endif -#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) +#if defined(Q_OS_UNIX) // We don't use separate debug and release libs on UNIX, so we want // to allow loading plugins, regardless of how they were built. # define QT_NO_DEBUG_PLUGIN_CHECK diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro index 5533650809..85e3f0007c 100644 --- a/src/plugins/platforms/cocoa/cocoa.pro +++ b/src/plugins/platforms/cocoa/cocoa.pro @@ -98,13 +98,6 @@ QT += core-private gui-private platformsupport-private OTHER_FILES += cocoa.json -# Build the release libqcocoa.dylib only, skip the debug version. -# The Qt plugin loader will dlopen both if found, causing duplicate -# Objective-c class definitions for the classes defined in the plugin. -contains(QT_CONFIG,release):CONFIG -= debug -contains(QT_CONFIG,debug_and_release):CONFIG -= debug_and_release -contains(QT_CONFIG,build_all):CONFIG -= build_all - # Acccessibility debug support # DEFINES += QT_COCOA_ENABLE_ACCESSIBILITY_INSPECTOR # include ($$PWD/../../../../util/accessibilityinspector/accessibilityinspector.pri) |