summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Johan Sorvig <morten.sorvig@digia.com>2012-12-10 11:29:54 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-12 01:26:23 +0100
commit968b11737564572ef5939400ed70f281556d167b (patch)
treed2ae300d1c8eb008481e82ca2f934a3b4f7ef564
parent4955cd8539dd23ad568daa1dad004677078d15c9 (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.pro1
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp21
-rw-r--r--src/corelib/plugin/qlibrary.cpp2
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro7
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)