Fix detection of default platform plugin.
authorGirish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
Wed, 18 Apr 2012 22:57:00 +0000 (15:57 -0700)
committerQt by Nokia <qt-info@nokia.com>
Thu, 19 Apr 2012 14:40:29 +0000 (16:40 +0200)
Let configure generate the QT_QPA_DEFAULT_PLATFORM_NAME in
qconfig.h. This allows us to override the platform name
using a configure argument.

This commit adds -qpa <platform> that lets the user specify
the default platform at configure time. Note that the default
platform is not checked against the tree since plugins are
allowed to exist outside the Qt source tree.

In the absence of -qpa argument, configure checks the mkspec
for a variable named QT_QPA_DEFAULT_PLATFORM. This check is
implemented only in the unix configure because it will be primarily
used in custom mkspecs (devices, boards).

If -qpa argument is absent and the mkspec variable is absent,
the default value is determined based on the OS as below:
    Unix - "xcb"
    Windows - "windows"
    Mac - "cocoa"
    QNX - "qnx"

Done-with: Jørgen Lind

Change-Id: I0df31811a1b901a3242bfada1232e596ebda04f4
Reviewed-by: Donald Carr <donald.carr@nokia.com>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
configure
src/gui/kernel/qguiapplication.cpp
tools/configure/configureapp.cpp

index c7ea66d..b4b57c6 100755 (executable)
--- a/configure
+++ b/configure
@@ -818,6 +818,9 @@ QT_LIBS_GLIB=
 QT_CFLAGS_GSTREAMER=
 QT_LIBS_GSTREAMER=
 
+# default qpa platform
+QT_QPA_DEFAULT_PLATFORM=
+
 #-------------------------------------------------------------------------------
 # check SQL drivers available in this package
 #-------------------------------------------------------------------------------
@@ -900,7 +903,7 @@ while [ "$#" -gt 0 ]; do
         shift
         VAL=$1
         ;;
-    -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir)
+    -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir|-qpa)
         VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
         shift
         VAL="$1"
@@ -1292,6 +1295,9 @@ while [ "$#" -gt 0 ]; do
         DEV_VAL=`echo $VAL | sed "s,^.*=\(.*\),\1,"`
         DeviceVar set $DEV_VAR $DEV_VAL
         ;;
+    qpa)
+        QT_QPA_DEFAULT_PLATFORM="$VAL"
+        ;;
     debug-and-release)
         if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
             CFG_DEBUG_RELEASE="$VAL"
@@ -3109,6 +3115,8 @@ Additional options:
  $DFBN  -no-directfb ....... Do not compile DirectFB support.
  $DFBY  -directfb .......... Compile DirectFB support.
 
+    -qpa <name> ......... Sets the default QPA platform (e.g xcb, cocoa, windows).
+
     -xplatform target ... The target platform when cross-compiling.
 
     -sysroot <dir> ...... Sets <dir> as the target compiler's and qmake's sysroot.
@@ -4637,6 +4645,21 @@ if [ "$CFG_EGLFS" != "no" ]; then
     fi
 fi
 
+# Determine the default QPA platform
+if [ -z "$QT_QPA_DEFAULT_PLATFORM" ]; then
+    # check the mkspec
+    QT_QPA_DEFAULT_PLATFORM=`getXQMakeConf QT_QPA_DEFAULT_PLATFORM`
+    if [ -z "$QT_QPA_DEFAULT_PLATFORM" ]; then
+        if [ "$BUILD_ON_MAC" = "yes" ]; then
+            QT_QPA_DEFAULT_PLATFORM="cocoa"
+        elif [ "$UNAME_SYSTEM" = "QNX" ]; then
+            QT_QPA_DEFAULT_PLATFORM="qnx"
+        else
+            QT_QPA_DEFAULT_PLATFORM="xcb"
+        fi
+    fi
+fi
+
 if [ -n "$QMAKE_CFLAGS_XCB" ] || [ -n "$QMAKE_LIBS_XCB" ]; then
     QMakeVar set QMAKE_CFLAGS_XCB "$QMAKE_CFLAGS_XCB"
     QMakeVar set QMAKE_LIBS_XCB "$QMAKE_LIBS_XCB"
@@ -5657,6 +5680,8 @@ cat >>"$outpath/src/corelib/global/qconfig.h.new" << EOF
 EOF
 fi
 
+echo "#define QT_QPA_DEFAULT_PLATFORM_NAME \"$QT_QPA_DEFAULT_PLATFORM\"" >>"$outpath/src/corelib/global/qconfig.h.new"
+
 # avoid unecessary rebuilds by copying only if qconfig.h has changed
 if cmp -s "$outpath/src/corelib/global/qconfig.h" "$outpath/src/corelib/global/qconfig.h.new"; then
     rm -f "$outpath/src/corelib/global/qconfig.h.new"
index 6e54b36..fac466b 100644 (file)
@@ -624,33 +624,6 @@ static void init_platform(const QString &pluginArgument, const QString &platform
         }
     }
 
-    if (name.isEmpty()) {
-        const QStringList keys = QPlatformIntegrationFactory::keys(platformPluginPath);
-#if defined(Q_OS_MAC)
-        const QString defaultPlatform = QLatin1String("cocoa");
-#elif defined (Q_OS_WIN)
-        const QString defaultPlatform = QLatin1String("windows");
-#elif defined (Q_OS_QNX)
-        const QString defaultPlatform = QLatin1String("qnx");
-#elif !defined (QT_NO_XCB)
-        const QString defaultPlatform = QLatin1String("xcb");
-#elif !defined (QT_NO_WAYLAND)
-        const QString defaultPlatform = QLatin1String("wayland");
-#elif !defined (QT_NO_EGLFS)
-        const QString defaultPlatform = QLatin1String("eglfs");
-#else
-        const QString defaultPlatform = QLatin1String("minimal");
-#endif
-        if (keys.contains(defaultPlatform)) {
-            qWarning("No platform plugin argument was specified, defaulting to \"%s\".",
-                     qPrintable(defaultPlatform));
-            name = defaultPlatform;
-        } else {
-            qFatal("No platform plugin argument was specified and the default plugin \"%s\" is not available",
-                   qPrintable(defaultPlatform));
-        }
-    }
-
    // Create the platform integration.
     QGuiApplicationPrivate::platform_integration = QPlatformIntegrationFactory::create(name, platformPluginPath);
     if (QGuiApplicationPrivate::platform_integration) {
index 23b19ec..27b4fab 100644 (file)
@@ -2859,6 +2859,8 @@ void Configure::generateConfigfiles()
         if (dictionary[ "QT_SXE" ] == "no")
           tmpStream<<"#define QT_NO_SXE"<<endl;
 
+        tmpStream<<"#define QT_QPA_DEFAULT_PLATFORM_NAME \"windows\""<<endl;
+
         tmpStream.flush();
         tmpFile.flush();